🔑

AWS IoT CoreにMQTT over WebSocketでブラウザから接続

2022/11/19に公開

はじめに

IoTのアーキテクチャで一般的なのは、以下のようなデバイス系とWeb/Mobile系を繋ぐようなものです。デバイス側はリアルタイムかつイベントドリブンで、Web側はリクエストベースであることが多ため、実際にはWeb系にいく前にいくつかのコンポーネントが挟まり、イベントドリブンな処理をし、Web系からリクエストベースでのアクセスが可能な状態まで処理するでしょう。

一方で、もっと簡易に、またWeb系もリアルタイムにしたい場合は、以下のような構成も可能です。シンプルなのでズボラな私はよく使います。デバイス状況の簡易な可視化および指示などのWebUIを追加する際に便利です。

この構成で気にしないといけないことの一つは認証・認可です。IoTで良く使われるMQTTブローカーでは、クライアントを証明書で認証することをベストプラクティスとしていることが多いからです。私が職業柄よく使うAWS IoT Coreも同様です。これは接続されるクライアントが主にデバイスでクライアント認証が重要であることを考えると納得です。

AWS IoT CoreだとMQTT over WebSocketで接続が可能ですが、その場合は証明書の認証はサポートされてないし、そもそもブラウザなので認証はパスワード認証の方が便利です。

ということで、今回はAWS IoT CoreでWebブラウザから接続するオプションについて書いてみようかなと思います。

プロトコルと認証方法

AWS IoT Core のプロトコル、認証、ポートマッピングについてまとめているのがこの表です。

このうち、カスタム認証を使うことでパスワード認証が可能です。ちなみに、署名バージョン4についてはこのサイトに詳しいです。

カスタム認証

カスタム認証についての詳細はカスタム認証ワークフローについてに譲ります。一言で言うと、認証リクエストをLambda関数に渡してそこで認証するので自由に認証のロジックが作れるようなものです。つまりパスワードでも認証できる。ということなので、認証用のLambda関数の中にパスワードをハードコードすることもできますが、普通は別でパスワードDBがあってLambda関数がアクセスする...という認証方法になるでしょう。

実際の設定方法については AWS IoT Coreにカスタム認証でブラウザから接続 に書いています。

Cognitoを使う

先の表には記載がないのですが、Cognitoを使うことでパスワードDBを含めたユーザー管理をまるっと Cognitoにお任せした上で、パスワード認証が可能です。さらにAmplifyを使うことで、パスワード認証とMQTTのPubSubをまとめて簡単に実装できます。

実際の実装例としては AWSのbuilders.flashというブログにある、AWS IoT Events に筋トレのトレーナーをやってもらおう (スクワット編) という記事の後半に詳しく書いてありました。基本的には、AmplifyのGetting startedとそのライブラリである AuthenticationPubSubを使ってシンプルに構成しているようです。

別のアイデア

ブラウザからMQTTブローカーへ接続するアイデアがもう一つあります。まだ多分動くだろうというレベルのものですので、試したらここに追記したいと思っています。

Discussion