こんにちは柏尾です!2ヶ月間の東京研修も終わり、4月からいよいよ大阪での勤務が始まりました。関西には新大阪にオフィスがあるのですが、通勤が面倒くさいためもっぱら自宅か近所のカフェで仕事をすることが多いです。
在宅勤務は運動不足になりがちなので永田先輩は昼休みにジョギングをしているようです。下記はある日のslackでの会話です。
こんな調子ですが、サーバーワークスでは大阪オフィスメンバーも絶賛募集中です!
CloudWatchとは
Amazon CloudWatch は、AWS クラウドリソースと AWS で実行するアプリケーションのモニタリングサービスです。
Amazon EC2 インスタンス、Amazon EBS ボリューム、Elastic Load Balancing、Amazon RDS DB インスタンスなどのリソースをモニタリングすることができます。さらにそれらのデータを監視し、指定した閾値を超えた場合にアラーム通知を行ったり、AutoScalingによってサーバの台数を増減させたりすることも可能になっています。
またCloudWatchのAPIを利用することで、メトリクスデータをCloudWatchに送信し、独自のカスタムメトリクスを取得することも可能です。
AWS提供のスクリプトを使ってカスタムメトリクス取得の方法についての説明をしているサイトは多かったのですが、カスタムメトリクスをAutoScalingGroupごとに収集する方法に関しては情報が少なかったので、本エントリではその方法についてまとめたいと思います。
Amazon EC2 の標準メトリクス
CloudWatchで利用できる標準のEC2メトリクスには下記の7種類のメトリクス(5分間隔)と3種類のインスタンスの状態チェックメトリクス(1分間隔)があります。
- EC2標準メトリクス(5分間隔)
- CPUUtilization
- DiskReadBytes
- DiskWriteBytes
- DiskReadOps
- DiskWriteOps
- NetworkIn
- NetworkOut
- EC2 状態チェックメトリクス(1分間隔)
- StatusCheckFailed
- StatusCheckFailed_Instance
- StatusCheckFailed_System
これらは追加料金なしで利用することが可能です。その他CloudWatchに関する料金はこちらで参照できます。
EC2のカスタムメトリクス取得方法
EC2の標準メトリクスにはMemory/Swap/DiskSpaceなどのメトリクスが含まれていませんので、これらをモニタリングするにはカスタムメトリクスとして別途取得する必要があります。
AWSからEC2用のカスタムメトリクス取得スクリプトがLinux用・Windows用が提供されており、これを利用することで標準メトリクス以外のモニタリング出来るようになります。
■ Monitoring Scripts for Amazon EC2 Instances
今回はAmazonLinuxにのカスタムメトリクス取得スクリプトを導入したいと思います。
■ Amazon CloudWatch Monitoring Scripts for Linux
カスタムメトリクス取得用スクリプトの導入方法
モニタリング対象のEC2インスタンスに割り当てるIAMロールのポリシー
モニタリング対象のEC2には、CloudWatchにデータを送信したりEC2の情報を取得するためのポリシーを持ったIAMロールを設定しておく必要があります。
マネジメントコンソールからIAMロールの作成およびそれに割り当てるポリシーの設定をした後、作成したポリシーを指定してEC2インスタンスを起動します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "xxxxxxxxxxxxxxxxx", "Effect": "Allow", "Action": [ "cloudwatch:PutMetricData", "ec2:DescribeInstances", "ec2:DescribeImages", "ec2:DescribeTags", "ec2:DescribeSnapshots" ], "Resource": [ "*" ] } ] }
Perlパッケージのインストール
スクリプトの実行にはいくつかのPerlパッケージが必要になるため、これらをインストールします。
$ sudo yum install perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https
CloudWatchMonitoringScriptsのダウンロード・解凍
カスタムメトリクス取得対象のEC2にスクリプトを導入します。
wget http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip unzip CloudWatchMonitoringScripts-1.2.1.zip rm CloudWatchMonitoringScripts-1.2.1.zip cd aws-scripts-mon
zip内には下記のスクリプト・ファイルが含まれています。
ファイル名 | 説明 |
---|---|
CloudWatchClient.pm | CloudWatch APIの呼び出しを行う共有Perlモジュール |
mon-put-instance-data.pl | EC2インスタンスでシステムメトリックス(メモリ、スワップ、ディスクスペースの使用状況)を収集し、CloudWatchに送信するスクリプト |
mon-get-instance-stats.pl | CloudWatchに対してクエリを実行しEC2インスタンスの最新の使用状況統計を表示するスクリプト |
awscreds.template | AWS認証情報を記載するファイルテンプレート(※今回はEC2にIAMロールを割り当てる方法を使うためこのファイルは利用しません) |
スクリプトの稼働確認
下記のコマンドを実行し、各種メトリクスが取得できるかを確認します。
$ ~/aws-scripts-mon/mon-put-instance-data.pl --mem-util --swap-util --disk-space-util --disk-path=/ --auto-scaling --verbose --verifyMemoryUtilization: 3.9748974361473 (Percent) SwapUtilization: 0 (Percent) DiskSpaceUtilization [/]: 11.8982715859376 (Percent) No credential methods are specified. Trying default IAM role. Using IAM role <cloudwatch-PutMetricData-role> Endpoint: https://monitoring.ap-northeast-1.amazonaws.com Payload: {"MetricData":[{"Timestamp":1430866227,"Dimensions":[{"Value":"i-xxxxxxxx","Name":"InstanceId"}],"Value":3.9748974361473,"Unit":"Percent","MetricName":"MemoryUtilization"},{"Timestamp":1430866227,"Dimensions":[{"Value":"test-asg","Name":"AutoScalingGroupName"}],"Value":3.9748974361473,"Unit":"Percent","MetricName":"MemoryUtilization"},{"Timestamp":1430866227,"Dimensions":[{"Value":"i-xxxxxxxx","Name":"InstanceId"}],"Value":0,"Unit":"Percent","MetricName":"SwapUtilization"},{"Timestamp":1430866227,"Dimensions":[{"Value":"test-asg","Name":"AutoScalingGroupName"}],"Value":0,"Unit":"Percent","MetricName":"SwapUtilization"},{"Timestamp":1430866227,"Dimensions":[{"Value":"/dev/xvda1","Name":"Filesystem"},{"Value":"i-xxxxxxxx","Name":"InstanceId"},{"Value":"/","Name":"MountPath"}],"Value":11.8982715859376,"Unit":"Percent","MetricName":"DiskSpaceUtilization"},{"Timestamp":1430866227,"Dimensions":[{"Value":"test-asg","Name":"AutoScalingGroupName"},{"Value":"/dev/xvda1","Name":"Filesystem"},{"Value":"/","Name":"MountPath"}],"Value":11.8982715859376,"Unit":"Percent","MetricName":"DiskSpaceUtilization"}],"Namespace":"System/Linux","__type":"com.amazonaws.cloudwatch.v2010_08_01#PutMetricDataInput"}
オプション名 | 説明 |
---|---|
--mem-util | メモリ使用率のメトリクスを取得します |
--swap-util | スワップ使用率のメトリクスを取得します |
--disk-space-util | ディスク使用率のメトリクスを取得します |
--disk-path | ディスク使用率の取得対象となるパスを指定します |
--auto-scaling | そのEC2インスタンスが所属するAutoScalingグループごとにメトリクスを収集します。今回はこのオプションが重要になります。 |
--verify | CloudWatchにデータを送信せずにスクリプトの稼働確認ができます |
その他オプションについては下記リンクを参照ください。
http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/mon-scripts-perl.html#mon-scripts-using
※2015年05月時点では、日本語版ドキュメントを見てみると、「--auto-scaling」をはじめとする幾つかのオプションに関する説明がありませんでした。最初日本語版のドキュメントを参照していたため、このオプションに気付かず、カスタムメトリクスのデータはAutoScalingGroup単位には見られないものと勘違いしていました。英語ドキュメントをチェックする習慣をつけないとダメですね・・・。
crontabへ設定
crontabに5分毎にこのスクリプトを起動するように指定します。cronから実行する場合は「--from-cron」オプションをつけます。
$crontab -e*/5 * * * * ~/aws-scripts-mon/mon-put-instance-data.pl --mem-util --swap-util --disk-space-util --disk-path=/ --auto-scaling --from-cron
スクリプトが生成するキャッシュデータに注意する
Monitoring Scriptsを実行すると以下のキャッシュファイルが作成されます。すでにファイルが存在している場合は、ファイル内に記載されているインスタンスIDとアベイラビリティゾーンを参照してしまうため、スクリプトを導入したAMIから新規にEC2インスタンスを立ち上げる場合や、そのAMIをリージョン間コピーして利用する場合は、インスタンス起動時などにキャッシュファイルを削除しておかないと正しくメトリクスデータが取得できないので注意が必要です。
ファイル名 | 説明 |
---|---|
/var/tmp/aws-mon/instance-id | EC2のインスタンスIDを記録するファイル |
/var/tmp/aws-mon/placement/availability-zone | アベイラビリティゾーンを記録するファイル |
cloud-initでキャッシュファイルを削除するようにしておく
EC2メニュー→起動設定→高度な詳細→ユーザーデータで設定
#!/bin/bash rm -rf /var/tmp/aws-mon/*
マネジメントコンソールでCloudWatchのデータを確認
下記のように「Linux システム メトリックス」という項目と「AutoScalingGroupName」のリンクが表示されていれば成功です。
項目の詳細を見てみると、それぞれのAutoScalingGroupNameごとの MemoryUtilization / SwapUtilization / DiskSpaceUtilizationが表示されていますね。
カスタムメトリクスでアラームを作成し、AutoScalingを設定
下記の例ではカスタムメトリクスのメモリ使用率(MemoryUtilization)が70%以上になった際にサーバを追加するというActionを追加しています。
まとめ
このようにCloudWatchでは標準以外のメトリクスも、AWSで提供されているスクリプトや自作プログラムからデータをCloudWatchに送信し、モニタリング対象とすることができます。AutoScalingGroup単位でのモニタリングも可能で、それらの監視をトリガに通知をおこなったりAutoScalingをすることができます。
これから暑い季節になりますが、自分の健康もしっかりモニタリングしていきましょう!(全然うまくない)