Beam の MQTT エントリポイントを利用して、Azure Event Grid の MQTT ブローカー機能 (以下、Event Grid) に複数のクライアント (IoT デバイス) からデータを送信したり、クライアント (IoT デバイス) で Event Grid からのデータを受信したりできます。
ここでは、データを送受信するクライアント (IoT デバイス) が正規のクライアント (IoT デバイス) であることを保証するために、X.509 CA 証明書を使用したクライアント認証を利用します。X.509 認証の仕組みやクライアント認証の方法について詳しくは、証明書を使用した MQTT クライアント認証 を参照してください。
X.509 CA 証明書とは
「証明書を発行する認証局が信頼できること」を証明するための証明書です。ルート証明書や中間証明書とも呼ばれます。
Event Grid の MQTT ブローカー機能で利用可能な認証方法
Event Grid の MQTT ブローカー機能と SORACOM Beam の接続では、X.509 証明書による認証のみサポートされています。SORACOM Beam は MQTT バージョン 5 には対応しておらず、Microsoft Entra JWT 認証や Azure RBAC 認可はサポートされていません。
操作を始める前に準備が必要です (クリックして確認してください)
(1) SORACOM のアカウントを作成して IoT SIM を申し込む / デバイスを購入する
MQTT を使用できるデバイスと、そのデバイスで利用できる IoT SIM を用意します。
例:
- Raspberry Pi + Soracom Onyx - LTE™ USB ドングル
- Wio LTE
SORACOM アカウントの作成方法、IoT SIM の申し込み方法、およびデバイスの購入方法について詳しくは、SORACOM の利用を始める を参照してください。
(2) Microsoft Azure アカウントを用意する
Microsoft Azure Portal にアクセスして、Microsoft Azure アカウントを作成します。
準備完了ステップ 1: 認証局と Event Grid を準備する
「クライアント証明書に署名する認証局」と Event Grid を準備します。また、認証局の X.509 CA 証明書を、Event Grid に登録します。
このステップはクライアント (IoT デバイス) の個数に関わらず 1 回だけ行います。
クライアント証明書に署名する認証局を準備する
公的なルート証明機関から認証局の X.509 CA 証明書を購入する方法 と、独自の X.509 CA 証明書 (サンプル証明書) を利用する方法 を説明します。
公的なルート証明機関から X.509 CA 証明書を購入する
X.509 CA 証明書を公的なルート証明機関から購入した場合は、その指示に従って設定してください。
独自の X.509 CA 証明書 (サンプル証明書) を利用する
動作確認用に限り、独自の X.509 CA 証明書を利用できます
独自の X.509 CA 証明書 (以下、サンプル証明書) は、動作確認用にのみ利用してください。 動作確認後、本番環境で利用する場合は、速やかに公的なルート証明機関から X.509 CA 証明書を購入してください。詳しくは、公的なルート証明機関にお問い合わせください。
ここでは、step CLI を利用してサンプル証明書を発行するコマンドを紹介します。クライアント証明書は、ステップ 3 で作成します。
# 以下のコマンドは 2024 年 6 月 15 日に動作を確認しました。
# Step CLI をインストールする
# `${version}` には、任意のバージョン番号 (例:`0.26.2`) を指定します。最新のバージョンは [Releases ページ](https://github.com/smallstep/cli/releases) を参照してください。
# 以下は Raspberry Pi の場合の例です。
$ version=0.26.2 # Step CLI のバージョンを指定します。
$ wget https://dl.smallstep.com/gh-release/cli/gh-release-header/v${version}/step_linux_v${version}_armv7.tar.gz
$ tar xvf step_linux_v${version}_armv7.tar.gz
$ sudo cp ./step_${version}/bin/step /usr/local/bin/
# サンプル証明書 (ルート証明書と中間証明書) を作成する
$ step ca init --deployment-type standalone --name MqttAppSamplesCA --dns localhost --address 127.0.0.1:443 --provisioner MqttAppSamplesCAProvisioner
このあとの手順で必要になる証明書は、以下のファイルです。
- X.509 CA 証明書 (中間証明書):
.step/certs/intermediate_ca.crt
パスワードを設定してください
サンプル証明書には、ユーザー指定のパスワードを設定します。設定した内容は、このあとの手順で使用します。設定内容を忘れないでください。
Event Grid を準備する
Microsoft Azure Portal にアクセスして、Event Grid 名前空間を作成します。
詳しくは、Azure portal を使用して Event Grid 名前空間で MQTT メッセージを発行してサブスクライブする を参照してください。
以下の項目に設定した内容は、このあとの手順で使用します。
項目 説明 任意のリソースグループを選択もしくは新規作成します。例: resource-group-for-soracom
Event Grid 名前空間の Event Grid の MQTT ブローカーを識別するために任意の文字列を入力します。例: beam-Event-Grid
[スループットユニット] について
Event Grid 名前空間のスループットユニット (TU) は、送信および受信イベントレート容量を定義し、Event Grid の価格体系にも関係があります。必要に応じて適切に設定してください。詳しくは、Azure Event Grid のクォータと制限 や Event Grid の価格 を参照してください。
すでに作成済みの Event Grid も利用できます。
作成した Event Grid 名前空間の設定画面を表示して、
→ の順にクリックし、 にチェックを入れて、 をクリックします。→ → の順にクリックします。
以下の項目を設定します。
項目 説明 証明書を識別するために任意の文字列を入力します。例: X509CAcertificate
をクリックし、X.509 CA 証明書をアップロードします。Microsoft が紹介する手順の Step CLI を利用した場合は、手順内で作成された.step/certs/intermediate_ca.crt
です。をクリックします。
X.509 CA 証明書 (中間証明書) がアップロードされます。
続けて、Event Grid のアクセス制御を構成します。
Event Grid のアクセス制御を構成する
MQTT 通信では、メッセージをトピックに Publish します。
Event Grid 名前空間の MQTT ブローカー機能では、「トピック空間」(*1) に対するアクセス許可と「クライアントグループ」(*2) を結びつけて管理します。これを「アクセス許可バインド」と呼びます。「アクセス許可バインド」を利用することで、個々のトピックやクライアントごとに対するアクセス許可を設定することなく規模の拡大に対応できる仕組みです。詳しくは、MQTT クライアントのアクセス制御 を参照してください。
- (*1) トピックをフィルターする一連のトピックテンプレートをまとめる情報です。
- (*2) 同じアクセス権を要求するクライアントをまとめる情報です。
ここでは、動作確認を簡単にするために、「アクセス許可バインド」において、Event Grid の MQTT ブローカー機能にあらかじめ用意されている $all
クライアントグループを使用してアクセス許可を制御します。$all
は、作成した Event Grid 名前空間内のすべてのクライアントが含まれるクライアントグループです。詳しくは、クライアントグループ を参照してください。
トピック空間を作成する
Microsoft Azure Portal にアクセスし、Event Grid を準備する で作成した Event Grid 名前空間の設定画面で → → の順にクリックします。
以下の項目を設定します。
項目 説明 トピック空間を識別するために任意の文字列を入力します。例: ExampleTopicSpace
をクリックし、任意のトピック名 (例:exampletopics/topic1
) を入力します。この「トピック名」は、実際に MQTT クライアントが Publish したり Subscribe したりするときにトピック名として使用します。をクリックします。
トピック空間が作成されます。
トピック空間は、最大 10 個のトピックテンプレートをグループ化できます。また、トピックテンプレートには、MQTT トピックのワイルドカードや変数がサポートされています。詳しくは、Azure Event Grid の MQTT ブローカー機能のトピック空間 を参照してください。
アクセス許可バインドによるアクセス制御を構成する
2 つのアクセス許可バインドを作成します。
- が「パブリッシャー」
- が「サブスクライバー」
Event Grid を準備する で作成した Event Grid 名前空間の設定画面で → → の順にクリックします。
以下の項目を設定します。
項目 説明 アクセス許可バインドを識別するために任意の文字列を入力します。 すべてのクライアントが含まれる $all
クライアントグループを選択します。特定のクライアントをグループ化してアクセス許可を制御する場合は、あらかじめクライアントグループを作成してください。トピック空間を作成する で作成したトピック空間名 (例: ExampleTopicSpace
) を選択します。「パブリッシャー」または「サブスクライバー」を選択します。「パブリッシャー」を選択したアクセス許可バインドと、「サブスクライバー」を選択したアクセス許可バインドを作成します。 が「パブリッシャー」のアクセス許可バインド。
が「サブスクライバー」のアクセス許可バインド。
をクリックします。
が「パブリッシャー」のアクセス許可バインドと、 が「サブスクライバー」のアクセス許可バインドが作成されたことを確認してください。
ステップ 2: SORACOM Beam を有効化して MQTT エントリポイントを設定する
SIM グループの SORACOM Beam を有効化して、MQTT エントリポイントを設定します。
このステップはクライアント (IoT デバイス) の個数に関わらず 1 回だけ行います。
Beam の設定は SIM グループに対して行います
ここでは、グループの設定を変更する操作のみを説明します。グループの仕組みやグループを作成する操作について詳しくは、グループ設定 を参照してください。
SORACOM ユーザーコンソールの SIM グループ画面で
をクリックします。SIM グループ画面を表示する操作について詳しくは、グループの設定を変更する を参照してください。
→ の順にクリックします。
以下の項目を設定します。
項目 説明 MQTT エントリポイントを識別するために任意の文字列を入力します。 → 「Standard」を選択します。 → 「MQTTS」を選択します。 → Event Grid の MQTT ホスト名を入力します。MQTT ホスト名は、Event Grid を準備する で作成した Event Grid 名前空間の設定画面を表示して、 をクリックすると確認できます。例: {Event Grid 名 (小文字)}.japaneast-1.ts.eventgrid.azure.net
(*1)→ 「8883」を入力します。 ステップ 3 で Event Grid にクライアントを作成するときに、 に入力する文字列に対応する内容を入力します。たとえば、 で prefix (例: myClient-
) と IoT SIM の IMSI (例:295012345678901
) を組み合わせる場合は、 には、myClient-#{imsi}
(*1) を入力します。有効化します。 ステップ 3 で Event Grid にクライアントを作成するときに、 に入力する文字列に対応する内容を入力します。ここでは、上記の と同じ内容を入力します。例: myClient-#{imsi}
(*1)- (*1)
{Event Grid 名}
は、Event Grid を準備する で作成した Event Grid 名前空間の名前を入力します。一方、プレースホルダー (#{imsi}
) はそのまま入力します。IMSI を入力しないでください。
- (*1)
をクリックします。
SIM グループの設定は IoT SIM が所属するグループを切り替えると有効化されます
ここでは、IoT SIM が所属するグループを切り替える手順は、ステップ 3: Event Grid に接続するクライアントとクライアント証明書を作成する で説明しています。これは、グループの切り替えは、IoT SIM を利用するクライアント (IoT デバイス) の数だけ行う必要があるためです。
ステップ 3: Event Grid にクライアントとクライアント証明書を作成する
このステップはクライアント (IoT デバイス) ごとに行います。たとえば、Event Grid に接続するクライアント (IoT デバイス) が 10 台ある場合は、このステップを 10 回繰り返してください。
Event Grid にクライアントを作成する
Microsoft Azure Portal にアクセスし、Event Grid を準備する で作成した Event Grid 名前空間の設定画面で → の順にクリックします。
をクリックします。
以下の項目を設定します。
項目 説明 クライアント (IoT デバイス) を識別するために任意の文字列を入力します。 既定で
と同じ内容が入力されますが、変更できます。ステップ 2 で設定した SORACOM Beam の MQTT エントリポイントの に準じた内容にしてください。たとえば、 に
に入力する名前は、myClient-#{imsi}
を入力した場合は、ここでは#{imsi}
の部分をクライアント (IoT デバイス) で利用する IoT SIM の IMSI (*1) に置き換えます。例:myClient-295012345678901
「Subject Matches Authentication Name」を選択します。 - (*1) IMSI は SIM 管理画面の 一覧表示 で確認できます。
をクリックします。
Event Grid にクライアントが作成されます。
作成したクライアント証明書を作成して認証局で認証する
クライアント証明書を作成して、ステップ 1 で作成した認証局で認証します。公的なルート証明機関から X.509 CA 証明書を購入した場合は、その指示に従ってクライアント証明書を認証してください。
Azure portal を使用して Event Grid 名前空間で MQTT メッセージを発行してサブスクライブする の手順に従って作成したサンプル証明書で認証をする場合は、以下の手順で行います。
この手順でクライアント証明書を作成するときに、サンプル証明書を作成したときに入力したユーザー指定のパスワードを使用します。また、この手順で作成したサンプル証明書は 100 日後に期限が切れます。
X.509 CA 証明書を利用する方法については、CA 証明書チェーンを使用したクライアント認証 の手順も参考にしてください。
Event Grid に作成したクライアントの
に入力した文字列 (例:myClient-295012345678901
) をclient_authname
に代入します。複数のクライアントを作成した場合は、以下のように
imsi
を利用することも考えられます。$ imsi="295012345678901" $ client_authname="myClient-${imsi}"
サンプル証明書を使用して、クライアント証明書を作成します。
$ step certificate create ${client_authname} ${client_authname}.pem ${client_authname}.key --ca ${HOME}/.step/certs/intermediate_ca.crt --ca-key ${HOME}/.step/secrets/intermediate_ca_key --no-password --insecure --not-after 2400h
Please enter the password to decrypt .step/secrets/intermediate_ca_key:
サンプル証明書を作成したときに設定したパスワードを入力して、Enter キーを押します。
クライアント証明書 (例:
myClient-295012345678901.pem
) およびその秘密鍵 (例:myClient-295012345678901.key
) が作成されます。
クライアント証明書およびその秘密鍵を SORACOM ユーザーコンソールの認証情報ストアに登録する
クライアント証明書およびその秘密鍵を SORACOM ユーザーコンソールの認証情報ストアに登録します。
認証情報ストアの「認証情報を登録」画面の表示方法については、認証情報を登録する を参照してください。
認証情報は、以下のように登録します。
項目 説明 ステップ 2 で設定した SORACOM Beam の MQTT エントリポイントの に準じた内容にしてください。たとえば、 に myClient-#{imsi}
を入力した場合は、ここでは#{imsi}
の部分をクライアント (IoT デバイス) で利用する IoT SIM の IMSI (*1) に置き換えます。例:myClient-295012345678901
「X.509 証明書」を選択します。 クライアント証明書の秘密鍵 (例: myClient-295012345678901.key
) の内容を貼り付けます。(*2)クライアント証明書 (例: myClient-295012345678901.pem
) の内容を貼り付けます。(*2)- (*1) IMSI は SIM 管理画面の 一覧表示 で確認できます。
- (*2) ファイル名ではなく、テキストエディタなどで ファイルの内容をコピーし 貼り付けてください。
IoT SIM が所属するグループを切り替える
クライアント (IoT デバイス) が利用する IoT SIM が所属するグループを、Beam の MQTT エントリポイントを追加した SIM グループに切り替えます。詳しくは、IoT SIM、LoRaWAN デバイス、Sigfox デバイスが所属するグループを切り替える を参照してください。
ステップ 4: Beam を使用して Event Grid にデータを送信 (Publish) する
MQTT クライアントを準備する (データを送信する IoT デバイスの操作)
ここでは、MQTT クライアントとして mosquitto-clients を利用します。
mosquitto-clients のインストール
mosquitto-clients は、サイト からダウンロードおよびインストールしてください。
なお、Raspberry Pi の場合は、以下のコマンドでインストールできます。
$ sudo apt install mosquitto-clients
クライアント (IoT デバイス) からデータを送信する (データを送信する IoT デバイスの操作)
クライアント (IoT デバイス) から Event Grid にデータを送信します。具体的には、MQTT クライアントで exampletopics/topic1
というトピックにデータを Publish します。
クライアント ID には Azure Event Grid 名前空間においてユニークな ID を指定してください
Event Grid の MQTT ブローカー機能では、MQTT クライアントが クライアント ID (mosquitto_pub の -i オプション) としてクライアント接続のセッション識別子を明示する必要があり、このクライアント ID は利用する Azure Event Grid 名前空間においてユニークでなければなりません。ここでは、Event Grid に作成したクライアントのクライアント認証名と、クライアントで利用する通信モジュールの IMEI (例: 123456789011111
) を連結して指定します。
以下の例では、client_authname
に Event Grid にクライアントを作成する で に入力した値 (例: myClient-295012345678902
) を代入し、imei
にクライアントで利用する通信モジュールの IMEI を代入して、クライアント ID client_id
を構築しています。
$ client_authname="myClient-295012345678901"
$ imei="123456789011111"
$ client_id=${client_authname}-${imei}
$ mosquitto_pub -d -h beam.soracom.io -V mqttv311 \
-i ${client_id} -t "exampletopics/topic1" \
-m "Hello from Client via Beam!"
Client myClient-295012345678901-123456789011111 sending CONNECT
Client myClient-295012345678901-123456789011111 received CONNACK (0)
Client myClient-295012345678901-123456789011111 sending PUBLISH (d0, q0, r0, m1, 'exampletopics/topic1', ... (27 bytes))
Client myClient-295012345678901-123456789011111 sending DISCONNECT
ステップ 5: Beam を使用して Event Grid からデータを受信 (Subscribe) する
クライアント (IoT デバイス) を複数台用意できる場合は、受信 (Subscribe) するクライアント (IoT デバイス) を準備すると、ほかのクライアント (IoT デバイス) が送信 (Publish) したメッセージを受信できます。
MQTT クライアントを準備する (データを受信する IoT デバイスの操作)
MQTT クライアントを準備する (データを送信する IoT デバイスの操作) と同様に、データを受信 (Subscribe) する IoT デバイスでも MQTT クライアント (mosquitto-clients) を準備します。
クライアント (IoT デバイス) でデータを受信する (データを受信する IoT デバイスの操作)
クライアント (IoT デバイス) で Event Grid の MQTT ブローカーのトピックを Subscribe します。具体的には、MQTT クライアントで exampletopics/topic1
というトピックを Subscribe します。
クライアント ID には Azure Event Grid 名前空間においてユニークな ID を指定してください
MQTT クライアントのクライアント ID (mosquitto_sub の -i オプション) として、ステップ 4 と同様に、Event Grid に作成したクライアントのクライアント認証名と、クライアントで利用する通信モジュールの IMEI (例: 123456789022222
) を連結して指定します。
以下の例では、client_authname
に Event Grid にクライアントを作成する で に入力した値 (例: myClient-295012345678902
) を代入し、imei
にクライアントで利用する通信モジュールの IMEI を代入して、クライアント ID client_id
を構築しています。
$ client_id="myClient-295012345678902"
$ imei="123456789022222"
$ client_id=${client_authname}-${imei}
$ mosquitto_sub -d -h beam.soracom.io -V mqttv311 \
-i ${client_id} -t "exampletopics/topic1"
Client myClient-295012345678902-123456789022222 sending CONNECT
Client myClient-295012345678902-123456789022222 received CONNACK (0)
Client myClient-295012345678902-123456789022222 sending SUBSCRIBE (Mid: 1, Topic: exampletopics/topic1, QoS: 0)
Client myClient-295012345678902-123456789022222 received SUBACK
Subscribed (mid: 1): 0
Client myClient-295012345678902-123456789022222 sending PINGREQ
Client myClient-295012345678902-123456789022222 received PINGRESP
このようにデータを受信するクライアント (IoT デバイス) で MQTT クライアントがトピック exampletopics/topic1
を Subscribe した状態で、データを送信するクライアント (IoT デバイス) で MQTT クライアントがメッセージを Publish します。データを送信する方法については、ステップ 4 の クライアント (IoT デバイス) からデータを送信する (データを送信する IoT デバイスの操作) を参照してください。
データを受信するクライアント (IoT デバイス) で、以下のようにメッセージを受信できます。
Client myClient-295012345678902-123456789022222 sending PINGREQ
Client myClient-295012345678902-123456789022222 received PINGRESP
Client myClient-295012345678902-123456789022222 received PUBLISH (d0, q0, r0, m0, 'exampletopics/topic1', ... (27 bytes))
Hello from Client via Beam!
Client myClient-295012345678902-123456789022222 sending PINGREQ
Client myClient-295012345678902-123456789022222 received PINGRESP
Beam を使用するとクライアント (IoT デバイス) から送信するデータ量も削減できます
Beam を使用する場合は、クライアント (IoT デバイス) からルート証明書およびクライアント証明書を送信しないため、送信データ量が削減できます。