こんにちは、クラウドソリューション事業部の石垣です。
CloudWatchダッシュボードでEC2(正確にはEBS)のディスク使用量をグラフ化したくなったことはありませんか?先日そのような機会があったので、ちょっと調査しました。
概要
CloudWatchダッシュボードで以下のようなディスク使用率とディスク使用量について確認することを検討していました。
ディスク使用率を確認しつつ(こちらは必要に応じてアラートを設定)、ディスク拡張する際には現在の容量を確認したいので一つの画面で確認できたほうが便利という思惑です。
90%でアラートが飛んできたとして、10GBのEBSと1TBのEBSでそれぞれ追加する量は変わります。ダッシュボードを一見してアクションを決定できたほうが手間は少ないだろうと思います。
ディスク使用率については、CloudWatch Agentでメトリクスを取得して転送させています。config設定ウィザードに従って作成されるconfigでは以下のようになります。
1{
2 "agent": {
3 "metrics_collection_interval": 60,
4 "run_as_user": "cwagent"
5 },
6 "metrics": {
7 "aggregation_dimensions": [
8 [
9 "InstanceId"
10 ]
11 ],
12 "append_dimensions": {
13 "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
14 "ImageId": "${aws:ImageId}",
15 "InstanceId": "${aws:InstanceId}",
16 "InstanceType": "${aws:InstanceType}"
17 },
18 "metrics_collected": {
19 "collectd": {
20 "metrics_aggregation_interval": 60
21 },
22 "disk": {
23 "measurement": [
24 "used_percent"
25 ],
26 "metrics_collection_interval": 60,
27 "resources": [
28 "*"
29 ]
30 }
31 }
32 }
ディスクについては、"used_percent"で使用率しか取得されません(=使用量や総量についてのメトリクスが存在しません)。
ダッシュボード作成時に静的に総量を設定することもできますが、ディスク拡張時等にダッシュボード側も修正しなければいけなくなるので、運用として煩雑になり設定としては不適切です。
やってみる
設定としては、diskの取得メトリクスに"used"と"total"を追加するだけです。
※コストが気になる場合は"used_percent" か"used" はどちらかあれば"total"との乗除で計算できるので、どちらでもいいかと思います。
1[前略]
2"disk": {
3 "measurement": [
4 "used_percent","used", "total"
5 ],
6 "metrics_collection_interval": 60,
7 "resources": [
8 "*"
9 ]
10},
11[後略]
送られてくるようになりました。
メトリクスはbyteなので、必要に応じて/1024/1024/1024で換算すると、欲しかった情報が取得できます。
"total"/1024/1024/1024*"used_percent”/100 で使用量を出しています。
課題
ウィジェットタイプをゲージで作成していましたが、ゲージレンジの最大値にメトリクス("total")を直接設定することができません。ちょっと対応を考えます。
- 解決策1:ゲージを諦める
ディスクの総量自体は取得できているのでウィジェットタイプ「数値」で以下のように表現することは可能です。
見栄えをそこまで気にしないのであればこちらの解決策で十分かと思います。
- 解決策2:あくまでゲージにこだわる
- Lambda等で、"total" のメトリクスを取得してダッシュボードを更新する処理を実装する。
- EventBridgeで上記の処理を定期実行する。
最大値自体には数字しか入らないので、ダッシュボード自体を定期的に更新する形になります。
以下のような形です。
検討だけはしましたが、あまり本質的ではない上に余計なコスト(Lambdaの実行についての料金および管理コスト)も発生するので、個人的にはそこまでやらなくてもいいのではと思います。
終わりに
CloudWatch Agentでディスク総量を確認して、CloudWatchダッシュボードで可視化することを考えました。
CloudWatchに対しては今回実施したこと以外にもいろいろなカスタムメトリクスを転送できるので、必要に応じて使用していきたいですね(ただし、カスタムメトリクスはコストが発生します)。