CloudWatch Monitoring ScriptでDiskUsageやMemoryUsage等を取得

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

よく訓練されたアップル信者、都元です。EC2インスタンスのステータス監視には、基本的にCloudWatchを使う事が多いですね。

CloudWatchではデフォルトで、CPU使用率やネットワーク入出力量等、いくつかの基本的なメトリクス(監視項目)があります。しかし、基本メトリクスとも思えるディスク使用量やメモリ使用量等の値はデフォルトで提供されていません。これらの値はEC2インスタンス上で動くOSに依存するメトリクスであるため、OS側からの補助無しでは、EC2の外側から取得できないメトリクスだからです。

CloudWatch Monitoring Script

以前、当ブログでも「CloudWatchのカスタムメトリクスでFreeMemoryMBytes、UsedMemoryPercent、LoadAverage、Stealを取得」や「CloudWatchのカスタムメトリクスでDiskUsageを取得」というエントリでこの方法を紹介しましたが、その後2013年3月に、純正のスクリプトが公開されました *1

そこで今回は、このスクリプトの利用方法を紹介します。前述の通り、これらの処理はOS依存であるため、Linux用及びWindows Server用がありますが、今回はLinux版についてご紹介します。

インストール方法も、zipをダウンロードして展開してcronに仕込むだけですので、非常に簡単です。是非試してみてください。

IAM Roleの作成

で、これらのスクリプトは、OSの中からCloudWatch APIを叩いて値を送信するため、インスタンスに対してAPIへのアクセス権限を付与する必要があります。普通にAPIキーとシークレットをテキストファイルに記述する方法もありますが、今回はIAM Roleを使って実現しましょう。

まずは、IAMのManagement Consoleより、左側のメニューからRoleを選択し、Create New Roleボタンをクリックします。(モザイク部分は、今回と関係のないIAM Roleを隠しています)

cws-iamrole-1

ロールの名前は、今回はcwscriptとしています。任意で構いません。

cws-iamrole-2

次の画面では「Amazon EC2」の横にあるSelectボタンを選択します。

cws-iamrole-3

この画面では、cwscriptに与える具体的な権限を設定します。今回は権限設定情報を本エントリからのコピペで設定しますので、Custom Policyを選択してSelectで進みます。

cws-iamrole-4

ポリシーの設定画面となるので、以下のJSONをコピペで貼付けてください。ポリシー名はcwscript-policyとしましたが、任意で構いません。

cws-iamrole-5

{
  "Statement": [
    {
      "Action": [
        "cloudwatch:GetMetricStatistics",
        "cloudwatch:PutMetricData"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ]
    }
  ]
}

あとは設定内容を確認して先に進んでいくと、新しいRoleが作られます。

cws-iamrole-6

cws-iamrole-7

EC2の起動とインストール

では、Linux版のスクリプトを試してみましょう。EC2インスタンス(Amazon Linux 64bit)を起動しますが、途中の以下の画面でIAM Roleの項に上で作ったcwscriptを設定するのを忘れないでください。

cws-ec2-linux

インスタンスが起動したらSSHでログインし、以下のコマンドを入力します。

$ wget http://ec2-downloads.s3.amazonaws.com/cloudwatch-samples/CloudWatchMonitoringScripts-v1.1.0.zip
$ unzip CloudWatchMonitoringScripts-v1.1.0.zip
$ rm CloudWatchMonitoringScripts-v1.1.0.zip
$ cd aws-scripts-mon

ひとまずこれでスクリプトの実行環境が整いました。いくつかコマンドを打ってみましょう。まずは動作テストです。--verifyオプションを付けたので、実際にCloudWatchにデータは送信されません。

$ ./mon-put-instance-data.pl --mem-util --verify --verbose
MemoryUtilization: 8.17841178017355 (Percent)
No credential methods are specified. Trying default IAM role.
Using IAM role <cwscript>
Endpoint: https://monitoring.us-east-1.amazonaws.com/
Payload: AWSAccessKeyId=XXXXXXXXXXXXXXXXXXXX&Action=PutMetricData&MetricData.member.1.Dimensions.member.1.Name=InstanceId&MetricData.member.1.Dimensions.member.1.Value=i-XXXXXXXX&MetricData.member.1.MetricName=MemoryUtilization&MetricData.member.1.Timestamp=2013-04-22T01%3A10%3A19.000Z&MetricData.member.1.Unit=Percent&MetricData.member.1.Value=8.17841178017355&Namespace=System%2FLinux&SecurityToken=....&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2013-04-22T01%3A10%3A19.000Z&Version=2010-08-01&Signature=....

Verification completed successfully. No actual metrics sent to CloudWatch.

--mem-utilというオプションはメモリ使用率を取得するオプションです。メモリ使用率(%)が取得でき、CloudWatchへポストする直前まで上手く処理が行われたようです。

メトリクスを指定するオプションには他にも次のようなものがあり、これらは複数指定ができます。

--mem-util Memory Utilization (%)
--mem-used Memory Used (MB)
--mem-avail Memory Available (MB)
--swap-util Swap Utilization (%)
--swap-used Swap Used (MB)
--disk-space-util Disk Space Utilization (%)
--disk-space-used Disk Space Used (GB)
--disk-space-avail Disk Space Available (GB)

あとは、このコマンドをcronに仕込みましょう。crontab -eコマンドでエディタを開き、cron設定を追記します。

送信するメトリクスは上記の全てとしましょう。また、ディスク使用量に関するメトリクスはパスを指定する必要がありますので、ここは/としておきます。必要であれば複数指定が可能です。また、mon-put-instance-data.plをcronから呼び出す場合は、--from-cronというオプションが必要ですので、忘れないようにしましょう。

* * * * * ~/aws-scripts-mon/mon-put-instance-data.pl  --mem-util --mem-used --mem-avail --swap-util --swap-used --disk-space-util --disk-space-used --disk-space-avail --disk-path=/ --from-cron

以上でインストールは完了です。

スクリプトの動作を確認する

スクリプトの動作を確認するために、下記コマンド等で無駄にディスクを浪費しつつ、しばらく待機します。

$ cat /dev/urandom >/tmp/hoge

10〜15分経過したら、CloudWatchのManagement Consoleから値を確認します。左側のメニューから「Metrics」を選択し、下図のように「System/Linux」で値を検索してみましょう。

cws-linux-result

みるみるうちに、ディスクの使用可能領域が減っていますね!

脚注

  1. とは言え、LoadAverageとStealは取得できませんが。