IoTデバイスのイベント検出とアクション実行がラクチンに!!AWS IoT EventsがGAされました

re:Invent 2018で発表された新サービスAWS IoT EventsがついにGAされました!!
2019.06.02

はじめに

サーバーレス開発部@大阪の岩田です。

re:Invent 2018で発表された新サービスAWS IoT EventsがついにGAされました

現在は

  • US East (N. Virginia)
  • US East (Ohio)
  • US West (Oregon)
  • EU (Ireland)

4つのリージョンで利用可能な状態です。

本ブログではチュートリアルを参考に、イベントの検出&SNSの通知までを試してみます。

AWS IoT Eventsってどんなサービス

AWS IoT Eventsの概要についてはこちらのブログをご参照下さい。

[速報]IoTセンサーとアプリケーションからのイベントを簡単に検出して応答できるサービス「AWS IoT Events」が発表されました! #reinvent

ざっくり概要を説明すると、IoTデバイスから送信されるデータパターンの変更を検出し、事前定義したアクションをトリガーできるサービスです。 AWS IoT Eventsを利用すれば、自分で細かなロジックを作り込むことなく簡単に他のAWSサービスを連携させることが可能です。

やってみる

ここから実際にAWS IoT Eventsを触っていきます。

公式ドキュメントで紹介されているチュートリアルGetting Started with the AWS IoT Events Consoleの流れに沿って進めていきます。 このチュートリアルではエンジンで測定された圧力を分析し

  • 一定の閾値を超えた場合に過圧状態へ遷移しSNSメッセージを送信
  • 圧力が3回連続で閾値を下回ると、通常の状態に遷移しSNSメッセージを送信

するモデルを作成します。以後は全てバージニアリージョンを使用して進めていきます。

SNSトピックとIAMロールの作成

まずSNSメッセージ送信用にSNSトピックを作成します

aws sns create-topic --name  underPressureAction --region us-east-1
aws sns create-topic --name  pressureClearedAction --region us-east-1

作成したトピックにEメール等のサブスクリプションを追加しておくと後のテストで利用できます。任意でサブスクリプションを追加しておくと良いでしょう。

作成したSNSトピックに対してIoT EventsからPublishするためにIAMロールを作成します。適当なIAMロールを作成し、以下のようにSNSへのPublishが可能な権限を、信頼されたエンティティにIoT Eventsを設定しておきます。

探知機モデルの作成

マネジメントコンソールから探知機モデルを作成します。

「新しいディテクターモデルを作成」を選択します。

次に入力を作成します。事前に以下のJSONファイルを用意しておきます。

{
  "motorid": "Fulton-A32",
  "sensorData": {
    "pressure": 23,
    "temperature": 47
  }
}

必要事項を入力し、「作成」をクリックします。

探知機モデルの設定

入力が作成できたら探知機モデルの設定を行います。 まず、デフォルトで定義されているState_1という状態を編集します。

「State Name」に「Normal」と入力し、「OnEnter」の右側「イベントの追加」をクリックします。

入力画面で以下のように入力します。

  • イベント名: init
  • イベントの条件: true
  • 変数名: pressureThresholdBreached
  • オペレーションの選択: 値の割り当て
  • 変数の値: 0

入力できたら「Save」をクリック、画面右側ペインのxをクリックし「探知機モデルパレット」まで戻ります。

ドラッグアンドドロップで新しい状態を作成します。

Normalをクリックすると矢印のアイコンが表示されるので、新しく作成した状態までドラッグアンドドロップし、移行イベントを作成します。

作成した移行イベントに以下のように入力します

  • イベント名: Overpressurized
  • イベントのトリガーロジック: $input.PressureInput.sensorData.pressure > 70

入力できたら「アクションの追加」をクリックします。

「移行イベントアクションの追加」に以下のように入力します。

  • 変数名: PressureThresholdBreached
  • オペレーションの選択: 値の割り当て
  • $variable.pressureThresholdBreached + 3

