CloudWatch Alarmでメール通知する際に一緒にグラフ画像を添付してみた

CloudWatch Alarmでメール通知する際に、一緒にメトリクスのグラフ画像を添付してみた。
2018.09.28

はじめに

おはようございます、加藤です。 先日、24日にCloudWatchに画像(スナップショット)を取得する機能がリリースされました。これによってCloudWatch Eventでアラートを通知した際に、一緒に画像を添付することができます。アラートを受け取った際にCloudWatchの画面を開かなくても、発生前までの傾向を瞬時に捉えることができるようになりました。

Amazon CloudWatch に、AWS コンソール以外でカスタムダッシュボードを作成できる機能が追加されました。

やってみた

Reduce Time to Resolution with Amazon CloudWatch Snapshot Graphs and Alerts | AWS DevOps Blog 上記のブログを参考に実装してみます。

今回はSESを使用しサンプルコードをそのまま使用します。 そのためSESが存在するリージョンの方が都合良いので、オレゴン(us-west-2)リージョンをで構築します。

EC2インスタンスの作成

以下のスペックでEC2インスタンスを用意します。

OS インスタンスタイプ IAMロール
Amazon Linux2 t3.nano cloudwatch-snapshot-graph

SSMのロールは検証の為の操作を行う為に付与しています。必須ではありません。

Lambda関数の作成

IAMロールの作成

  • CloudWatchReadOnlyAccess
  • AmazonSESFullAccess
  • AmazonSNSReadOnlyAccess

上記のポリシーがアタッチされたIAMロールを作成します。ロール名は lambda_cloudwatch_snapshot_graph としました。

関数の作成

Lamba関数を作成します。

名前 ランタイム ロール
snapShotAlarmDemo Node.js 6.10 lambda_cloudwatch_snapshot_graph

Githubからサンプルコードをクローンし、npm installしてからZIPを作成します。

git clone https://github.com/aws-samples/aws-cloudwatch-snapshot-graphs-alert-context
cd aws-cloudwatch-snapshot-graphs-alert-context/
npm install
zip -r snapshotgraphsalarmdemo.zip ./*

作成したZIPをアップロードし、タイムアウトを30秒に変更して保存します。

ハンドラ
emailer.myHandler

環境変数を設定します。

Key Value Comment
EMAIL_TO_ADDRESS to_mail_address 送信先メールアドレス
EMAIL_FROM_ADDRESS from_mail_address 送信元メールアドレス

SNSトピックを作成する

トピックを作成します。

トピック名 表示名
snapShotAlarmDemo D_ssAlarm

サブスクリプションを作成します。

トピックARN プロトコル エンドポイント バージョンまたはエイリアス
arn:aws:sns:us-west-2:アカウント番号:snapShotAlarmDemo AWS Lambda arn:aws:lambda:us-west-2:アカウント番号:function:snapShotAlarmDemo

SESの設定

SESに送信元メールアドレスを登録(所有証明)します。

下記タイトルのメールが届くのでリンクをクリックして承認します。

Amazon Web Services – Email Address Verification Request in region US West (Oregon)

承認後はステータスがverifiedに変化します。

CloudWatch Alarmの作成

CloudWatch Alarmを作成します。

CPUUtilizationを対象に作成します。

動作テスト

Alarmのしきい値を>=0に変更して強制的に通知を飛ばしてみます。

無事にグラフ付きでメールが届きました!

あとがき

参考元の写経ですが、通知に画像を追加することができました。 これを参考にすれば、Lambda関数を変更すればSlackやChatworkへ通知を行うことができそうですね! 既にLambda関数を使って通知を行っている方にはGithubに上がっているサンプルコードを参考にすれば簡単だと思うので是非試して見てくださいー 私もそのうち書こうと思います!