Soracom

Users

ドキュメント
Home ドキュメント SORACOM Beam Microsoft Azure に送信する

Azure Event Grid と MQTT プロトコルで接続する (X.509 CA 証明書を利用した認証)

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 を用意します。

例:

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 を準備する

  1. 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 も利用できます。

  2. 作成した Event Grid 名前空間の設定画面を表示して、[設定][構成] の順にクリックし、[MQTT ブローカーを有効にする] にチェックを入れて、[適用] をクリックします。

  3. [MQTT ブローカー][CA 証明書][+証明書] の順にクリックします。

  4. 以下の項目を設定します。

    項目説明
    [証明書名]証明書を識別するために任意の文字列を入力します。例: X509CAcertificate
    [証明書ファイル][参照] をクリックし、X.509 CA 証明書をアップロードします。Microsoft が紹介する手順の Step CLI を利用した場合は、手順内で作成された .step/certs/intermediate_ca.crt です。
  5. [アップロード] をクリックします。

    X.509 CA 証明書 (中間証明書) がアップロードされます。

    続けて、Event Grid のアクセス制御を構成します。

Event Grid のアクセス制御を構成する

MQTT 通信では、メッセージをトピックに Publish します。

Event Grid 名前空間の MQTT ブローカー機能では、「トピック空間」(*1) に対するアクセス許可と「クライアントグループ」(*2) を結びつけて管理します。これを「アクセス許可バインド」と呼びます。「アクセス許可バインド」を利用することで、個々のトピックやクライアントごとに対するアクセス許可を設定することなく規模の拡大に対応できる仕組みです。詳しくは、MQTT クライアントのアクセス制御 を参照してください。

  • (*1) トピックをフィルターする一連のトピックテンプレートをまとめる情報です。
  • (*2) 同じアクセス権を要求するクライアントをまとめる情報です。

ここでは、動作確認を簡単にするために、「アクセス許可バインド」において、Event Grid の MQTT ブローカー機能にあらかじめ用意されている $all クライアントグループを使用してアクセス許可を制御します。$all は、作成した Event Grid 名前空間内のすべてのクライアントが含まれるクライアントグループです。詳しくは、クライアントグループ を参照してください。

トピック空間を作成する

  1. Microsoft Azure Portal にアクセスし、Event Grid を準備する で作成した Event Grid 名前空間の設定画面で [MQTT ブローカー][トピック空間][+トピック空間] の順にクリックします。

  2. 以下の項目を設定します。

    項目説明
    [名前]トピック空間を識別するために任意の文字列を入力します。例: ExampleTopicSpace
    [トピックテンプレート][+トピック テンプレートの追加] をクリックし、任意のトピック名 (例: exampletopics/topic1) を入力します。この「トピック名」は、実際に MQTT クライアントが Publish したり Subscribe したりするときにトピック名として使用します。

  3. [作成] をクリックします。

    トピック空間が作成されます。

トピック空間は、最大 10 個のトピックテンプレートをグループ化できます。また、トピックテンプレートには、MQTT トピックのワイルドカードや変数がサポートされています。詳しくは、Azure Event Grid の MQTT ブローカー機能のトピック空間 を参照してください。

アクセス許可バインドによるアクセス制御を構成する

2 つのアクセス許可バインドを作成します。

  • [アクセス許可] が「パブリッシャー」
  • [アクセス許可] が「サブスクライバー」
  1. Event Grid を準備する で作成した Event Grid 名前空間の設定画面で [MQTT ブローカー][アクセス許可バインド][+アクセス許可バインド] の順にクリックします。

  2. 以下の項目を設定します。

    項目説明
    [名前]アクセス許可バインドを識別するために任意の文字列を入力します。
    [クライアントグループ名]すべてのクライアントが含まれる $all クライアントグループを選択します。特定のクライアントをグループ化してアクセス許可を制御する場合は、あらかじめクライアントグループを作成してください。
    [トピック空間名]トピック空間を作成する で作成したトピック空間名 (例: ExampleTopicSpace) を選択します。
    [アクセス許可]「パブリッシャー」または「サブスクライバー」を選択します。「パブリッシャー」を選択したアクセス許可バインドと、「サブスクライバー」を選択したアクセス許可バインドを作成します。
    • [アクセス許可] が「パブリッシャー」のアクセス許可バインド。

    • [アクセス許可] が「サブスクライバー」のアクセス許可バインド。

  3. [作成] をクリックします。

    [アクセス許可] が「パブリッシャー」のアクセス許可バインドと、[アクセス許可] が「サブスクライバー」のアクセス許可バインドが作成されたことを確認してください。

ステップ 2: SORACOM Beam を有効化して MQTT エントリポイントを設定する

SIM グループの SORACOM Beam を有効化して、MQTT エントリポイントを設定します。

このステップはクライアント (IoT デバイス) の個数に関わらず 1 回だけ行います。

Beam の設定は SIM グループに対して行います

