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 にてポリシーを下記のように作成する。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Action": "cloudwatch:PutMetricData",
"Resource": "*"
}
]
}
さらに、EC2インスタンスに関連付けする Role を作成して、上記で作成したポリシーをアタッチする。
EC2インスタンス作成
EC2インスタンスを作成する際に、先ほど作成した Role を設定する。
ユーザーデータにて、OS起動時に mon-put-instance-data
をダウンロードして実行できるようにパーミッション設定。
#!/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
オプションで、今回取得したいメモリとディスクを指定する。--region
で ap-northeast-1
にする。--interval
で 1
を指定(1分間隔で実行)した。
※ README には --duration 1
と書かれているところもあるが、 --duration
だとエラーとなる。 --interval
が正しい。
実行してみたところ、下記のように1分間隔で、リソースの状況が送信されていることが見て取れた。
[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
が出ていることが確認できた。
クリックすると、下記のようにメモリ、ディスクについてのメトリクスが出てくるので、
グラフを作成したいメトリクスを選択して、グラフを作成する。
何も実行されていないと、グラフとして面白くないので、
/dev/null < $(yes)
でメモリに対して負荷をかけてみたり、
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 ????