AWS IoT Events を用いた開発の際、テストデータ送信が必要となります。
コンソールから [データを送信する] > [サンプルデータを送信] でも、データを送り込むことは可能です。
これを AWS CLI(v2) で実現する方法が本エントリーとなります。
論よりコード (TL;DR)
Input(入力) IoTData1
に対し {"id":"id1","v1":25.0,"v2":"foobar","v3":false}
というデータを送りたい場合:
$ aws iotevents-data batch-put-message \
--messages messageId=${RANDOM},inputName=IoTData1,payload=$(echo '{"id":"id1","v1":25.0,"v2":"foobar","v3":false}' | base64 -w0)
※ AWS CLI v2 を使用
※ 要 base64
コマンド (Ubuntu なら coreutils に入ってます)
解説
私の好きな AWS IoT Events は、デバイスのステートマシン(状態遷移)を簡潔に実装できます。
基本的な話は AWS IoT Events は IoT デバイスの「ステートマシン」 をご覧ください。
AWS IoT Events の実装は "Input(入力)" と "Detector Model(探知機モデル)" の2つで構成されています。
- Input: スキーマのようなものです。どのような入力がされるのかを Input 内であらかじめ定義しておきます。
-
Detector Model: 状態遷移そのものです。 Input からの入力は
$input.INPUT_NAME.json_path
で参照できます。
Detector Model を動かすためには Input にデータを送信します。そして、その Input を参照している Detector Model が実行されるため、 Input がエントリーポイントであると言っても良いでしょう。
AWS CLI(v2) で AWS IoT Events にデータを送る
AWS IoT Events の Input へのデータ送信を AWS CLI で行う場合は iotevents-data
サブコマンドを使います。
--messages
には3つのパラメータを設定します。
-
messageId
: 送信データの ID。ともかく一意になれば何でもよいです。CloudWatch Logs で探すときに使うくらい。例では Bash の ${RANDOM} で生成しています。uuidgen -r
でもいいでしょう。 -
InputName
: 送信先の Input 名。 -
payload
: Detector Model に送信する実データ。
$ aws iotevents-data batch-put-message \
--messages messageId=${RANDOM},inputName=IoTData1,payload=$(echo '{"id":"id1","v1":25.0,"v2":"foobar","v3":false}' | base64 -w0)
もしくは JSON で入力する場合は以下の通り
$ aws iotevents-data batch-put-message \
--messages '{"messageId":"1","inputName":"IoTData1","payload":"'$(echo '{"tid":"id1","tmpr":25.0}' | base64 -w0)'"}'
payload の base64
payload は blob となっており、base64 encoded textで送ることになるため base64
でエンコードしています。
※ AWS CLI v2 では blob は Base64 encoded text がデフォルトとなりました。
※ payload は This can be a JSON string or a Base-64-encoded string representing binary data (in which case you must decode it). となっているのですが、 payload="{\"id\":\"id1\",\"v1\":25.0,\"v2\":\"foobar\",\"v3\":false}"
は NG でした。なんかいい方法無いのでしょうか🤔
あとがき
もうすぐお盆休みですね!
EoT