CloudWatch의 사용자 지표에 대해 이해하려면 아래 링크를 먼저 확인
https://aws.amazon.com/ko/premiumsupport/knowledge-center/cloudwatch-custom-metrics/
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/mon-scripts.html
이해를 돕기 위해 쉬운 샘플부터 해 봅시다.
- 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 |