チュートリアル: 名前空間トピックを使用して MQTT メッセージを Azure Event Hubs にルーティングする (Azure CLI)

このチュートリアルでは、名前空間トピックを使用して MQTT クライアントから Azure Event Hubs にデータをルーティングする方法について説明します。 手順の概要は次のとおりです。

前提条件

  • Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。
  • Event Grid を初めて使用する場合は、このチュートリアルを開始する前に「Event Grid の概要」をお読みください。
  • Event Grid リソース プロバイダーの登録」の手順に従って、Event Grid リソース プロバイダーを登録します。
  • ファイアウォールでポート 8883 が開放されていることを確認します。 このチュートリアルのサンプルでは、ポート 8883 を介して通信する MQTT プロトコルを使用しています。 このポートは、企業や教育用のネットワーク環境によってはブロックされている場合があります。

Cloud Shell の起動

  1. Azure Portal にサインインします。

  2. リンクを選択して Cloud Shell を起動します。

  3. [Bash] に切り替えます。

    Cloud Shell が開き、Bash が選択されている Azure portal を示すスクリーンショット。

Event Grid 名前空間とトピックを作成する

Event Grid 名前空間を作成し、この名前空間内にトピックを作成するには、次のスクリプトをエディターにコピーし、プレースホルダーを実際の値で置き換えて、コマンドを実行します。

プレースホルダー Comments
RESOURCEGROUPNAME 作成するリソース グループの名前を指定します。
EVENTGRIDNAMESPACENAME Event Grid 名前空間の名前を指定します。
REGION リソースを作成する場所を指定します。
NAMESPACETOPICNAME 名前空間トピックの名前を指定します。
rgName="RESOURCEGROUPNAME"
nsName="EVENTGRIDNAMESPACENAME"
location="REGION"
nsTopicName="NAMESPACETOPICNAME"

az group create -n $rgName -l $location
az eventgrid namespace create -g $rgName -n $nsName -l $location --topic-spaces-configuration "{state:Enabled}" --identity "{type:SystemAssigned}"
az eventgrid namespace topic create -g $rgName --name $nsTopicName --namespace-name $nsName

Event Hubs 名前空間とイベント ハブを作成する

Event Hubs 名前空間を作成し、この名前空間内にイベント ハブを作成するには、プレースホルダーを実際の値で置き換えて、次のコマンドを実行します。 このイベント ハブは、このチュートリアルで作成するイベント サブスクリプションのイベント ハンドラーとして使用されます。

プレースホルダー Comments
EVENTHUBSNAMESPACENAME 作成する Event Hubs 名前空間の名前を指定します。
EVENTHUBNAME Event Hubs 名前空間内に作成する Event Hubs インスタンス (イベント ハブ) の名前を指定します。
ehubNsName="EVENTHUBSNAMESPACENAME`"
ehubName="EVENTHUBNAME"

az eventhubs namespace create --resource-group $rgName --name $ehubNsName
az eventhubs eventhub create --resource-group $rgName --namespace-name $ehubNsName --name $ehubName

Event Grid 名前空間に、イベント ハブにイベントを送信するためのアクセス権を付与する

Event Grid 名前空間のサービス プリンシパルを Event Hubs 名前空間の Azure Event Hubs データ送信者ロールに追加するには、次のコマンドを実行します。 これにより、Event Grid 名前空間とその中のリソースから、Event Hubs 名前空間のイベント ハブにイベントを送信できるようになります。

egNamespaceServicePrincipalObjectID=$(az ad sp list --display-name $nsName --query [].id -o tsv)
namespaceresourceid=$(az eventhubs namespace show -n $ehubNsName -g $rgName --query "{I:id}" -o tsv) 

az role assignment create --assignee $egNamespaceServicePrincipalObjectID --role "Azure Event Hubs Data Sender" --scope $namespaceresourceid

エンドポイントとして Event Hubs を使用してイベント サブスクリプションを作成する

前に作成した名前空間トピックのイベント サブスクリプションを作成するには、プレースホルダーを実際の値で置き換えて、次のコマンドを実行します。 このサブスクリプションは、イベント ハブをイベント ハンドラーとして使用するように構成されています。

プレースホルダー Comments
EVENTSUBSCRIPTIONNAME 名前空間トピックのイベント サブスクリプションの名前を指定します。
eventSubscriptionName="EVENTSUBSCRIPTIONNAME"
eventhubresourceid=$(az eventhubs eventhub show -n $ehubName --namespace-name $ehubNsName -g $rgName --query "{I:id}" -o tsv) 

