前回、CloudWatchアラームでパトライトを光らせることができましたが、Lambda関数が2つに分かれていると不便なので、1つにまとめてみました。
前回の方法では、Lambda関数は、以下の2つを別々に用意しました。
前回、用意したLambda関数
- アラーム状態が発生したときに(アラーム通知)、パトライトを点灯する
- アラーム状態から回復したときに(OK通知)、パトライトを消灯する
上流となるSNSのトピックも、アラーム通知とOK通知とで別々になってしまっています。
一方、CloudWatchアラームから、メールやSlackなどへ通知する場合は、通常、SNSのトピックは、アラーム通知もOK通知も同じです(送信内容が違うだけで送信する仕組みは同じため)。
このため、前回のLamba関数では、パトライトを、メールやSlackなどへの通知と同じトピックにまとめることができません。
たとえば、CloudWatchアラームの設定が100あり、すでにメールへの通知が(アラーム通知/OK通知が共に)設定されているとします。ここに、パトライトの設定を追加する場合を考えてみましょう。
メールと同じトピックにまとめられる場合は、SNSのサブスクリプション設定を、たった1か所追加するだけです。非常に簡単です。
一方、メールと同じトピックにまとめられない場合は、100のCloudWatchアラームすべてについて、アラーム通知とOK通知の2か所の設定を追加する必要があります(合計200か所)。
ということで、Lambda関数を1つにまとめることにしました。SNSメッセージの内容で、点灯/消灯を判断するように作り直します。
こうすれば、メールやSlackなどへの通知と、パトライトへの通知を同じSNSトピックにまとめることができます。
SNSメッセージを取り出して、条件で動作を切り替える
Lambda関数のコード
1 | const https = require('https'); |
Lambda関数の設定
設定項目 | 設定内容 |
---|---|
関数名 | turn_patlite |
ランタイム | Node.js 12.x |
実行ロール | 前回のturn_on_patliteと同じもの |
前回と異なるのは、URLの決め方です。
具体的には、まず、 event.Records[0].Sns.Message
からSNSのメッセージを取り出します。テキストとして格納されているため、JSONに変換して message
に代入しています。
次に、 message.NewStateValue
の値によって、パトライトを点灯(ALARMの場合)/消灯(OKの場合)するか決め、呼び出すURLを変更します。
通知のSNSトピックをまとめられる
あとは、既存のSNSトピックに、今回のLambda関数へのサブスクリプションを追加するだけです。
通知のSNSトピックを、Critical/Warning等のようにレベル分けをしていれば、パトライトはCriticalのトピックだけに追加するなど、通知方法の調整が簡単に行なえます。多対多のPub/SubメッセージングサービスであるSNSのメリットを生かすことが可能です。