Top View


Author Yuhei Okazaki

IoT開発者必携!AWS IoT Eventsを使ってアラート機能を作る

2022/03/11

アラート機能の難しさ

アラート機能は、センサーの値としきい値を比較して、しきい値を超えていたらメールを送信するシンプルな機能に見えますが、きちんと実装するとなかなか奥が深い機能でもあります。つまづきやすい点として以下が挙げられます。

  • 前回の値がしきい値を下回っていて、今回の値が上回ったときのみアラートを出す
  • アラートの発生だけではなく、解決もチェックする
  • (IoTなので)デバイスの増加に合わせてスケーラブルにする必要がある

これまで、DynamoDB StreamsとLambdaを組み合わせてこれらを慎重に実装していました。

今回試した構成

今回は以下のような構成で構築しました。IoT Coreが受信したデータをIoT Eventsに流し、アラートが発生・解決したタイミングでSNS経由でメール通知します。

下準備: AWS SNSのトピックとサブスクリプションを作る

今回はSNSを使ってアラートを通知するため、予めSNSのトピックとそれに紐付けたサブスクリプションを作成しておきます。

AWS IoT Eventsの入力を作る

AWS IoT Eventsを使用する際、最初に「入力」と呼ばれるリソースを作成します。「入力」にはその名の通り入力されるJSONのスキーマを定義しておきます。

今回は以下のようなJSONファイルを作成し、それをアップロードすることで入力を作成しました。

{
    "deviceId": "abc", // デバイスID
    "temperature": 1,  // 温度
    "himudity": 2      // 湿度
}

AWS IoT Eventsのアラームモデルを作る

続いて、今回のメインとなる「アラームモデル」を作成します。今回は温度が40℃を超えた時に、通知を行うよう設定しました。

アラームターゲットにて先ほど作成した「入力」と「入力属性キー」を選択します。入力属性キーの値ごとに独立してアラートを判定するので、デバイスの数の増加に追従することができます。

しきい値の定義にて「入力属性」「演算子」「値」を設定します。このあたりはAmazon CloudWatch のアラームと似ていますね。

通知設定でメール通知ができるようなのですが、Amazon SESの設定をしておく必要があったので今回はここを空にしました。

代わりに詳細設定の「アラーム状態のアクション」にて先ほど作成したSNSトピックを選択しています。

AWS IoT EventsロールにSNSへのPublish権限を付与している点に注意してください。

ここまでの入力内容で作成をクリックするとアラームモデルが作成されます。

AWS IoT CoreのACTを作る

最後にAWS IoT CoreのACTを作成します。指定したTopicにデータが送信されたら、IoT Eventsの入力にデータを流すよう設定します。

ルールクエリステートメントは特定のトピックへ送信されたJSONをそのまま選択するシンプルなものです。

アクションは IoT Events 入力にメッセージを送信する を選択してこのように設定します。ロールはなければ新規作成しましょう。

これで準備完了です。

mockmockからデータを送信してみる

今回は弊社サービスである mockmock を利用して、AWS IoT Coreに対して以下のようなJSONデータを送信しました。

temperature の値はグラフバリュージェネレーターを使うことで、このように推移させています。(値の範囲は0〜60℃としています)

mockを起動して10秒ごとに10分間データを送信すると、しきい値である40℃を超えたタイミングでメールが送信されました。

また、40℃を下回ったタイミングでもメールが届きました。

今回、mockは2台起動してdeviceIdを別々の文字列にしていたのですが、漏れなく2台分の通知メールが飛んできました。

応用例

通知方法をメール以外に変更したくなった場合、SNSをトリガーとしてLambdaを実行させることで、応用が効きそうです。

アラームのしきい値をWeb画面から変更したい、というユースケースもありそうです。AWS SDKを使ってアラームモデルのしきい値を更新することで、こういった要件にも対応が可能ですね。

まとめ

タイトルで謳っているとおり、IoT開発者には必携のサービスだと思いました。IoTを使ってセンサー値を監視したい人はぜひお試しください。

Yuhei Okazaki

Yuhei Okazaki

Twitter X

2018年の年明けに組込み畑からやってきた、2児の父 兼 Webエンジニアです。 mockmockの開発・運用を担当しており、組込みエンジニア時代の経験を活かしてデバイスをプログラミングしたり、簡易的なIoTシステムを作ったりしています。主な開発言語はRuby、時々Go。