AWS

EC2のメモリやディスク利用率をCloudWatchで監視する

この記事ではAWSEC2インスタンスメモリ使用率ディスク使用率CloudWatchで監視できるようにする方法を解説していきます。

EC2ではデフォルトでCPU使用率など様々な項目を監視することができますが、メモリの使用率ディスクの使用率の項目がありません。

なので、CloudWatchカスタムメトリクスを定義する必要があります。

AWS公式のスクリプトが用意されているので、今回はそれを利用して設定していきます。

IAMロールを設定

まずはEC2インスタンスに設定するIAMロールを作成していきます。

EC2からCloudWatchに対してデータを送るための権限を設定する必要があります。

具体的に許可する項目は以下になります。

  • cloudwatch:PutMetricData
  • cloudwatch:GetMetricStatistics
  • cloudwatch:ListMetrics

▼まずはIAMの設定画面を開きます。
「ロール」「ロールの作成」で新規作成画面を開きます。

ロールを使用するサービスを選択する画面になります。
今回はEC2に対して設定するので、EC2を選択します。

ポリシーを設定する画面になります。
CloudWatchへの権限が付与されているポリシーを設定しますが、まだ作成していないのでここで作成していきます。

「ポリシーの作成」をクリックします。

ポリシーを作成する画面になります。
まずは許可するサービスを選択します。

今回は、CloudWatchに対する権限を設定するのでCloudWatchを選択します。

▼フォームに「Cloud」ぐらいまで入力すると候補が出てくるので、選択肢にある「CloudWatch」を選択します。

次にCloudWatchに対して何のアクションを許可するかを個別に設定する画面になります。

今回は、以下の項目を許可していきます。

  • cloudwatch:PutMetricData
  • cloudwatch:GetMetricStatistics
  • cloudwatch:ListMetrics

▼許可する項目を1つずつチェックしていきます。
チェックできたら、「ポリシーの確認」をクリックします。

▼最後にポリシーの名前を設定します。

今回は「cloudwatch-script-policy」としました。
「ポリシーの作成」をクリックすると作成が完了します。

ポリシーの作成が完了しました。
先程のロールの作成でポリシーを選択する画面に戻ります。

▼1回内容をリロードし、先程作成したポリシー名で検索をかけるとリストに表示されますので、チェックを付けて「次のステップ:タグ」をクリックします。

タグを設定する画面になります。
今回は特に何も設定しませんでした。

ロール名を設定します。
今回は「EC2Role」としました。

▼ロール一覧画面に戻ると「EC2Role」が追加されていることが確認できました。

EC2にIAMロールを設定する

先ほど作成したIAMロールEC2に設定していきます。

EC2のコンソール画面のインスタンス一覧画面を開きます。

設定したいインスタンスを選択して、「インスタンスの設定」「IAMロールの割当/置換」を選択していきます。

どのIAMロールを割り当てるかを選択します。

選択肢に先程作成した「EC2Role」があると思うので、選択して「適用」をクリックします。

これでIAMの設定は完了です。

スクリプトを実行する

次にEC2インスタンスsshでログインして、スクリプトを実行していきます。

今回使用するスクリプトはAWSが公式で用意してくれているスクリプトになります。
以下ではAmazon Linuxでの導入方法になりますので、他の場合は以下に貼り付けてある公式ページを参照するようにしてください。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/mon-scripts.html

▼必要なパッケージをyumでインストールします。
perlで書かれているスクリプトなのでperlを実行できるようにするための必要なものをインストールします。


sudo yum install -y perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https perl-Digest-SHA.x86_64

AWSが用意している、CloudWatchのスクリプトをダウンロードします


curl https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip -O

▼ダウンロードしたスクリプトをインストールします


unzip CloudWatchMonitoringScripts-1.2.2.zip && \
rm CloudWatchMonitoringScripts-1.2.2.zip && \
cd aws-scripts-mon

これで準備は整いました。

▼テスト的に、実際にデータは送信しませんが、実行するコマンドがあるので実行していきます。


./mon-put-instance-data.pl --mem-util --verify --verbose

例えば、序盤で設定したIAMロールの設定ができていない場合以下のようになりました。


$ ./mon-put-instance-data.pl --mem-util --verify --verbose
MemoryUtilization: 37.2271598747059 (Percent)
No credential methods are specified. Trying default IAM role.

ERROR: No IAM role is associated with this EC2 instance.

For more information, run 'mon-put-instance-data.pl --help'

正常にできた場合は以下のようになりました。


$ ./mon-put-instance-data.pl --mem-util --verify --verbose
MemoryUtilization: 36.675055118233 (Percent)
No credential methods are specified. Trying default IAM role.
Using IAM role <EC2Role>
Endpoint: https://monitoring.ap-northeast-1.amazonaws.com
Payload: {"MetricData":[{"Timestamp":1577528824,"Dimensions":[{"Value":"i-(instanceID)","Name":"InstanceId"}],"Value":36.675055118233,"Unit":"Percent","MetricName":"MemoryUtilization"}],"Namespace":"System/Linux","__type":"com.amazonaws.cloudwatch.v2010_08_01#PutMetricDataInput"}

Verification completed successfully. No actual metrics sent to CloudWatch.

成功したのでcronの設定をしておきます。
crontab -ecronの編集をすることができます。

▼以下のように設定しました。
1分ごとに呼び出すように設定しています。


* * * * * ~/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

どのメトリクスを送信するかをオプションで指定していきます。
どのオプションがどのメトリクスを追加するかは公式のページにまとまっているのでこちらを参照してください。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/mon-scripts.html

こちらで設定が完了しました。

CloudWatchのコンソール画面で確認

次は、CloudWatchのコンソール画面で確認していきます。

▼メトリクスの一覧画面に移動すると「Linuxシステム」というのが追加されています。

▼進んでいくと以下のようにメモリに関する項目が増えていることが確認できました。