CloudWatch의 사용자 지표에 대해 이해하려면 아래 링크를 먼저 확인
https://aws.amazon.com/ko/premiumsupport/knowledge-center/cloudwatch-custom-metrics/
CloudWatch에서 사용자 지정 지표 생성
정상 조건의 경우 이 변수는 0입니다. 두 조건이 모두 충족되는 상황에서는 값이 1로 설정됩니다. 그런 다음 이러한 파라미터를 중심으로 사용자 지정 경보를 구축하여 시스템에 문제가 있는 상황을 경고합니다.
aws.amazon.com
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/mon-scripts.html
Monitoring Memory and Disk Metrics for Amazon EC2 Linux Instances - Amazon Elastic Compute Cloud
Monitoring Memory and Disk Metrics for Amazon EC2 Linux Instances You can use Amazon CloudWatch to collect metrics and logs from the operating systems for your EC2 instances. CloudWatch Agent You can use the CloudWatch agent to collect both system metrics
docs.aws.amazon.com
이해를 돕기 위해 쉬운 샘플부터 해 봅시다.
- EC2-Instance에 접속 합니다.
#!/bin/bash
die() { status=$1; shift; echo "FATAL: $*"; exit $status; }
EC2_INSTANCE_ID="`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id || die \"wget instance-id has failed: $?\"`"
#입력받은 값을 CloudWatch로 전송하기 위해 변수에 담습니다.
VALUE=$1
aws cloudwatch put-metric-data --metric-name test-metric-justin1 --dimensions Instance=$EC2_INSTANCE_ID --namespace "Custom" --value $VALUE
[접은 글]169.254.169.254는 뭐지???
$chmod -x send_metric_data.sh
$./send_metric_data.sh 98
- 만약 아래와 같은 에러가 나면 기존 region을 지정합니다.
You must specify a region. You can also configure your region by running "aws configure".
$ aws configure set region ap-northeast-2
$./send_metric_data.sh 100
- 방금 날린 값이 CloudWatch에 전송되었는지 확인해 봅시다.
자 그럼, 제대로된 로그를 날려 봅시다. 메모리와 CPU에 대한 로그를 전송할 예정입니다.
1. IAM > 정책 생성
정책명 : CloudWatchLogs
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"cloudwatch:PutMetricData",
"logs:DescribeLogStreams",
"ec2:DescribeTags"
],
"Resource": [
"*"
]
}
]
}
2. IAM > 역할에 정책 연결
3. EC2 인스턴스에 역할 연결
EC2 인스턴스에 역할을 연결할 때는 INSTANCE PROFILE ARN 이름을 찾아 선택해야 합니다.
AWS IAM에 대해 좀 더 알고 싶다면...
IAM 식별자 부연 설명
https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns
- IAM : Identity and Access Management
- ARN : Amazon Resource Name(아마존 리소스 이름)
-
AWS 계정 - 계정 자체:
arn:aws:iam::123456789012:root
-
계정의 IAM 사용자:
arn:aws:iam::123456789012:user/Bob
-
조직 차트를 반영하는 경로를 갖는 다른 사용자:
arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Bob
-
IAM 그룹:
arn:aws:iam::123456789012:group/Developers
-
경로를 포함하는 IAM 그룹:
arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_A/Developers
-
IAM 역할:
arn:aws:iam::123456789012:role/S3Access
-
관리형 정책:
arn:aws:iam::123456789012:policy/ManageCredentialsPermissions
-
EC2 인스턴스와 연결될 수 있는 인스턴스 프로파일:
arn:aws:iam::123456789012:instance-profile/Webserver
-
IAM에서 'Bob'으로 식별되는 연동 사용자:
arn:aws:sts::123456789012:federated-user/Bob
-
역할 세션 이름 'Mary'로 역할 'Accounting-Role'을 수임하는 누군가의 활성 세션:
arn:aws:sts::123456789012:assumed-role/Accounting-Role/Mary
-
사용자 이름 Bob에 할당된 멀티 팩터 인증 디바이스:
arn:aws:iam::123456789012:mfa/Bob
-
서버 인증서
arn:aws:iam::123456789012:server-certificate/ProdServerCert
-
조직 차트를 반영하는 경로를 갖는 서버 인증서:
arn:aws:iam::123456789012:server-certificate/division_abc/subdivision_xyz/ProdServerCert
-
자격 증명 공급자(SAML 및 OIDC):
arn:aws:iam::123456789012:saml-provider/ADFSProvider
arn:aws:iam::123456789012:oidc-provider/GoogleProvider
4. EC2 인스턴스에 아래 작업 진행
/* Perl 모듈 설치 */
sudo yum -y install perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https
/* 모니터링 스크립트 다운로드 */
curl http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip -O
/* 압축해제 */
unzip CloudWatchMonitoringScripts-1.2.1.zip
/* 압축파일 삭제 */
rm CloudWatchMonitoringScripts-1.2.1.zip
/* 압축 해제 후 생성된 폴더로 이동 */
cd aws-scripts-mon
/* cloud watch에 로그 전송
* mem-util : MemoryUtilization %
* mem-used : MemoryUsed MB
* mem-avail : MemoryAvailable MB
* disk-path : diskpath
* disk-space-util : DiskSpaceUtilization %
* disk-space-used : DiskSpaceUsed MB
* disk-space-avail : DiskSpaceAvailable MB
* disk-space-units : Disk Unit setting
* /
$HOME/aws-scripts-mon/mon-put-instance-data.pl --mem-util --mem-used --mem-used-incl-cache-buff --mem-avail --swap-used --disk-path=/ --disk-space-util --disk-space-used --disk-space-avail --disk-space-units=Megabytes
crontab -e
# 주기적으로 cloud watch에 전송 (2분/15분)
*/2 * * * * $HOME/aws-scripts-mon/mon-put-instance-data.pl --mem-util --mem-used --mem-used-incl-cache-buff --mem-avail --swap-used
*/15 * * * * $HOME/aws-scripts-mon/mon-put-instance-data.pl --disk-path=/ --disk-space-util --disk-space-used --disk-space-avail --disk-space-units=Megabytes
/* crontab 재시작 */
sudo /etc/init.d/crond restart
* 명령이 처리되지 않고 아래와 같은 오류 발생 시 아래 명령어로 SHA 라이브러리를 설치한다.
Can't locate Digest/SHA.pm in @INC (@INC contains: /
yum update
yum -y install perl-Digest-SHA.x86_64
5. AWS > Console > CloudWatch Dashboard 생성
위젯추가 > 행 시간별 지표
메모리 지표는 InstanceId 선택, 파일 시스템 용량은
구성 예)
- - 끝 - -
P.S. Perl 핵심 코드 설명
- 아래 쉘명령어로 디스크 사용량, 전체용량, 남은 용량을 알 수 있다.
$ /bin/df -k -l -P /
Filesystem 1024-blocks Used Available Capacity Mounted on
/dev/nvme0n1p1 41217324 9423420 31693656 23% /
###Perl 소스에서 필드에 매핑되는 값#####
# fields[0] = /dev/nvme0n1p1
# felds[1] = 41217324
# felds[2] = 9423420
##########################
- Perl 소스(mon-put-instance-data.pl)에서 아래와 같은 소스를 보면, 쉘 명령에서 받은 결과값을 변수에 할당 후 add_metric 함수를 이용해 전송할 값을 json으로 담는다.
if ($report_disk_space)
{
my @df = `/bin/df -k -l -P $df_path`;
shift @df;
foreach my $line (@df)
{
my @fields = split('\s+', $line);
# Result of df is reported in 1k blocks
my $disk_total = $fields[1] * KILO;
my $disk_used = $fields[2] * KILO;
my $disk_avail = $fields[3] * KILO;
my $fsystem = $fields[0];
my $mount = $fields[5];
if ($report_disk_util) {
my $disk_util = 0;
$disk_util = 100 * $disk_used / $disk_total if ($disk_total > 0);
add_metric('DiskSpaceUtilization', 'Percent', $disk_util, $fsystem, $mount);
}
if ($report_disk_used) {
add_metric('DiskSpaceUsed', $disk_units, $disk_used / $disk_unit_div, $fsystem, $mount);
}
if ($report_disk_avail) {
add_metric('DiskSpaceAvailable', $disk_units, $disk_avail / $disk_unit_div, $fsystem, $mount);
}
}
}
- 담은 Json을 위에서 설치한 CloudWatchClient.pm (https://github.com/instacart/aws-scripts-mon/blob/master/CloudWatchClient.pm) 을 이용하여 전송한다.
my $response = CloudWatchClient::call_json('PutMetricData', \%params, \%opts);
my $code = $response->code;
my $message = $response->message;
'AWS_NCP > EC2' 카테고리의 다른 글
CloudWatch(3/3) 경보를 Lambda 함수로 연결 (0) | 2019.11.19 |
---|---|
CloudWatch(2/3) CloudWatch Slack Monitoring 설정 (0) | 2019.10.31 |
Amazon Linux 기본 설치 (0) | 2019.10.23 |
EC2 서버에 다른 계정 ssh 접속 권한 등록 (0) | 2019.08.19 |
LInux 정해진 시간에 shutdown (0) | 2019.06.11 |