本来の用途を無視して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