タイトルに【そんなときどうする?】をつけて、勝手にシリーズっぽくしてみました。実際に運用している案件でやっていることを中心に書いていきたいと思います!
※「そんなときどうする?」となったときに、解決方法はいろいろあると思います。内容はあくまで解決方法の1つと思っていただければ、幸いです。
今回はズバリ、「CloudWatchのデータを2週間以上残したい!」です。
CloudWatchは、リアルタイムでAWSリソースのモニタリングが必要なときに、マネジメントコンソールでグラフを目視確認したり、Slackにアラートを飛ばしたりと、とても便利なモニタリングツールですが、2週間しかデータを保持できないので、単体で長期的な分析をすることはできません。
しかし、できればこのCloudWatchのデータをどこかに取っておいて、長期的な分析にも利用したいと思いませんか? 正確なデータが数値で残ってさえいれば、あとからその数値を使って計算したり、可視化して分析したりと、どうにでもできるはずです。
ということで、なにはともあれまずはデータをためることにしました。
1. CloudWatchのデータをためる仕組み
1. 処理の流れ
データのため先には、DynamoDBを選択しました。
参考記事:DynamoDB 入門編
リアルタイムでのモニタリング用ではなく、長期的な分析のためのデータ保存なので、分刻みの短いスパンではなく、1時間毎にCloudWatchから値を取得して、DynamoDBに入れています。
処理の流れは以下のようになっています。
1. 開発サーバーからスクリプトを実行
2. 本番のWebサーバー(www01)のCPUUtilizationの値をCloudWatchから取得
3. 開発アカウントのDynamoDBに入れる
スクリプトは毎時10分にcronで実行しています。1度の実行で1分毎のデータを1時間分(60個分)取得し、DynamoDBへ値を入れます。実際の運用ではEC2のCPUUtilizationの他にもELBのRequestCountやその他の必要な値も適宜同様の仕組みで値を残すようにしています。
※1分毎の値を取得する場合は、対象インスタンスの詳細モニタリングを有効にする必要があります(有料)。
2. DynamoDBのテーブル構造
今回のDynamoDBのテーブル構造は以下のようになっています。2つのプライマリキーに日付と時間をそれぞれ設定して、あとはCPU使用率が何%だったかを入れる、というシンプルな構造です。
項目 | 例 | |
---|---|---|
プライマリパーティションキー | day | 2016/04/14 |
プライマリソートキー | time | 09:37:00 |
percent | 56.07 |
※昔はハッシュキーとレンジキーと呼んでいましたが、呼び方がプライマリパーティションキーとプライマリソートキーに変わったようです。
2. スクリプト
1. スクリプト(cloudwatch-to-dynamodb.php)
以下が実行するスクリプトです。「AWS SDK for PHP 3」を使用しています。今回使用したバージョンは3.17.4でした。
2. スクリプトの捕捉説明
CloudWatchの値をDynamoDBに入れる箇所について、少し捕捉説明したいと思います。
L57〜
スクリプトの実行時間が毎時10分なので、前の1時間分のデータをDynamoDBへ入れるためには、70分前〜10分前のデータが必要です。そのため、少し多めに80分前のデータから現在のデータまでをいったん取得しています。CPU使用率は最大値を取得したいので、「Statistics」は「Maximum」を指定しています。
L70〜
時刻をキーにして、値を入れる配列を1時間分(60個)用意しておきます。
L79〜
先ほど用意した時刻をキーにした配列にCPU使用率(%)を入れます。
L90〜
配列をforeachでまわして、DynamoDBに60個分のデータを入れていきます。
3. 結果
スクリプト実行後にマネジメントコンソールをみると、以下のようにデータが入っていることを確認できます。
4. まとめ
これで、CloudWatchのデータをDynamoDBにためることができました。データさえ残っていれば、あとでいろいろと使えるので安心です。今回のようなカラムが少ないデータをためておきたいときにDynamoDBは便利ですね。
さて、次回です。スクリプトをのせたものの、今回のテーマと違う箇所には触れられませんでしたので、いったんそちらについて書きたいと思います。そのあとにためたデータを取り出すときのことについて書きたいと思います。
いや〜、DynamoDBって本当にいいものですね。