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

アラートの緊急性を可視化するために、AWSの監視システムCloudWatchアラームの発生で、パトライトを点灯させてみました。


インフラ・エンジニアには、アラート対応がつきものです。
そこで、緊急のアラートであることを可視化するために、CloudWatchアラームが発生すると、パトライトを点灯させる仕組みを考えてみました。

スマートプラグなら簡単に実現

正攻法としては、Raspberry PiやESP32などを用いてリレーを制御し、パトライトのスイッチをオン/オフするという電子工作的な手法が考えられます。
しかし、この方法はかなり手間がかかります。リレー回路の用意のほか、LAN上のRaspberry PiやESP32を、Webから制御するための仕組みも必要です。

ここでは、より簡単に実現するために、市販のスマートプラグ(スマートコンセント)を利用することにしました。

IFTTT対応のスマートプラグを使う

TP-Link製などの一部のスマートプラグは、IFTTTに対応しており、他のWebサービスから簡単に制御できます。
IFTTTというのは、さまざまなWebサービス同士を連携できるWebサービスで、無料で利用可能なもの。
これらを使うことで、Webから制御可能なリレーが簡単に実現できます。

構成はこんな感じです。

システム構成

CloudWatchアラーム → SNS → Lambda関数 → IFTTT Webhooks → スマートプラグ → パトライト
システム構成

CloudWatchアラームからSNSへの部分は、アラート設定の定石です。通常は、この後、メールやSlackなどにつながっていきますが、今回は、パトライトに向けて、つなげていきます。
次の部分ですが、本来は、SNSから外部のWebhooksを直接呼び出せます。ところが、SNSにWebhooksを登録する際に、設定ミスや不正を防ぐため、確認作業が必要なのですが、IFTTT Webhooksの仕様では、これができません。そこで、登録時に確認作業が不要なLambda関数を挟んでいます。
Lambda関数経由でIFTTT Webhookが呼び出しされると、スマートプラグがオンになり、最終的にパトライトが点灯することになります。

用意したもの
品名 メーカー 型番 実売価格
パトライト OHM ORL-1 1,700円程度
スマートプラグ TP-Link HS105 2,200円程度

用意したハードウェア

スマートプラグで利用するため、パトライトは、100V AC電源対応のものを選びました。

スマートプラグを設定する

設定については、以下の通りです。
なお、IFTTTの設定は、下記の記事を参考にさせていただきました。

WebhookをトリガーにIFTTT経由でスマートプラグを操作!

スマートプラグは、スマホのアプリ「Kasa Smart」を使って、WiFiや名称などの設定を行ないました。アプリの指示に従って、設定しました。

IFTTTを設定する

IFTTTの利用が初めての場合は、アカウント登録をしてから、サインインする必要があります。GoogleやFacebookのアカウントでもサインインできます。

IFTTTの設定は、下記の手順を2回繰り返し、イベント名「turn_on_patlite」と動作「Turn on」の組み合わせと、イベント名「turn_off_patlite」と動作「Turn off」の組み合わせを設定しました。

IFTTTの設定手順
  1. メニューの「Create」をクリック

  2. 「If This Then That」の「This」をクリック

  3. 「Webhooks」を検索し、クリック

  4. 「Connect」をクリック(初回のみ)

  5. 「Receive a web request」をクリック

  6. イベント名(turn_on_patlite/turn_off_patlite)を入力

  7. 「Create trigger」をクリック

  8. 「If This Then That」の「That」をクリック

  9. 「TP-Link Kasa」を検索し、クリック

  10. 「Connect」をクリック(初回のみ)

  11. スマホのアプリで設定した情報でサインイン(初回のみ)

  12. 設定する動作(Turn on/Turn off)をクリック

  13. パトライトをつなげたスマートプラグを選択

  14. 「Create action」をクリック

  15. 「Finish」をクリック

IFTTT WebhooksのURLは、メニューの「My services」→「Webhooks」→「Doucumentation」とクリックしていくと、次のような形式で表示されます。

https://maker.ifttt.com/trigger/{event}/with/key/{your_key}

{event} のところには turn_on_patlite または turn_off_patlite が入ります。 {your_key} はIFTTTアカウントごとに異なるキー(22文字の英数字)です。

メニューから「My services」→「Webhooks」→「Doucumentation」
すると、IFTTT WebhooksのURLが表示される

このURLをコピペして、ブラウザでアクセスするだけで、パトライトが点灯したり、消灯したりします。

Lambda関数を作成

Webhookを叩くためのLambda関数を用意します。
Node.jsは勉強中のため、今回は、AWSのサンプルコードをそのまま利用してしまいました。

Node.js の AWS Lambda 関数ハンドラー

サンプルコードをそのまま使うため、パトライトの点灯/消灯について、それぞれ1つずつ関数を作成します(アクセスするURLのみ異なります)。
下記コード中、 your_key のところは、IFTTTアカウントごとに異なるキー(22文字の英数字)です。

Lambda関数のコード(点灯側)
1
2
3
4
5
6
7
8
9
10
11
12
13
const https = require('https')
let url = "https://maker.ifttt.com/trigger/turn_on_patlite/with/key/{your_key}"

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

Lambda関数の作成画面では、次のように設定しました。

Lambda関数の設定(点灯側)
設定項目 設定内容
関数名 turn_on_patlite
ランタイム Node.js 12.x
実行ロール 基本的なLambdaアクセス権限で新しいロールを作成

index.js に上記のコードを入力し、デフォルト設定のまま保存しました。

テストして、パトライトが点灯したので、問題なさそうです。なお、今回は、受け渡しのパラメータは無視されますので、テストイベントは、デフォルトのパラメータのまま、イベント名だけtestと入力して作成しました。

SNSの設定

パトライトの点灯/消灯を別々の関数にしたため、SNS(Simple Notification Service)でも、トピックを点灯/消灯で別々に作成しました。

トピックの設定内容(点灯側)
設定項目 設定内容
名前 TurnOnPatlite
表示名 TurnOnPatlite

それぞれのトピックには、1つずつサブスクリプションを作成しました。

サブスクリプションの設定内容(点灯側)
設定項目 設定内容
トピックAPN 作成したトピックを選択
プロトコル AWS Lambda
エンドポイント 作成したLambda関数を選択

CloudWatchアラームの設定

パトライトを点灯させたいアラームの通知設定で、次のように設定しました。

CloudWatchアラームの通知設定
状態 通知の送信先
アラーム TurnOnPatlite
OK TurnOffPatlite

以上で完成です。

アラーム状態になると、パトライトが点灯し、状態が回復すると、パトライトが消灯します。

パトライトが点灯する

クラウドからリアルを操作できる

Lambda関数を挟まないといけない点だけ、注意する必要がありますが、電子工作が不要なので、かなり手軽に実現できました。

何より、スマートプラグを使うことにより、クラウドから「リアル」の操作が簡単にできることがわかりました。アラートの可視化以外でも、面白いことに活用できそうですね。