🐟
AWS IoT Coreを使って、MQTTなデバイスとHTTPで会話する
概要
既存システムで、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
公式のやりかたで全て情報は揃っているので、要点だけ書くと以下です。
今回は、リクエスト元を検証するために、トークンを付与します。
- RSA鍵を作って秘密鍵、公開鍵を生成
- IoT Coreのオーソライザーを公開鍵と一緒に登録
- Publishの認可をLambdaで行うため、Lambdaを実装してオーサライザーと紐付ける
- 検証自体はオーソライザーが行い、検証成否を含むパラメータでLambdaが呼ばれる
- Lambdaで、認可を応答し、IoT CoreがPublishする
講読データをHTTPリクエストでパススルー
IoT Coreで講読したデータを、HTTPリクエストで転送するルールを書けます。
このポストを参考に構築できると思いますが、ポイントは以下です。
- IoT Coreのメッセージのルーティングで送信先を事前登録する
- 実際にエンドポイントとして利用する前に、所有確認が必要
- 確認用トークンをリクエストさせて、
confirmationToken
を検証する - ルールにHTTPS endpointを登録。送信先を上記で登録した送信先にする
確認用トークンは、JSONでPOSTされるので、それを待ち受けます。
HTTPリクエスト時にヘッダーに任意の値を付与できるので、受信側がリクエスト元を検証できるようVerify用の値を入れておくのもありかと思います。
最後に
API GatewayとLambda等で、MQTTを代行するようなProxyを書いてもいいのですが、認可のコードを書くだけでパススルーできるので、ほぼノーコードのこの方法もニーズにあわせて利用できると思います。
Discussion