AWS CloudWatch カスタムメトリクスでメモリ使用率を取得する

ここ最近できていなかった社内のAWS勉強会だったが、今週からまた再開している。
過去の勉強会についてのブログ記事は下記のとおり。

社内AWS認定試験対策勉強会 | MMMブログ
社内のAWS勉強会のまとめ | MMMブログ
AWS放課後勉強会 | MMMブログ

今回は、AWSを普段業務で触っているメンバーと、AWSにそれほど馴染みがないメンバー(主にフロントエンドチーム)と2人1組になり、カリキュラムに沿って、IAM、VPC、EC2などの基本的なマネージドサービスを実際に触ってみて理解しよう、という試みを行っている。

フロントエンドチームもAWSの知識があった方が業務をする上で良いので、AWS勉強会を通じてAWSの知識を深めてもらって、できればAWSの認定試験に合格してくれると嬉しいなーと思っている。

今回は、その社内AWS勉強会で、EC2のコンソールを触っているところでチラッとだけ話題にした、 CloudWatch のデフォルトのメトリクスとカスタムメトリクスについて、少し踏み込んでみる。

EC2でデフォルトで利用可能な CloudWatch メトリクス

EC2でデフォルトで利用可能な主な CloudWatch メトリクスは、

  • CPU使用率
  • ディスクの読み取り/書き込み操作
  • ネットワークトラフィックの量
  • インスタンス/システム ステータスチェック

などがある。
注意が必要なのは、 メモリ使用率やディスク使用率は、デフォルトのメトリクスでは取得できない ということ。

【参考URL】
インスタンスの利用可能な CloudWatch メトリクスのリスト表示

メモリ使用率、ディスク使用率を取得したい場合は、カスタムメトリクスを利用しないといけない。

カスタムメトリクスでメモリ使用率、ディスク使用率を取得する

下記の公式のドキュメントで、 CloudWatch モニタリングスクリプトを使用して、メモリ使用率やディスク使用率を取得する方法が紹介されている。

Amazon EC2 Linux インスタンスのメモリとディスクのメトリクスのモニタリング - Amazon Elastic Compute Cloud

こちらを参考に、手順通り実行すれば、比較的簡単にメモリ使用率やディスク使用率を取得することは可能だ。
ただ、 Perl スクリプトになっており、監視するために Perl をインストールするのはちょっと気持ち悪い。

もっと簡単に使えるものはないかなーと探してみたところ、 Golang で書かれている mlabouardy/mon-put-instance-data が良さそうだったので、試してみた。
Linux 用にコンパイル済みのバイナリファイルをS3においておけば、ダウンロードして、そのまま実行できるので Perl スクリプトを利用するよりはお手軽そうだ。

Policy、Role 作成

まず、EC2インスタンスから、 CloudWatch へメトリックのデータを送れるように、 IAM にてポリシーを下記のように作成する。

1
2
3
4
5
6
7
8
9
10
11
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Action": "cloudwatch:PutMetricData",
"Resource": "*"
}
]
}


さらに、EC2インスタンスに関連付けする Role を作成して、上記で作成したポリシーをアタッチする。

EC2インスタンス作成

EC2インスタンスを作成する際に、先ほど作成した Role を設定する。
ユーザーデータにて、OS起動時に mon-put-instance-data をダウンロードして実行できるようにパーミッション設定。  

1
2
3
4
5
#!/bin/bash

curl -L https://s3.us-east-1.amazonaws.com/mon-put-instance-data/1.0.0/linux/mon-put-instance-data -o /usr/local/bin/mon-put-instance-data

chmod +x /usr/local/bin/mon-put-instance-data

mon-put-instance-data 実行

作成した EC2インスタンスに接続して、 mon-put-instance-data を実行してみる。

--memory --disk オプションで、今回取得したいメモリとディスクを指定する。
--regionap-northeast-1 にする。
--interval1 を指定(1分間隔で実行)した。
※ README には --duration 1 と書かれているところもあるが、 --duration だとエラーとなる。 --interval が正しい。

実行してみたところ、下記のように1分間隔で、リソースの状況が送信されていることが見て取れた。

1
2
3
4
5
6
[root@ip-10-0-0-136 ~]# mon-put-instance-data --memory --disk --interval 1 --region ap-northeast-1
Interval: 1 minutes - Features enabled: memory, disk
2018/05/19 01:50:11 Memory - Utilization:14.872979580211556% Used:154001408 Available:881442816
2018/05/19 01:50:11 Disk - Utilization:38.71704564310449% Used:3220787200 Free:4995342336
2018/05/19 01:51:11 Memory - Utilization:15.20526594776775% Used:157442048 Available:878002176
2018/05/19 01:51:11 Disk - Utilization:38.71714411904165% Used:3220795392 Free:4995334144

※ 実際に運用で使用する際には、バックグラウンドで実行すると良いと思う。

ダッシュボード

CloudWatch でダッシュボードを作成する。  

メトリクス選択画面で、 CustomMetrics が出ていることが確認できた。

クリックすると、下記のようにメモリ、ディスクについてのメトリクスが出てくるので、

グラフを作成したいメトリクスを選択して、グラフを作成する。

何も実行されていないと、グラフとして面白くないので、

1
/dev/null < $(yes)

でメモリに対して負荷をかけてみたり、

1
dd if=/dev/zero of=ddtest bs=500M count=1

で、いくつか適当にファイルを作成して、ディスク使用率を上げてみた。

まとめ

mon-put-instance-data でかなりお手軽にカスタムメトリクスが取得できた。
--docker オプションで、コンテナごとのメモリ使用率やCPU使用率なども取得できるみたいだ。
弊社では監視に、 Datadog を使うことが多いが、今後使える機会があったら使ってみても良さそうだと感じた。

参考

Publish Custom Metrics to AWS CloudWatch – Hacker Noon
mlabouardy/mon-put-instance-data: Publish Custom CloudWatch Metrics 📈

このエントリーをはてなブックマークに追加