ここでは、グループの設定を変更する操作のみを説明します。グループの仕組みやグループを作成する操作について詳しくは、グループ設定 を参照してください。

  1. SORACOM ユーザーコンソールの SIM グループ画面で [SORACOM Beam 設定] をクリックします。

    SIM グループ画面を表示する操作について詳しくは、グループの設定を変更する を参照してください。

  2. [+設定を追加する][MQTT エントリポイント] の順にクリックします。

  3. 以下の項目を設定します。

    項目説明
    [設定名]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 にクライアントを作成するときに、[認証情報 ID] に入力する文字列に対応する内容を入力します。ここでは、上記の [ユーザ名] と同じ内容を入力します。例:myClient-#{imsi} (*1)
    • (*1) {Event Grid 名} は、Event Grid を準備する で作成した Event Grid 名前空間の名前を入力します。一方、プレースホルダー (#{imsi}) はそのまま入力します。IMSI を入力しないでください。

  4. [保存] をクリックします。

SIM グループの設定は IoT SIM が所属するグループを切り替えると有効化されます

ここでは、IoT SIM が所属するグループを切り替える手順は、ステップ 3: Event Grid に接続するクライアントとクライアント証明書を作成する で説明しています。これは、グループの切り替えは、IoT SIM を利用するクライアント (IoT デバイス) の数だけ行う必要があるためです。

ステップ 3: Event Grid にクライアントとクライアント証明書を作成する

このステップはクライアント (IoT デバイス) ごとに行います。たとえば、Event Grid に接続するクライアント (IoT デバイス) が 10 台ある場合は、このステップを 10 回繰り返してください。

Event Grid にクライアントを作成する

  1. Microsoft Azure Portal にアクセスし、Event Grid を準備する で作成した Event Grid 名前空間の設定画面で [MQTT ブローカー][クライアント] の順にクリックします。

  2. [+クライアント] をクリックします。

  3. 以下の項目を設定します。

    項目説明
    [クライアント名]クライアント (IoT デバイス) を識別するために任意の文字列を入力します。
    [クライアント認証名]

    既定で [クライアント名] と同じ内容が入力されますが、変更できます。

    [クライアント認証名] に入力する名前は、ステップ 2 で設定した SORACOM Beam の MQTT エントリポイントの [ユーザ名] に準じた内容にしてください。たとえば、[ユーザ名]myClient-#{imsi} を入力した場合は、ここでは #{imsi} の部分をクライアント (IoT デバイス) で利用する IoT SIM の IMSI (*1) に置き換えます。例: myClient-295012345678901

    [クライアント証明書認証検証スキーム]「Subject Matches Authentication Name」を選択します。
    • (*1) IMSI は SIM 管理画面の 一覧表示 で確認できます。

  4. [作成] をクリックします。

    Event Grid にクライアントが作成されます。

作成したクライアント証明書を作成して認証局で認証する

クライアント証明書を作成して、ステップ 1 で作成した認証局で認証します。公的なルート証明機関から X.509 CA 証明書を購入した場合は、その指示に従ってクライアント証明書を認証してください。

Azure portal を使用して Event Grid 名前空間で MQTT メッセージを発行してサブスクライブする の手順に従って作成したサンプル証明書で認証をする場合は、以下の手順で行います。

この手順でクライアント証明書を作成するときに、サンプル証明書を作成したときに入力したユーザー指定のパスワードを使用します。また、この手順で作成したサンプル証明書は 100 日後に期限が切れます。

X.509 CA 証明書を利用する方法については、CA 証明書チェーンを使用したクライアント認証 の手順も参考にしてください。

  1. Event Grid に作成したクライアントの [クライアント認証名] に入力した文字列 (例: myClient-295012345678901) を client_authname に代入します。

    複数のクライアントを作成した場合は、以下のように imsi を利用することも考えられます。

    $ imsi="295012345678901"
    $ client_authname="myClient-${imsi}"
    
  2. サンプル証明書を使用して、クライアント証明書を作成します。

    $ 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:
    
  3. サンプル証明書を作成したときに設定したパスワードを入力して、Enter キーを押します。

    クライアント証明書 (例: myClient-295012345678901.pem) およびその秘密鍵 (例: myClient-295012345678901.key) が作成されます。

クライアント証明書およびその秘密鍵を SORACOM ユーザーコンソールの認証情報ストアに登録する

  1. クライアント証明書およびその秘密鍵を SORACOM ユーザーコンソールの認証情報ストアに登録します。

    認証情報ストアの「認証情報を登録」画面の表示方法については、認証情報を登録する を参照してください。

    認証情報は、以下のように登録します。

    項目説明
    [認証情報 ID]ステップ 2 で設定した SORACOM Beam の MQTT エントリポイントの [認証情報] に準じた内容にしてください。たとえば、[認証情報]myClient-#{imsi} を入力した場合は、ここでは #{imsi} の部分をクライアント (IoT デバイス) で利用する IoT SIM の IMSI (*1) に置き換えます。例: myClient-295012345678901
    [種別]「X.509 証明書」を選択します。
    [秘密鍵 (key)]クライアント証明書の秘密鍵 (例: myClient-295012345678901.key) の内容を貼り付けます。(*2)
    [証明書 (cert)]クライアント証明書 (例: 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_authnameEvent 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_authnameEvent 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 デバイス) で、以下のようにメッセージを受信できます。

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 デバイス) からルート証明書およびクライアント証明書を送信しないため、送信データ量が削減できます。