はじめに
AWS IoT Eventsのイベントに設定できるカスタムペイロードでJSONオブジェクトやJSONオブジェクト配列を設定する方法を紹介する。カスタムペイロードは制約が多く、癖があり結構はまったのでメモとして残す。カスタムペイロードの記載については、別記事を記載したので参照。
動作確認環境
- AWS IoT Events
- AWS IoT SQLルールエンジン
- バージョン:2016-03-23
方法
JSONオブジェクトやJSONオブジェクト配列をカスタムペイロードを送るには、オブジェクト全体を文字列化して、配列内の全ての文字列をエスケープ処理を施す必要がある。
具体例として、以下のJSONオブジェクト配列をカスタムペイロードとして送る方法を示す。
"devices": [
{
"name": "device_name1",
"value": 1
},
{
"name": "device_name2",
"value": 2
}
]
上記のカスタムペイロードは、以下のようになる。
'
{
"devices": "[
{
\"name\": \"device_name1\",
\"value\": 1
},
{
\"name\": \"device_name2\",
\"value\": 2
}
]"
}
'
- ポイント
- JSONオブジェクト配列
[]
全体を文字列とする - 配列内の文字列に
\
を入れてエスケープ処理する
- JSONオブジェクト配列
AWS IoTルールを使う場合
AWS IoTルールで、MQTTのJSONオブジェクトやJSONオブジェクト配列をAWS IoT Eventsに送りカスタムペイロードにしたい場合は、IoTルールでcast関数を使う。SQL バージョン 2015-10-08 以降でサポートされている。
cast(値 as 型)のように使う。
例:
cast(true as Int) = 1
JSONオブジェクトやJSONオブジェクト配列は、このcast関数を使うことで、エスケープ処理された文字列として変換することができる(以下を公式ドキュメントより抜粋した図を参照)。
以下に例を示す。
"devices": [
{
"name": "device_name1",
"value": 1
},
{
"name": "device_name2",
"value": 2
}
]
以下のように、devicesをcast関数で文字列に変換する。
SELECT cast(devices as String) AS devices FROM '/topic/subtopic'
以下のように文字列として出力される(改行はなくなる)。
{
"devices": "[{\"name\":\"device_name1\",\"value\":1},{\"name\":\"device_name2\",\"value\":2}]"
}
このようにcast関数を使い、AWS IoT Eventsへ出力することで、以下のようにAWS IoT Eventsのカスタムペイロードへ文字列としてそのまま設定することができる。
'
{
"devices": ${$input.<inputName>.devices}
}
'
- <inputName>: AWS IoT Eventsの入力名
- ポイント
- 入力が既に文字列となっているので、ダブルクォーテーション(
"
)をつけない
- 入力が既に文字列となっているので、ダブルクォーテーション(
まとめ
AWS IoT Eventsのイベントに設定できるカスタムペイロードでJSONオブジェクトやJSONオブジェクト配列を設定する方法を紹介した。AWS IoTルールとAWS IoT Eventsを駆使してサーバーレスで簡単に処理を書きたいときに有用なので試してみて欲しい。
参考