AWS IoTのルールアクションで、別のトピックへRepublishする際にハマったメモです。
やろうとしたこと
- デバイスがAWS IoTにセンサデータをpublishする
- IoTルールでデータを加工し、shadowを更新
今回は2の部分でハマってしまいました。
何が起こったのか
IoTルールでデータを加工し、shadowを更新
これを実現するために、ルールアクションで $aws/things/thingName/shadow/update
に
Republishするように設定していました。
$ aws iot get-topic-rule --rule-name debug
{
"ruleArn": "arn:aws:iot:ap-northeast-1:***",
"rule": {
"description": "色々確認する君",
"ruleName": "debug",
"actions": [
{
"republish": {
"topic": "$aws/things/thingName/shadow/update",
"roleArn": "arn:aws:iam::***"
}
}
],
"sql": "***",
"awsIotSqlVersion": "2016-03-23",
"ruleDisabled": false
}
}
ところが、いつまで待ってもshadowは更新されず、
/update/rejected トピックにも何もメッセージが届きませんでした。
原因
CloudWatchのlogを確認したところ、意図しないトピックへpublishしていました。
[ERROR] EVENT:RepublishActionFailure
TOPICNAME:*** CLIENTID:*** MESSAGE:Failed to republish to topic.
Received Server error. The error code is 403. Message arrived on: ***,
Topic: /things/thingName/shadow/update
どうやら $aws
が意図しない解釈をされているようでした。
ここで、「 $
はもう一つ $
をつけてエスケープする」という記述を前に見たような気がして、
おもむろに $$aws/~
で試してみました。
結果、無事に $aws/things/thingName/shadow/update
へRepublishでき、
shadowを更新することができました。
あとがき
改めて、今回の原因である「 $
はもう一つ $
をつけてエスケープする」という記述を
AWS IoTのドキュメントから探したのですが見つかりませんでした。
ご存知の方が居たら、コメント等いただけますと嬉しいです。