CloudWatch에서 EC2 Instance의 Memory 관련 metric은 지원하지 않는다.
Custom Metric은 EC2 Instance의 데이터를 CloudWatch API 호출을 통해 Push 하는 형태.
AWS API는 Rest API, SDK, CLI 여러 방법이 사용 가능하다.
이번 블로깅에서는 CLI를 이용한다. 먼저 AWS Custom Metric 생성 API 사용을 위해서는 CloudWatch Policy가 있는 Access&Secret 권한 혹은 Role이 필요하다.
CloudWatch Full 권한을 갖고 있는 Policy를 생성한다. 해당 권한을 User(Access&Secret Key) 혹은 Role에 매핑한다.
테스트는 해당 Role을 갖춘 EC2 Instance 다.
먼저, aws cloudwatch describe-alarms 을 통해 API 인증 유무를 확인한다.
Role을 통해 API를 호출하기 때문에 Region 정보가 누락 되었다. aws configure 명령어를 통해 region name을 기입한다.
그리고 재호출을 하면 정상적으로 해당 정보를 확인할 수 있다.
login as: ec2-user
Authenticating with public key "imported-openssh-key"
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2016.09-release-notes/
[ec2-user@ip-10-0-4-246 ~]$ sudo su -
[root@ip-10-0-4-246 ~]# /usr/bin/aws cloudwatch describe-alarms
You must specify a region. You can also configure your region by running "aws configure".
[root@ip-10-0-4-246 ~]# aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: ap-northeast-2
Default output format [None]: json
[root@ip-10-0-4-246 ~]# /usr/bin/aws cloudwatch describe-alarms
{
"MetricAlarms": [
{
"EvaluationPeriods": 1,
"AlarmArn": "arn:aws:cloudwatch:ap-northeast-2:557652101750:alarm:awsec2-blog-autoscaling-group-CPU-Increase",
...
"ActionsEnabled": true,
"MetricName": "CPUUtilization"
}
]
}
!/bin/bash
export AWS_CONFIG_FILE="/root/.aws/config"
#Get EC2-id
instanceid=$(curl http://169.254.169.254/latest/meta-data/instance-id)
#Get Memory Used
mem_total=$(free -m |grep Mem |awk '{print $2}')
mem_used=$(free -m |grep Mem |awk '{print $3}')
mem_free=$(free -m |grep Mem |awk '{print $4}')
/usr/bin/aws cloudwatch put-metric-data --metric-name MemTotal --namespace $instanceid --value $mem_total --unit Megabytes
/usr/bin/aws cloudwatch put-metric-data --metric-name MemUsed --namespace $instanceid --value $mem_used --unit Megabytes
/usr/bin/aws cloudwatch put-metric-data --metric-name MemFree --namespace $instanceid --value $mem_free --unit Megabytes
#Get Disk Used
disk_num=$(df -h |wc -l)
for((i=2; i<=$disk_num; i++)); do
disk=$(df -h |sed -n $i'p' |awk '{print $1}')
used=$(df -h |sed -n $i'p' |awk '{print $5}' |cut -d '%' -f 1)
/usr/bin/aws cloudwatch put-metric-data --metric-name $disk --namespace $instanceid --value $used --unit Percent
done
chmod +x custom-metric.sh
cron -e
(*/5 * * * * /root/custom-metric.sh)
vim /etc/crontab
(*/5 * * * * root /root/custom-metric.sh)
cron -e와 crontab의 차이가 있다.
cron -e의 경우 AWS Configure에 대한 환경 변수 설정 없이 정상 동작
crontab에 등록할 경우 shell에 AWS Configure 환경 변수(export)가 필요
CLI 호출 우선 순위는 명령줄 직접 입력, 환경 변수, credentials, config, role 순으로 확인한다.
다시 AWS Web Console, CloudWatch를 보면 Custom Metric에 EC2 Instance의 ID를 볼 수 있다.
해당 id를 선택하면 EC2 Instance의 Custom metric인 Disk, memory 사용률 정보를 확인할 수 있다.
(참고)
Amazon에서 제공하는거 같은데 안 해봐서..
EC2 런칭 시 User-Data를 통해 관리하는 게 좋다. (Amazon Linux 기준)
1. EC2가 최초 실행 시 필요한 패키지들을 다운로드하고 실행시킬 수 있는 Script를 작성하고 S3에 저장(init-shell.sh)
2. EC2 설정 시 S3 / CloudWatch Policy가 매핑되어 있는 Role 등록
3. EC2 설정 시 User-Data에 아래 스크립트 입력(s3://'저장버킷네임'/'저장스크립트네임')
#!/bin/bash
yum -y update
aws configure set default.region ap-northeast-2
aws configure set default.output json
aws s3 cp s3://init-shell/init-shell.sh /root/init-shell.sh
chmod +x /root/init-shell.sh
sed -i -e 's/\r$//' /root/init-shell.sh
./root/init-shell.sh
4. init-shell.sh
#!/bin/bash
##package install
yum -y install curl
yum -y install git
yum -y install wget
yum -y install dstat
yum -y install jq
##node install
curl -sL https://rpm.nodesource.com/setup | bash -
yum install -y nodejs
npm install -y aws-sdk
npm install -y express
##CloudWatch Custom Metric
aws s3 cp s3://init-shell/custom-metric.sh /root/custom-metric.sh
chmod +x /root/custom-metric.sh
sed -i -e 's/\r$//' /root/custom-metric.sh
echo '*/5 * * * * root /root/custom-metric.sh' >> /etc/crontab
./root/custom-metric.sh
service crond restart
다른 OS의 경우 AWS CLI부터 구성해야 한다.
'Management > CloudWatch' 카테고리의 다른 글
AWS CloudWatch 알람 생성 스크립트 (0) | 2017.03.10 |
---|---|
AWS CloudWatch Data Point API(PHP, Javascript) (0) | 2016.07.28 |
AWS CloudWatch (0) | 2016.01.08 |