本来の用途を無視してAWS IoT EventsでTodoリストを作る
AWS IoT Eventsとは?
AWS IoT Eventsは有限オートマトンを提供するAWSサービスです。

上記画像はBlack Beltから引用ですが、GUIで有限オートマトンを描いているのが見て分かるかと思います。
有限オートマトンということは有限ステートマシンであり、すなわち状態管理をすることが出来ます。本来はIoT機器の状態変化に応じて特定の処理をしたりアラームを出したりすることを想定しているサービスと思われますが、状態管理が必要なのはIoTだけではないです。
ということで、IoT関係ないアプリを作ってみようと思います。
AWS IoT EventsでTodoリストを作る
入力を定義する
まずはIoTイベントの右のメニューから「入力」を選んで入力を作成します。

入力はJSON形式です。今回は、シンプルにこんな感じの入力にしました。
{
"id": 1,
"title": "title",
"done": false
}

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

図は見た通りです。
-
todoとdoneの2つの状態があります。 - 開始時は
todoです。 - 移行イベントである
doが発火すると、todoからdone状態が移動します。
イベントを設定する
doの発火条件は先程定義した入力のdoneがtrueであることなので、イベントのトリガーロジックに次のように書きます。
$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でコード化しました。
今後
このままだとどう考えても使い勝手は良くないので、Webアプリから呼び出して使えるようにしたいなぁと思います。ただ記事が長くなってしまいますし、内容的にも違う話になってくるので、また別の機会にやりたいと思います。
Discussion