你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:使用自定义主题将 Azure 事件网格中的 MQTT 消息路由到 Azure Functions - Azure CLI

本教程介绍如何通过事件网格自定义主题将 Azure 事件网格命名空间接收的 MQTT 消息路由到 Azure 函数,请执行以下步骤:

如果没有 Azure 订阅,可以注册免费试用版

先决条件

按照使用 Visual Studio Code 创建 Azure 函数的说明进行操作,但请使用 Azure 事件网格触发器,而不是使用 HTTP 触发器。 应会看到与如下示例类似的代码:

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 函数用作主题订阅的事件处理程序。

注意

  • 在同一区域中创建所有资源。
  • 本教程已使用采用 .NET 8.0(独立)运行时堆栈的 Azure 函数进行测试。

创建事件网格主题(自定义主题)

在此步骤中,你将创建一个事件网格主题。

  1. 将脚本复制并粘贴到编辑器。
  2. 请替换以下值。
  3. 选择“Open Cloud Shell”
  4. 从 PowerShell 切换到 Bash(在 Cloud Shell 窗口的左上角)
  5. 将脚本从编辑器复制并粘贴到 Cloud Shell 并运行该脚本。

该脚本将创建一个 Azure 资源组和及其中的事件网格自定义主题。 本教程稍后将配置事件网格命名空间的路由,以便将发送到该命名空间的事件或消息路由到自定义主题,然后通过订阅该主题路由到 Azure 函数。

占位符 说明
RESOURCEGROUPNAME 要创建的资源组的名称。
REGION 要在其中创建资源组和自定义主题的区域。
TOPICNAME 要创建的自定义主题的名称。

该脚本使用 az eventgrid topic create 命令创建事件网格主题或自定义主题。 架构类型指定为云事件架构。

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

注意

在本教程中,随处使用云事件架构。

使用函数向主题添加订阅

在此步骤中,使用前面创建的 Azure 函数创建自定义主题的订阅。

替换以下值并在 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 在事件网格命名空间上发布和订阅 MQTT 消息中的说明执行以下操作:

  1. 创建事件网格命名空间。
  2. 创建两个客户端。
  3. 创建主题空间。
  4. 创建发布者和订阅者权限绑定。
  5. 使用 MQTTX 应用进行测试,以确认客户端能够发送和接收消息。

为命名空间启用托管标识

替换以下值并运行脚本,为事件网格命名空间启用系统分配的托管标识。

占位符 说明
EVENTGRIDNAMESPACENAME 事件网格命名空间的名称。

该脚本使用 az eventgrid namespace update 命令,其中 identity 设置为 SystemAssigned 标识。

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

然后,授予命名空间托管标识向之前创建的事件网格自定义主题发送的权限,以便命名空间可以将消息发送或路由到自定义主题。 为此,可将托管标识添加到自定义主题上的事件网格数据发送方角色。

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 的 az role assignment create 命令,并将“事件网格数据发送方”角色分配给自定义主题上的命名空间托管标识

通过自定义主题将路由消息配置到 Azure 函数

在此步骤中,将配置事件网格命名空间的路由,以便接收的消息路由到所创建的自定义主题。

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

该脚本使用 az eventgrid namespace update 命令设置路由主题以及用于将事件路由到该主题的托管标识类型。

使用 MQTTX 发送测试 MQTT 消息

将测试 MQTT 消息发送到命名空间,并确认函数接收它们。

按照使用 MQTTX 应用发布、订阅消息文章中的说明,将一些测试消息发送到事件网格命名空间。

下面是事件或消息的流:

  1. MQTTX 将消息发送到事件网格命名空间的主题空间。

  2. 消息将路由到配置的自定义主题。

  3. 消息将转发到事件订阅,即 Azure 函数。

  4. 使用日志记录功能验证函数是否已收到该事件。

    显示 Azure 函数的日志流页的屏幕截图。

下一步

请参阅此 GitHub 存储库的代码示例。