Share via


チュートリアル: カスタム トピックを使用して Azure Event Grid の MQTT メッセージを Azure Functions にルーティングする - Azure CLI

このチュートリアルでは、次の手順に従って、Event Grid のカスタム トピックを使用して、Azure Event Grid 名前空間で受信した MQTT メッセージを Azure 関数にルーティングする方法について学習します。

Azure サブスクリプションを持っていない場合は、無料試用版にサインアップできます。

前提条件

Visual Studio Code を使用した Azure 関数の作成に関するページの手順に従いますが、HTTP トリガー を使用する代わりに、Azure Event Grid トリガーを使用します。 次の例のようなコードが表示されます。

using System;
using Azure.Messaging;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

namespace Company.Function
{
    public class MyEventGridTriggerFunc
    {
        private readonly ILogger<MyEventGridTriggerFunc> _logger;

        public MyEventGridTriggerFunc(ILogger<MyEventGridTriggerFunc> logger)
        {
            _logger = logger;
        }

        [Function(nameof(MyEventGridTriggerFunc))]
        public void Run([EventGridTrigger] CloudEvent cloudEvent)
        {
            _logger.LogInformation("Event type: {type}, Event subject: {subject}", cloudEvent.Type, cloudEvent.Subject);
        }
    }
}

この Azure 関数は、このチュートリアルの後半でトピックのサブスクリプションのイベント ハンドラーとして使用します。

Note

  • すべてのリソースを同じリージョンに作成します。
  • このチュートリアルは、.NET 8.0 (分離) ランタイム スタックを使用する Azure 関数でテストされています。

Event Grid トピックを作成する (カスタム トピック)

この手順では、Event Grid トピックを作成します。

  1. スクリプトをコピーしてエディターに貼り付けます。
  2. 次の値を置き換えます。
  3. [Cloud Shell を開く] を選択 します。
  4. PowerShell から Bash に 切り替えます (Cloud Shell ウィンドウの左上隅)。
  5. エディターから Cloud Shell にスクリプトをコピーして貼り付け、スクリプトを実行します。

このスクリプトでは、Azure リソース グループとその中に Event Grid カスタム トピックが作成されます。 このチュートリアルの後半では、Event Grid 名前空間のルーティングを構成して、名前空間に送信されたイベントまたはメッセージがカスタム トピックにルーティングされ、さらに、そのトピックのサブスクリプションを介して Azure 関数にルーティングされるようにします。

プレースホルダー 説明
RESOURCEGROUPNAME 作成されるリソース グループの名前です。
REGION リソース グループとカスタム トピックを作成するリージョン。
TOPICNAME 作成するカスタム トピックの名前。

このスクリプトでは、az eventgrid topic create コマンドを使用して、Event Grid トピックまたはカスタム トピックを作成します。 スキーマの種類は、クラウド イベント スキーマとして指定されます。

rgName="RESOURCEGROUPNAME"
location="REGION"
topicName="TOPICNAME"

az group create -n $rgName -l $location

az eventgrid topic create --name $topicName -l $location -g $rgName --input-schema cloudeventschemav1_0

Note

このチュートリアルのすべての場所でクラウド イベント スキーマを使用します。

関数を使用してトピックにサブスクリプションを追加する

この手順では、前に作成した Azure 関数を使用して、Event Grid トピックのサブスクリプションを作成します。

次の値を置き換え、Cloud Shell でスクリプトを実行します。 このスクリプトでは、az eventgrid event-subscription create コマンドを使用して、カスタム トピックへの Azure 関数サブスクリプションを作成します。 このコマンドでは、ソース ID はトピックのリソース ID であり、エンドポイントは関数のリソース ID です。 エンドポイントの種類は Azure 関数に設定され、イベント配信スキーマはクラウド イベント スキーマとして指定されます。