入力できたら「Save」をクリックして保存します。

次に、先ほど追加した状態を選択し、状態名にDangerousと入力、OnEnterの「イベントの追加」をクリックします。

「OnEnterイベントの追加」に以下のように入力し、「Save」をクリックします

  • イベント名: Pressure Threshold Breached
  • イベントの条件: $variable.pressureThresholdBreached > 1
  • イベントアクション: SNSメッセージの送信
  • ターゲットARN: 最初に作成したSNSトピックunderPressureActionのARN

同様に「OnInput イベントの追加」に以下のように入力し、「Save」をクリックします。

  • イベント名: Overpressurized
  • イベントの条件: $input.PressureInput.sensorData.pressure > 70
  • イベントアクション: 変数の設定
  • 変数名: PressureThresholdBreached
  • オペレーション種別: 値の割り当て
  • 変数の値: $variable.pressureThresholdBreached + 3

もう1つOnInputにイベントを追加し、「OnInput イベントの追加」に以下のように入力、「Save」をクリックします。

  • イベント名: Pressure Okay
  • イベントの条件: $input.PressureInput.sensorData.pressure <= 70
  • イベントアクション: 変数の設定
  • 変数名: PressureThresholdBreached
  • オペレーション種別: Decrement

同様にOnExitにもイベントを追加し、以下のように入力、「Save」をクリックします。

  • イベント名: Normal Pressure Restored
  • イベントの条件: true
  • イベントアクション: SNSメッセージの送信
  • ターゲットARN: 最初に作成したSNSトピックpressureClearedActionのARN

先ほどと同様の手順でDengerousからNormalへの移行イベントを作成します。

移行イベントに以下のように入力します。

  • イベント名: BackToNormal
  • イベントのトリガーロジック: $input.PressureInput.sensorData.pressure <= 70 && $variable.pressureThresholdBreached <= 0

最後に「開始」に設定されて「目的状態」が「Normal」になっていることを確認します。

確認できたら「発行」をクリックし、「探知機モデルの公開」に以下のように入力します。

  • Detector ModelName: motorDetectorModel
  • ロール: 最初に作成したIAMロール
  • 探知機生成メソッド: 一意のキー値ごとに探知機を作成する
  • 探知機生成キー: motorid

無事に探知機モデルが発行されました!

テスト

ここからはIoT Coreのコンソールでテストを行います。 まずはルールエンジンを作成します。ルールクエリステートメントにSELECT *, topic(2) as motorid FROM 'motors/+/status'と設定して下さい。

続いてアクションの設定です。アクションに「IoT Envetsに入力メッセージを送信する」を選択して下さい。

続いてアクションの設定です。入力名には先ほど作成したIoT Eventsの入力PressureInputを選択し、「ロールの作成」からIAMロールを自動作成して設定します。

設定できたらルールエンジンを保存します。テスト画面からトピックmotors/A32/statusに対して以下のJSONデータをPublishします。

{
  "sensorData": {
    "pressure": 23,
    "temperature": 47
  }
}

PublishできたらIoT Eventsのコンソールを確認してみましょう。

現在の状態「Normal」として検出できていますね! 次にJSONデータのpressureを85に設定して再度Publishしてみましょう。

現在の状態が「Dangerous」に変わりました。 SNSにサブスクリプションを設定していた場合はSNSからメッセージも届いています。

次はpressureを10に変えて連続で3回Publishしてみましょう。

現在の状態が「Normal」に復旧しました!!

まとめ

GAされたばかりのAWS IoT Eventsを触ってみました。 今回紹介したチュートリアルの要件をIoT Events無しで実現する場合、デバイスの状態を追跡するためにDynamoDBのようなデータストアを用意したり、自前でLambdaを書いたり、色々と準備が必要でしたが、IoT Eventsの登場によって、簡単にビジネスロジックが実装できるようになりました。 早く東京リージョンにも来て欲しいですね!