본문 바로가기

Management/CloudWatch

AWS CloudWatch Custom Metric 생성

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 CloudWatch 맞춤형 지표 생성하기 | Amazon Web Services

Amazon CloudWatch는 AWS 클라우드 리소스와 AWS에서 실행되는 어플리케이션을 위한 모니터링 서비스입니다. 게임 개발자나 시스템 운영자가 서비스를 관리하기 위해서는 필수적으로 CloudWatch를 사용해서 여러 서비스나 어플리케이션의 지표(metric)를 확인해야 합니다. CloudWatch는 사용자의 편의를 위해서 전체 AWS 서비스에 대해 총 300개가 넘는 기본(Built-in) 지표를 제공합니다. 예를 들어, EC2나 RDS의 CPU

aws.amazon.com

 

Amazon에서 제공하는거 같은데 안 해봐서..

 

Amazon EC2 Linux 인스턴스의 메모리 및 디스크 메트릭 모니터링 - Amazon Elastic Compute Cloud

Amazon EC2 Linux 인스턴스의 메모리 및 디스크 메트릭 모니터링 Amazon CloudWatch를 사용하여 운영 체제에서 EC2 인스턴스에 대한 지표와 로그를 수집할 수 있습니다. CloudWatch 에이전트 CloudWatch 에이전트를 사용하여 Amazon EC2 인스턴스 및 온프레미스 서버에서 시스템 지표 및 로그 파일을 수집할 수 있습니다. 이 에이전트는 Windows Server와 Linux를 모두 지원하며 CPU당 코어와 같은 하위

docs.aws.amazon.com

 

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