プレースホルダー 説明
FUNCTIONRESOURCEGROUP Azure Functions アプリを持つリソース グループの名前。
FUNCTIONSAPPNAME Azure Functions アプリを発行する
FUNCTIONNAME Azure 関数の名前。
funcAppRgName="FUNCTIONRESOURCEGROUP"
funcAppName="FUNCTIONSAPPNAME"
funcName="FUNCTIONNAME"
funcResourceId=$(az functionapp function show -g $funcAppRgName -n $funcAppName --function-name $funcName --query "{I:id}" -o tsv)

topicResourceId=$(az eventgrid topic show --name $topicName -g $rgName --query id --output tsv)
eventSubscriptionName="EVENTSUBSCRIPTIONNAME"
az eventgrid event-subscription create --name $eventSubscriptionName --source-resource-id $topicResourceId  --endpoint-type azurefunction --endpoint $funcResourceId --event-delivery-schema cloudeventschemav1_0

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

クイック スタート: Azure CLI を使用して Event Grid 名前空間で MQTT メッセージを発行してサブスクライブする」の手順に従って以下を行います。

  1. Event Grid 名前空間を作成します。
  2. 2 つのクライアントを作成します。
  3. トピック空間を作成します。
  4. パブリッシャーとサブスクライバーのアクセス許可バインドを作成します。
  5. MQTTX アプリを使用してテストし、クライアントがメッセージを送受信できることを確認します。

名前空間のマネージド ID を有効にする

次の値を置き換えてスクリプトを実行して、Event Grid 名前空間のシステム割り当てマネージド ID を有効にします。

プレースホルダー 説明
EVENTGRIDNAMESPACENAME Event Grid 名前空間の名前。

このスクリプトでは、identitySystemAssigned ID に設定して az eventgrid namespace update コマンドを使用します。

nsName="EVENTGRIDNAMESPACENAME"
az eventgrid namespace update -g $rgName -n $nsName --topic-spaces-configuration "{state:Enabled}" --identity "{type:SystemAssigned}"

次に、名前空間がカスタム トピックにメッセージを送信またはルーティングできるように、先ほど作成した Event Grid カスタム トピックに対する送信アクセス許可を名前空間のマネージド ID に付与します。 そのためには、マネージド ID をカスタム トピックの Event Grid データ送信者のロールに追加します。

egNamespaceServicePrincipalObjectID=$(az ad sp list --display-name $nsName --query [].id -o tsv)
topicResourceId=$(az eventgrid topic show --name $topicName -g $rgName --query id --output tsv)
az role assignment create --assignee $egNamespaceServicePrincipalObjectID --role "EventGrid Data Sender" --scope $topicResourceId

このスクリプトでは、名前空間のマネージド ID とカスタム トピックの ID で az role assignment create コマンドを使用し、Event Grid Data Sender ロールをカスタム トピックの名前空間のマネージド ID に割り当てます。

カスタム トピックを使用して Azure 関数へのメッセージのルーティングを構成する

この手順では、受信したメッセージが作成したカスタム トピックにルーティングされるように、Event Grid 名前空間のルーティングを構成します。

az eventgrid namespace update -g $rgName -n $nsName --topic-spaces-configuration "{state:Enabled,'routeTopicResourceId':$topicResourceId,'routingIdentityInfo':{type:SystemAssigned}}"

このスクリプトでは、az eventgrid namespace update コマンドを使用して、ルーティング トピックと、トピックへのイベントのルーティングに使用するマネージド ID の種類を設定します。

MQTTX を使用してテスト MQTT メッセージを送信する

テスト MQTT メッセージを名前空間に送信し、関数が受信していることを確認します。

MQTTX アプリを使用したメッセージの発行とサブスクライブ」の手順に従って、いくつかのテスト メッセージを Event Grid 名前空間に送信します。

イベントまたはメッセージのフローを次に示します。

  1. MQTTX は、Event Grid 名前空間のトピック空間にメッセージを送信します。

  2. メッセージは、構成したカスタム トピックにルーティングされます。

  3. メッセージは、Azure 関数であるイベント サブスクリプションに転送されます。

  4. ログ機能を使用して、関数がイベントを受信したことを確認します。

    Azure 関数の [ログ ストリーム] ページを示すスクリーンショット。

次のステップ

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