CloudWatchでカスタムメトリクスをAutoScalingGroup単位で取得する方法

記事タイトルとURLをコピーする

こんにちは柏尾です!2ヶ月間の東京研修も終わり、4月からいよいよ大阪での勤務が始まりました。関西には新大阪にオフィスがあるのですが、通勤が面倒くさいためもっぱら自宅か近所のカフェで仕事をすることが多いです。

在宅勤務は運動不足になりがちなので永田先輩は昼休みにジョギングをしているようです。下記はある日のslackでの会話です。

CloudWatch01

こんな調子ですが、サーバーワークスでは大阪オフィスメンバーも絶賛募集中です!

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.pmCloudWatch APIの呼び出しを行う共有Perlモジュール
mon-put-instance-data.plEC2インスタンスでシステムメトリックス(メモリ、スワップ、ディスクスペースの使用状況)を収集し、CloudWatchに送信するスクリプト
mon-get-instance-stats.plCloudWatchに対してクエリを実行しEC2インスタンスの最新の使用状況統計を表示するスクリプト
awscreds.templateAWS認証情報を記載するファイルテンプレート(※今回はEC2にIAMロールを割り当てる方法を使うためこのファイルは利用しません)

スクリプトの稼働確認

下記のコマンドを実行し、各種メトリクスが取得できるかを確認します。

$ ~/aws-scripts-mon/mon-put-instance-data.pl --mem-util --swap-util --disk-space-util --disk-path=/ --auto-scaling --verbose --verify

MemoryUtilization: 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-idEC2のインスタンスIDを記録するファイル
/var/tmp/aws-mon/placement/availability-zoneアベイラビリティゾーンを記録するファイル

cloud-initでキャッシュファイルを削除するようにしておく

EC2メニュー→起動設定→高度な詳細→ユーザーデータで設定

#!/bin/bash
rm -rf /var/tmp/aws-mon/*

マネジメントコンソールでCloudWatchのデータを確認

下記のように「Linux システム メトリックス」という項目と「AutoScalingGroupName」のリンクが表示されていれば成功です。

CloudWatch02

項目の詳細を見てみると、それぞれのAutoScalingGroupNameごとの MemoryUtilization / SwapUtilization / DiskSpaceUtilizationが表示されていますね。

CloudWatch03

カスタムメトリクスでアラームを作成し、AutoScalingを設定

下記の例ではカスタムメトリクスのメモリ使用率(MemoryUtilization)が70%以上になった際にサーバを追加するというActionを追加しています。

CloudWatch04

CloudWatch05

まとめ

このようにCloudWatchでは標準以外のメトリクスも、AWSで提供されているスクリプトや自作プログラムからデータをCloudWatchに送信し、モニタリング対象とすることができます。AutoScalingGroup単位でのモニタリングも可能で、それらの監視をトリガに通知をおこなったりAutoScalingをすることができます。

これから暑い季節になりますが、自分の健康もしっかりモニタリングしていきましょう!(全然うまくない)