CloudWatchアラームでパトライトを光らせる(2)

前回、CloudWatchアラームでパトライトを光らせることができましたが、Lambda関数が2つに分かれていると不便なので、1つにまとめてみました。


前回の方法では、Lambda関数は、以下の2つを別々に用意しました。

前回、用意したLambda関数
  1. アラーム状態が発生したときに(アラーム通知)、パトライトを点灯する
  2. アラーム状態から回復したときに(OK通知)、パトライトを消灯する

上流となるSNSのトピックも、アラーム通知とOK通知とで別々になってしまっています。

前回の方法では、アラーム通知/OK通知のトピック/関数が別々

一方、CloudWatchアラームから、メールやSlackなどへ通知する場合は、通常、SNSのトピックは、アラーム通知もOK通知も同じです(送信内容が違うだけで送信する仕組みは同じため)。

メールへ通知する場合、アラーム通知/OK通知は同じトピックになる

このため、前回のLamba関数では、パトライトを、メールやSlackなどへの通知と同じトピックにまとめることができません。

たとえば、CloudWatchアラームの設定が100あり、すでにメールへの通知が(アラーム通知/OK通知が共に)設定されているとします。ここに、パトライトの設定を追加する場合を考えてみましょう。
メールと同じトピックにまとめられる場合は、SNSのサブスクリプション設定を、たった1か所追加するだけです。非常に簡単です。
一方、メールと同じトピックにまとめられない場合は、100のCloudWatchアラームすべてについて、アラーム通知とOK通知の2か所の設定を追加する必要があります(合計200か所)。

ということで、Lambda関数を1つにまとめることにしました。SNSメッセージの内容で、点灯/消灯を判断するように作り直します。

こうすれば、メールやSlackなどへの通知と、パトライトへの通知を同じSNSトピックにまとめることができます。

メールへの通知とパトライトへの通知を同じトピックにまとめられる

SNSメッセージを取り出して、条件で動作を切り替える

Lambda関数のコード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const https = require('https');
const iftttUrl = "https://maker.ifttt.com/trigger/";
const iftttPre = "/with/key/";
const iftttKey = "{your_key}";

exports.handler = async function(event) {

const message = JSON.parse(event.Records[0].Sns.Message);
const newState = message.NewStateValue;
let iftttEvent;
if (newState === "ALARM") {
iftttEvent = "turn_on_patlite";
} else if (newState === "OK") {
iftttEvent = "turn_off_patlite";
};
let url = iftttUrl + iftttEvent + iftttPre + iftttKey;

const promise = new Promise(function(resolve, reject) {
https.get(url, (res) => {
resolve(res.statusCode);
}).on('error', (e) => {
reject(Error(e));
});
});
return promise;

};
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のメリットを生かすことが可能です。