AWS IoT Coreのトピック、8階層までしか通らない

  • AWS
  • IoT
  • MQTT

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

制限について

AWS IoT CoreのMQTTトピックは実質最大8階層までしか使えないらしい。9階層以上のトピックはパブリッシュもサブスクライブも弾かれる。公式ドキュメントに階層数の上限として明記されているわけではないけど、サービス側のハードリミットで緩和申請も効かないとのこと。

他にも決まりがいくつかある。

  • トピック全体の長さは256文字まで(UTF-8)
  • $aws/で始まるトピックは予約済み
  • ワイルドカード+と#はSubscribe専用、Publishでは使えない
  • =はただの文字として使えるので、org=xxxのようなキー=バリュー的な書き方をしても問題ない(org=+のように+と組み合わせて1階層ワイルドカードにするのも可)

設計の変遷

最初に考えてたトピックはこんな感じだった。

example/{tenantId}/resource/{resourceId}/device/{deviceId}/event-a1a/v1/{sessionId}

数えると9階層あって、そのままだと制限に引っかかる。

バージョン(v1)は残したかったので、APIのパスと同じ考え方で先頭に持ってくることにした。

あと別でリソースの状態っぽい情報を送るトピックも用意してたんだけど、案の段階でresourceが2回出てくる形になっていた。さすがに意味が曖昧になるので、そっちはevent-a1bに置き換えた。

最終形

v1/{tenantId}/resource/{resourceId}/device/{deviceId}/event-a1a/{sessionId}
v1/{tenantId}/resource/{resourceId}/device/{deviceId}/event-a1b/{sessionId}

数えると8階層で、ギリギリ制限内に収まった。

今後項目を増やしたくなったら、階層を増やすんじゃなくてpayload側で対応する方針にした。