notebook

都内でWEB系エンジニアやってます。

カスタムメトリクスを使ってみる

AWSのCloudwatchで色々な値が見れますが、そんなに多くありません、そこでカスタムメトリクスを使って知りたいデータを計測しましょうっていうお話

なにはともあれ使ってみました

アクセスできるようにする

まず、CloudwatchへEC2からアクセスができるようにする必用があります

方法はいくつかありますが今回はconfigureで入力してしまいます

  • aws configure

aws configure コマンドでアクセスキーなどの設定をします

ユーザー追加時に取得したAccessKey,SecretKeyを入力します

追加時以外には取得できないようなのでどこかに保存するなりして大切に保存しましょう

aws configure
AccessKey:[入力]
SecretKey:[入力]
region:northeast-1
Format:json

scriptの登録

直近のload averageを取得してみます

#!/bin/sh

meta_data='http://169.254.169.254/latest/meta-data'
instance_id=`curl -sS ${meta_data}/instance-id`

la=`uptime | awk -F"[, ]" '{print $16}'`

aws cloudwatch put-metric-data \
  --namespace 'Test' \
  --dimensions InstanceId=${instance_id} \ #dimension [ InstanceId | AutoScalingGroupName | ImageId | InstanceType ]
  --metric-name 'LoadAverage' \
  --value ${la} \
  --unit [ Seconds | Microseconds | Milliseconds | Bytes | Kilobytes | Megabytes | Gigabytes | Terabytes | Bits | Kilobits | Megabits | Gigabits | Terabits | Percent | Count | Bytes/Second | Kilobytes/Second | Megabytes/Second | Gigabytes/Second | Terabytes/Second | Bits/Second | Kilobits/Second | Megabits/Second | Gigabits/Second | Terabits/Second | Count/Second | None ]
  • metaデータの取得

InstanceIDなどは下記ページを参照して取得します

metadata API

169.254.169.254へリクエストを送ることでメタデータを取得できるようです

host名とか、セキュリティグループ名とか結構色々取ってこれる模様

  • cronの設定
*/5 * * * * /usr/local/bin/get_metrics.sh

こんな感じで定期実行しておくだけで計測できるようです

システム依存の指標を使いたい場合とかにも有効ですね

f:id:swfz:20150622210933p:plain

公式スクリプト

既にディスクとかメモリとかそういうのを集めた公式のscriptがあるので同じことやるならそちらを使ったほうが幸せになりますね

Amazon ColoudWatch Monitoring Script for Linux

perlで書かれていていくらかモジュールのインストールが必要でした

インストール後、適当なところに展開して中身を読みつつ実行してみます

中身はこんな感じ

aws-scripts-mon
|-- AwsSignatureV4.pm
|-- CloudWatchClient.pm
|-- LICENSE.txt
|-- NOTICE.txt
|-- awscreds.template
|-- mon-get-instance-stats.pl
`-- mon-put-instance-data.pl

今回、EC2にIAM Roleなどは設定していないのでawscreds.templateにCloudwatchへのアクセスが可能なAccesskey,Secretkeyを記述して実行します

$ yum install -y perl-Sys-Syslog perl-DateTime perl-IO-Compress perl-libwww-perl perl-LWP-Protocol-https perl-URI

$ perl mon-put-instance-data.pl --aws-credential-file=awscreds.template --mem-util
$ perl mon-put-instance-data.pl --aws-credential-file=awscreds.template --disk-space-util --disk-path=/

このスクリプトで作成したメトリクスは下記のように「Linux System Metrics」という感じで選択できるようになる模様

f:id:swfz:20150622210834p:plain

コマンドラインからメトリクスを取得するスクリプトもあるので使ってみた

$ perl mon-get-instance-stats.pl --aws-credential-file=awscreds.template

Instance i-------- statistics for the last 1 hour.

CPU Utilization
    Average: 1.85%, Minimum: 0.50%, Maximum: 12.00%

Memory Utilization
    Average: 36.56%, Minimum: 36.56%, Maximum: 36.56%

Swap Utilization
    Average: 0.00%, Minimum: 0.00%, Maximum: 0.00%

Disk Space Utilization for /dev/xvda1 mounted on /
    Average: 40.04%, Minimum: 40.04%, Maximum: 40.04%

簡単な監視や計測であればAlarmとも連携できるので十分すぎるくらい便利そう

特にディスク容量とかはいつの間に100%になっててシステム止まってた!なんてことになりかねないのでAMIに組み込んでもいいのかなとか思ったり

cronに登録する際は実行権限を忘れずに!