az resource create --api-version 2023-06-01-preview --resource-group $rgName --namespace Microsoft.EventGrid --resource-type eventsubscriptions --name $eventSubscriptionName --parent namespaces/$nsName/topics/$nsTopicName --location $location --properties "{\"deliveryConfiguration\":{\"deliveryMode\":\"Push\",\"push\":{\"maxDeliveryCount\":10,\"deliveryWithResourceIdentity\":{\"identity\":{\"type\":\"SystemAssigned\"},\"destination\":{\"endpointType\":\"EventHub\",\"properties\":{\"resourceId\":\"$eventhubresourceid\"}}}}}}"

Event Grid 名前空間でルーティングを構成する

名前空間のルーティングを有効にし、前に作成した名前空間トピックへとメッセージまたはイベントをルーティングするには、次のコマンドを実行します。 それらのイベントは、この名前空間トピックのイベント サブスクリプションにより、イベント ハンドラーとして構成されているイベント ハブに転送されます。

routeTopicResourceId=$(az eventgrid namespace topic show -g $rgName --namespace-name $nsName -n $nsTopicName --query "{I:id}" -o tsv) 
az eventgrid namespace create -g $rgName -n $nsName --topic-spaces-configuration "{state:Enabled,'routeTopicResourceId':$routeTopicResourceId}"

クライアント、トピック空間、およびアクセス許可バインドを作成する

次に、いくつかのテスト メッセージを送信するクライアントを作成します。 このステップでは、クライアントの作成、トピックを 1 つ含んだトピック空間の作成、パブリッシャーとサブスクライバーのバインディング作成を行います。

詳細な作業手順については、「クイック スタート: Azure CLI を使用して Event Grid 名前空間で MQTT メッセージを発行してサブスクライブする」を参照してください。

プレースホルダー Comments
CLIENTNAME いくつかのテスト メッセージを送信するクライアントの名前を指定します。
CERTIFICATETHUMBPRINT クライアント証明書の拇印です。 証明書を作成して拇印を抽出する手順については、上記のクイックスタートを参照してください。 同じ拇印を MQTTX ツールで使用して、テスト メッセージを送信します。
TOPICSPACENAME 作成するトピック空間の名前を指定します。
PUBLSHERBINDINGNAME パブリッシャー バインディングの名前を指定します。
SUBSCRIBERBINDINGNAME サブスクライバー バインディングの名前を指定します。
clientName="CLIENTNAME"
clientAuthName="client1-authnID" 
clientThumbprint="CERTIFICATETHUMBPRINT"

topicSpaceName="TOPICSPACENAME"
publisherBindingName="PUBLSHERBINDINGNAME"
subscriberBindingName="SUBSCRIBERBINDINGNAME"

az eventgrid namespace client create -g $rgName --namespace-name $nsName -n $clientName --authentication-name $clientAuthName --client-certificate-authentication "{validationScheme:ThumbprintMatch,allowed-thumbprints:[$clientThumbprint]}"

az eventgrid namespace topic-space create -g $rgName --namespace-name $nsName -n $topicSpaceName --topic-templates ['contosotopics/topic1']

az eventgrid namespace permission-binding create -g $rgName --namespace-name $nsName -n $publisherBindingName --client-group-name '$all' --permission publisher --topic-space-name $topicSpaceName

az eventgrid namespace permission-binding create -g $rgName --namespace-name $nsName -n $subscriberBindingName --client-group-name '$all' --permission subscriber --topic-space-name $topicSpaceName

MQTTX を使用してメッセージを送信する

MQTTX を使用して、いくつかのテスト メッセージを送信します。 詳細な手順については、クイック スタート:「MQTT トピックを発行してサブスクライブする」を参照してください。

Event Hubs 名前空間の [概要] ページで、イベント ハブがそれらのメッセージを受信したことを確認します。

受信メッセージ数を含むイベント ハブの [概要] ページを示すスクリーンショット。

Stream Analytics クエリを使用して Event Hubs でルーティング MQTT メッセージを表示する

Azure portal で、イベント サブスクリプション内の Event Hubs インスタンス (イベント ハブ) に移動します。 Stream Analytics を使用してイベント ハブからのデータを処理します。 詳細については、「Stream Analytics を使用した Azure Event Hubs からのデータの処理 - Azure Event Hubs | Microsoft Learn」を参照してください。 クエリで MQTT メッセージを確認できます。

Stream Analytics クエリ ツールを使用した Event Hubs の MQTT メッセージ データを示すスクリーンショット。

次のステップ

コード サンプルについては、この GitHub リポジトリを参照してください。