Amazon CloudWatchとは
「Amazon CloudWatch(以下、CloudWatch)」は、AWSで実行するアプリケーションのモニタリングサービスです。メトリクスを収集/追跡してモニタリングを行い、閾値を設定してアラートを設定できます。
対象読者
- AWSに興味のある方
- サーバー運用を行っている方
必要な環境
- AWSのアカウント
- EC2のAmazonLinuxインスタンス
CloudWatchにメトリクスを追加し、アラートを設定する
CloudWatchのEC2にはデフォルトで、 CPU使用率、ディスクIO、ネットワークIO、インスタンスの状態のメトリクスが用意されています。これだけで運用上問題がないのであれば良いですが、 メモリの使用量やディスク容量なども監視したい場合は手動で追加してやる必要があります。
下記手順はAmazon Linuxでの設定になります。
メモリ使用率、スワップ使用率、ディスク使用率を追加する
以下の手順でメトリクスを追加するスクリプトを用意します。
mkdir /usr/local/cloudwatch cd /usr/local/cloudwatch wget http://ec2-downloads.s3.amazonaws.com/cloudwatch-samples/CloudWatchMonitoringScripts-v1.1.0.zip unzip CloudWatchMonitoringScripts-v1.1.0.zip rm -f CloudWatchMonitoringScripts-v1.1.0.zip yum -y install perl-Switch perl-Sys-Syslog perl-URI perl-IO-Compress perl-libwww-perl perl-LWP-Protocol-https mkdir /var/log/cloudwatch/
AWSのAPIにアクセスするためのアクセスキーとシークレットキーを設定します。アクセスキーとシークレットキーについては、AWSのドキュメントを参照してください。
echo "AWSAccessKeyId={アクセスキー}" > /usr/local/cloudwatch/aws-credential echo "AWSSecretKey={シークレットキー}" >> /usr/local/cloudwatch/aws-credential
テスト実行します。
/usr/local/cloudwatch/aws-scripts-mon/mon-put-instance-data.pl --mem-util --swap-util --disk-space-util --disk-path=/ --aws-credential-file=/usr/local/cloudwatch/aws-credential
「Successfully reported metrics to CloudWatch」と表示されれば成功です。
定期的に実行する必要があるため、cronに設定します。
*/5 * * * * /usr/local/cloudwatch/aws-scripts-mon/mon-put-instance-data.pl --mem-util --swap-util --disk-space-util --disk-path=/ --from-cron --aws-credential-file=/usr/local/cloudwatch/aws-credential >> /var/log/cloudwatch/linux-error.log
AWS Management ConsoleからCloudWatchを見ると、左メニューに「Linux System」というものが追加され、DiskSpaceUtilization、MemoryUtilization、SwapUtilizationの3つが項目として表示されるようになります。
OSのリソース情報としては、これで一通り足りていると思いますが、 それ以外のメトリクスを追加するには以下のように行います。
その他のメトリクスを追加する
easy_install php easy_install pip pip install awscli --upgrade
アクセスキーとシークレットキーを再度設定する
aws configure AWS Access Key ID [None]: {アクセスキー} AWS Secret Access Key [None]: {シークレットキー} Default region name [None]: ap-northeast-1 Default output format [None]: json
サンプルとしてApacheの情報をプロットしてみます。
Apacheのserver-statusをプロットする
Amazon Linuxのシェルから「http://localhost/server-status」にアクセスしたときにApacheのserver-statusが表示できるようにします。
ExtendedStatus On <Location /server-status> SetHandler server-status Require local </Location>
ExtendedStatus On <Location /server-status> SetHandler server-status Order allow,deny Deny from all Allow from localhost </Location>
設定を反映させます。
service httpd reload
Apacheのserver-statusを読み取り、CloudWatchにプロットするスクリプトを作成します。
STATUS="/tmp/apache_status" SERVER=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id` wget -q -O - http://localhost/server-status?auto > $STATUS BusyWorkers=`cat $STATUS | grep BusyWorkers | awk '{ print $2 }'` IdleWorkers=`cat $STATUS | grep IdleWorkers | awk '{ print $2 }'` ReqPerSec=`cat $STATUS | grep ReqPerSec | awk '{ print $2 }'` BytesPerSec=`cat $STATUS | grep BytesPerSec | awk '{ print $2 }'` BytesPerReq=`cat $STATUS | grep BytesPerReq | awk '{ print $2 }'` /usr/bin/aws cloudwatch put-metric-data --metric-name httpd-busyworkers --namespace "EC2: HTTPD" --dimensions "InstanceId=$SERVER" --unit "Count" --value $BusyWorkers /usr/bin/aws cloudwatch put-metric-data --metric-name httpd-idleworkers --namespace "EC2: HTTPD" --dimensions "InstanceId=$SERVER" --unit "Count" --value $IdleWorkers /usr/bin/aws cloudwatch put-metric-data --metric-name httpd-request-per-sec --namespace "EC2: HTTPD" --dimensions "InstanceId=$SERVER" --unit "Count" --value $ReqPerSec /usr/bin/aws cloudwatch put-metric-data --metric-name httpd-byte-per-sec --namespace "EC2: HTTPD" --dimensions "InstanceId=$SERVER" --unit "Bytes" --value $BytesPerSec /usr/bin/aws cloudwatch put-metric-data --metric-name httpd-byte-per-req --namespace "EC2: HTTPD" --dimensions "InstanceId=$SERVER" --unit "Bytes" --value $BytesPerReq
実行権限を追加し、テスト実行します
chmod +x apache-status-put.sh ./apache-status-put.sh
Custom Metricsに「EC2: HTTPD」というものが追加され、httpd-busyworkers、httpd-idleworkers、httpd-request-per-sec、httpd-byte-per-sec、httpd-byte-per-reqが項目として表示されます。
cronに登録します。
*/5 * * * * /usr/local/cloudwatch/apache-status-put.sh 2>> /var/log/cloudwatch/apache-error.log
ここまででメトリクスの追加ができたので、次はアラートの設定を行います。