このクイック スタートでは、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 の概要」を参照してください。
- CLI 参照コマンドをローカルで実行する場合は、Azure CLI を インストール します。 Windows または macOS で実行する場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「 Docker コンテナーで Azure CLI を実行する」を参照してください。
- ローカル インストールを使用する場合は、
az login
コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、「 Azure CLI を使用した Azure への認証」を参照してください。 - メッセージが表示されたら、最初に使用するときに Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、「 Azure CLI 拡張機能の管理」を参照してください。
- az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。
- この記事では、Azure CLI のバージョン 2.53.1 以降が必要です。 Azure Cloud Shell を使用している場合は、最新バージョンが既にインストールされています。
- 拇印を生成してクライアント接続を認証するには、X.509 クライアント証明書が必要です。
- Event Grid 名前空間 CLI コマンドを確認します。
サンプル クライアント証明書と拇印を生成する
まだ証明書がない場合は、 手順 CLI を使用してサンプル証明書を作成できます。 Windows の場合は、手動でインストールすることを検討してください。
手順 CLI を使用してインストールが成功したら、ユーザー プロファイル フォルダー (Win+R type %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 certificate fingerprint client1-authnID.pem
名前空間の作成
このコマンドを使用して名前空間を作成します。 リソース グループと名前空間名でコマンドを更新します。
az eventgrid namespace create --resource-group {Resource Group} --name {Namespace Name} --topic-spaces-configuration "{state:Enabled}"
このクイック スタートをシンプルにするには、最小限のプロパティで名前空間を作成します。 他のタブのネットワーク、セキュリティ、設定の詳細については、「名前空間の 作成と管理」を参照してください。
クライアントの作成
このコマンドを使用して、クライアントを作成します。 リソース グループと名前空間名でコマンドを更新します。
az eventgrid namespace client create --resource-group {Resource Group} --namespace-name {Namespace Name} --name {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 --resource-group {Resource Group} --namespace-name {Namespace Name} --name {Topicspace Name} --topic-templates ['contosotopics/topic1']
アクセス許可バインドを作成する
az eventgrid
コマンドを使用して、発行元のアクセス許可の最初のアクセス許可バインドを作成します。 リソース グループ、名前空間名、およびアクセス許可バインド名でコマンドを更新します。
az eventgrid namespace permission-binding create --resource-group {Resource Group} --namespace-name {Namespace Name} --name {Permission Binding Name} --client-group-name '$all' --permission publisher --topic-space-name {Topicspace Name}
このコマンドを使用して、2 番目のアクセス許可バインディングを作成します。 リソース グループ、名前空間名、およびアクセス許可バインド名でコマンドを更新します。 このアクセス許可バインディングはサブスクライバー向けです。
az eventgrid namespace permission-binding create --resource-group {Resource Group} --namespace-name {Namespace Name} --name {Name of second Permission Binding} --client-group-name '$all' --permission subscriber --topic-space-name {Topicspace Name}
MQTT メッセージへの発行とサブスクライブ
次のサンプル コードは、名前空間への接続と発行を試み、MQTT トピックをサブスクライブする単純な .NET パブリッシャーです。 要件のコードを変更し、Visual Studio または別のデザイン ツールで実行できます。
このコードを実行するには、NuGet から MQTnet パッケージ (バージョン 4.1.4.563) をインストールする必要があります。 Visual Studio で、ソリューション エクスプローラーでプロジェクト名を右クリックし、[ NuGet パッケージの管理] に移動し、 MQTTnet を検索します。 MQTTnet パッケージを選択してインストールします。
注
次のサンプル コードはデモンストレーションのみを目的としており、運用環境での使用を目的としたものではありません。
クライアントに接続し、トピックの MQTT メッセージを発行してサブスクライブするサンプル C# コード
Von Bedeutung
クライアント証明書ファイルの場所に応じて、クライアント証明書とキー 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);
}
複数のクライアントに対して同じコードをレプリケートおよび変更して、クライアント間で発行およびサブスクライブすることができます。
関連コンテンツ
- チュートリアル: 名前空間トピックを使用して MQTT メッセージを Azure Event Hubs にルーティングする
- チュートリアル: カスタム トピックを使用して MQTT メッセージを Azure Functions にルーティングする
コード サンプルについては、この GitHub リポジトリを参照してください。