クイックスタート: Azure CLI を使用して Event Grid 名前空間で MQTT メッセージを発行してサブスクライブする
Azure Event Grid の MQTT ブローカー機能では、MQTT プロトコルを使用したメッセージングがサポートされています。 クライアント (デバイスとクラウド アプリケーションの両方) は、大規模なブロードキャストやコマンドと制御などのシナリオで、柔軟な階層構造のトピックに対して MQTT メッセージを発行およびサブスクライブできます。
この記事では、Azure CLI を使用して次の操作を行います。
- Event Grid 名前空間を作成し、MQTT ブローカーを有効にします。
- クライアント、クライアント グループ、トピック空間などのサブリソースを作成します。
- トピック空間を発行およびサブスクライブするためのアクセス権をクライアントに付与します。
- MQTT メッセージの発行と受信。
Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。
前提条件
- Event Grid を初めて使用する場合は、このチュートリアルを開始する前に「Event Grid の概要」をよくお読みください。
- 「Event Grid リソース プロバイダーの登録」の手順に従って、Event Grid リソース プロバイダーを登録します。
- ファイアウォールでポート 8883 が開放されていることを確認します。 このチュートリアルのサンプルでは、ポート 8883 を介して通信する MQTT プロトコルを使用しています。 このポートは、企業や教育用のネットワーク環境によってはブロックされている場合があります。
- Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。
- CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する」を参照してください。
- ローカル インストールを使用する場合は、
az login
コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。 - 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。
- az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。
- この記事では、Azure CLI のバージョン 2.53.1 以降が必要です。 Azure Cloud Shell を使用している場合は、最新バージョンが既にインストールされています。
- 拇印を生成してクライアント接続を認証するには、X.509 クライアント証明書が必要です。
- CLI のドキュメントの Event Grid 名前空間を確認する。
サンプルのクライアント証明書とサムプリントを生成する
まだ証明書を持っていない場合は、Step CLI を使用してサンプル証明書を作成できます。 Windows の場合は、手動でインストールすることを検討してください。
Step CLI を使用してインストールが正常に完了したら、ユーザー プロファイル フォルダーでコマンド プロンプトを開く必要があります (Win キー + R キーを押して、「%USERPROFILE%」と入力)。
ルート証明書と中間証明書を作成するには、次のコマンドを実行します。 次の手順で使用する必要があるパスワードを覚えておいてください。
step ca init --deployment-type standalone --name MqttAppSamplesCA --dns localhost --address 127.0.0.1:443 --provisioner MqttAppSamplesCAProvisioner
生成された証明機関 (CA) ファイルを使用して、クライアントの証明書を作成します。 コマンドでは証明書ファイルとシークレット ファイルの正しいパスを必ず使用してください。
step certificate create client1-authnID client1-authnID.pem client1-authnID.key --ca .step/certs/intermediate_ca.crt --ca-key .step/secrets/intermediate_ca_key --no-password --insecure --not-after 2400h
サムプリントを表示するには、Step コマンドを実行します。
step certificate fingerprint client1-authnID.pem
名前空間の作成
コマンドを使用して、名前空間を作成します。 リソース グループと名前空間名を使用してコマンドを更新します。
az eventgrid namespace create -g {Resource Group} -n {Namespace Name} --topic-spaces-configuration "{state:Enabled}"
クイック スタートをシンプルにするために、最小限のプロパティで名前空間を作成します。 ネットワーク、セキュリティ、およびウィザードの他のページの他の設定を構成する詳細な手順については、「名前空間の作成と管理」を参照してください。
クライアントの作成
コマンドを使用して、クライアントを作成します。 リソース グループと名前空間名を使用してコマンドを更新します。
az eventgrid namespace client create -g {Resource Group} --namespace-name {Namespace Name} -n {Client Name} --authentication-name client1-authnID --client-certificate-authentication "{validationScheme:ThumbprintMatch,allowed-thumbprints:[Client Thumbprint]}"
- クイックスタートをシンプルにするために、認証にサムプリントの照合を使用します。 クライアント認証に X.509 CA 証明書チェーンを使用する手順については、「証明書チェーンを使用したクライアント認証」を参照してください。
- また、この演習では、名前空間内のすべてのクライアントを含む既定の
$all client
クライアント グループを使用します。 クライアント属性を使用したカスタム クライアント グループの作成の詳細については、クライアント グループに関するページを参照してください。
トピック空間を作成する
コマンドを使用してトピック スペースを作成します。 リソース グループ、名前空間名、およびトピック スペース名を使用してコマンドを更新します。
az eventgrid namespace topic-space create -g {Resource Group} --namespace-name {Namespace Name} -n {Topicspace Name} --topic-templates ['contosotopics/topic1']
アクセス許可バインドを作成する
az eventgrid
コマンドを使用して、パブリッシャー アクセス許可の最初のアクセス許可バインディングを作成します。 リソース グループ、名前空間名、およびアクセス許可バインド名を使用してコマンドを更新します。
az eventgrid namespace permission-binding create -g {Resource Group} --namespace-name {Namespace Name} -n {Permission Binding Name} --client-group-name '$all' --permission publisher --topic-space-name {Topicspace Name}
コマンドを使用して、2 番目のアクセス許可バインドを作成します。 リソース グループ、名前空間名、およびアクセス許可バインド名を使用してコマンドを更新します。 このアクセス許可バインドはサブスクライバー用です。
az eventgrid namespace permission-binding create -g {Resource Group} --namespace-name {Namespace Name} -n {Name of second Permission Binding} --client-group-name '$all' --permission subscriber --topic-space-name {Topicspace Name}
MQTT メッセージへの発行とサブスクライブ
次のサンプル コードは、接続を試み、名前空間に対して発行し、MQTT トピックに対してサブスクライブする単純な .NET パブリッシャーです。 このコードを使用して要件に従って変更し、Visual Studio またはお気に入りのツールでコードを実行できます。
このコードを実行するには、NuGet から MQTTnet パッケージ (バージョン 4.1.4.563) をインストールする必要があります。 (Visual Studio のソリューション エクスプローラーでプロジェクト名を右クリックし、[NuGet パッケージの管理] に移動し、MQTTnet を検索します。[MQTTnet パッケージ]を選択してインストールします。)
Note
次のサンプル コードは、デモンストレーションのみを目的としており、運用環境での使用を目的としていません。
クライアントを接続し、トピックに対して MQTT メッセージを発行/サブスクライブするサンプル C# コード
重要
クライアント証明書ファイルの場所に応じて、クライアント証明書とキー pem ファイルのパスを更新してください。 また、クライアント認証名、トピック情報が、現在使用している構成と一致していることも確認してください。
using MQTTnet.Client;
using MQTTnet;
using System.Security.Cryptography.X509Certificates;
string hostname = "{Your Event Grid namespace MQTT hostname}";
string clientId = "client1-session1"; //client ID can be the session identifier. A client can have multiple sessions using username and clientId.
string x509_pem = @" client certificate cer.pem file path\client.cer.pem"; //Provide your client certificate .cer.pem file path
string x509_key = @"client certificate key.pem file path\client.key.pem"; //Provide your client certificate .key.pem file path
var certificate = new X509Certificate2(X509Certificate2.CreateFromPemFile(x509_pem, x509_key).Export(X509ContentType.Pkcs12));
var mqttClient = new MqttFactory().CreateMqttClient();
var connAck = await mqttClient!.ConnectAsync(new MqttClientOptionsBuilder()
.WithTcpServer(hostname, 8883)
.WithClientId(clientId)
.WithCredentials("client1-authnID", "") //use client authentication name in the username
.WithTls(new MqttClientOptionsBuilderTlsParameters()
{
UseTls = true,
Certificates = new X509Certificate2Collection(certificate)
})
.Build());
Console.WriteLine($"Client Connected: {mqttClient.IsConnected} with CONNACK: {connAck.ResultCode}");
mqttClient.ApplicationMessageReceivedAsync += async m => await Console.Out.WriteAsync($"Received message on topic: '{m.ApplicationMessage.Topic}' with content: '{m.ApplicationMessage.ConvertPayloadToString()}'\n\n");
var suback = await mqttClient.SubscribeAsync("contosotopics/topic1");
suback.Items.ToList().ForEach(s => Console.WriteLine($"subscribed to '{s.TopicFilter.Topic}' with '{s.ResultCode}'"));
while (true)
{
var puback = await mqttClient.PublishStringAsync("contosotopics/topic1", "hello world!");
Console.WriteLine(puback.ReasonString);
await Task.Delay(1000);
}
複数のクライアントに対して同じコードを複製して変更し、クライアント間で発行とサブスクライブを実行できます。