🍅

本来の用途を無視してAWS IoT EventsでTodoリストを作る

2023/08/14に公開

AWS IoT Eventsとは?

AWS IoT Eventsは有限オートマトンを提供するAWSサービスです。


上記画像はBlack Beltから引用ですが、GUIで有限オートマトンを描いているのが見て分かるかと思います。

有限オートマトンということは有限ステートマシンであり、すなわち状態管理をすることが出来ます。本来はIoT機器の状態変化に応じて特定の処理をしたりアラームを出したりすることを想定しているサービスと思われますが、状態管理が必要なのはIoTだけではないです。

ということで、IoT関係ないアプリを作ってみようと思います。

AWS IoT EventsでTodoリストを作る

入力を定義する

まずはIoTイベントの右のメニューから「入力」を選んで入力を作成します。

入力はJSON形式です。今回は、シンプルにこんな感じの入力にしました。

todo.json
{
    "id": 1,
    "title": "title",
    "done": false
}

探知機モデルを作る

GUIでモデルを書く

続いて探知機モデルを作ります。GUIでポチポチやればできます。
とりあえず、単純にこんな感じにしました。

図は見た通りです。

  • tododoneの2つの状態があります。
  • 開始時はtodoです。
  • 移行イベントであるdoが発火すると、todoからdone状態が移動します。

イベントを設定する

doの発火条件は先程定義した入力のdonetrueであることなので、イベントのトリガーロジックに次のように書きます。

$input.ibaraki_test_task.done == true

また、titleを変数として保持したいので、titleを保存するeventを作っています。

  • setTitle

    • 入力にtitleが指定されたとき、変数titleに入力値を保存します。
    • 発火条件は、! isUndefined( $input.ibaraki_test_task.title )
  • setDefaultTitle

    • 作成時にtitleが指定されていなければ、適当にtitleを入れておくイベントです。
    • 別に無くても良かったですが、おまけで作りました。

探知機モデルを公開する

あとは公開すればOKです。

  • ロールは既存に存在しないIAMロール名を入れるとデフォルト設定で自動で作ってくれます
  • 探知器生成メソッドは一意のキー値にして、キーはidを指定します。

保存して発行すると、とりあえず完成です。

試す(IoT Eventsに直接データを投げ込む)

探知機モデルの画面にサンプルデータを送信ボタンがあるので、送信してみます。

GUIからサンプルのデータを入れます。

送信すると無事ディテクターが作られます。


キーが1で、状態がtodo、変数のtitleがhogeなので想定通りです。

IoT Coreからデータを受け取る

この時点で完成でもいいのですが、個人的には、このペイロードの投げ方が気に入らないです。

{
    "messages": [
        {
            "inputName": "ibaraki_test_task",
            "messageId": "43d03808-4d10-4dd1-b558-67b1458f1efe",
            "payload": "{\"id\":1,\"title\":\"hoge\",\"done\":false}"
        }
    ]
}

ということで、IoT Coreにtopicを発行したときにIoT Eventに入力されるようにします。

IoTルールを作る

IoT Coreのメニューからルールを選択、新規ルールを作ります。

  • SQLステートメントは、SELECT * FROM 'ibaraki/test/todo'
  • ルールアクションで、最初に作ったIoT Eventsの入力を指定

以上で、IoTルールができました。

試す(IoT Coreからデータを投げ込む)

MQTTテストクライアントから、トピックをPublishして、先程作ったタスクをdoneにします。

doneになりました。

いくつかPublishすると、todoリストっぽい物ができました。

以上でAWS IoT Eventsを使ってtodoリストが作れたと言って良いかと思います。

CDK書きました

せっかくなので、ここまでのインフラをCDKでコード化しました。
https://github.com/k-ibaraki/todo-with-iot-events

今後

このままだとどう考えても使い勝手は良くないので、Webアプリから呼び出して使えるようにしたいなぁと思います。ただ記事が長くなってしまいますし、内容的にも違う話になってくるので、また別の機会にやりたいと思います。

Discussion