🐟

AWS IoT Coreを使って、MQTTなデバイスとHTTPで会話する

2023/05/12に公開

概要

既存システムで、WebサーバーへMQTTクライアントを導入できないけども、MQTTを話すIoTデバイスと通信するケースを考えます。

Webサーバーからは、HTTリクエストでPublishします。

Webサーバー -HTTP-> IoT Core -MQTT-> IoTデバイス

IoT CoreでIoTデバイスを講読したデバイスデータは、WebサーバーにHTTPでリクエストします。

デバイス -MQTT-> IoT Core -HTTP-> Webサーバー

WebサーバーからHTTPリクエストでPublish

https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/custom-auth-tutorial.html#custom-auth-tutorial-authorizer

公式のやりかたで全て情報は揃っているので、要点だけ書くと以下です。
今回は、リクエスト元を検証するために、トークンを付与します。

  • RSA鍵を作って秘密鍵、公開鍵を生成
  • IoT Coreのオーソライザーを公開鍵と一緒に登録
  • Publishの認可をLambdaで行うため、Lambdaを実装してオーサライザーと紐付ける
  • 検証自体はオーソライザーが行い、検証成否を含むパラメータでLambdaが呼ばれる
  • Lambdaで、認可を応答し、IoT CoreがPublishする

講読データをHTTPリクエストでパススルー

https://dev.classmethod.jp/articles/iot-rule-http-action/

IoT Coreで講読したデータを、HTTPリクエストで転送するルールを書けます。
このポストを参考に構築できると思いますが、ポイントは以下です。

  • IoT Coreのメッセージのルーティングで送信先を事前登録する
  • 実際にエンドポイントとして利用する前に、所有確認が必要
  • 確認用トークンをリクエストさせて、confirmationTokenを検証する
  • ルールにHTTPS endpointを登録。送信先を上記で登録した送信先にする

確認用トークンは、JSONでPOSTされるので、それを待ち受けます。
HTTPリクエスト時にヘッダーに任意の値を付与できるので、受信側がリクエスト元を検証できるようVerify用の値を入れておくのもありかと思います。

最後に

API GatewayとLambda等で、MQTTを代行するようなProxyを書いてもいいのですが、認可のコードを書くだけでパススルーできるので、ほぼノーコードのこの方法もニーズにあわせて利用できると思います。

Discussion