你当前正在访问 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. 选择 “打开 Cloud Shell”。
  4. PowerShell 切换到 Bash (在 Cloud Shell 窗口的左上角)。
  5. 将脚本从编辑器复制并粘贴到 Cloud Shell 并运行该脚本。

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

Placeholder Description
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 函数,事件传送架构指定为云事件架构。

Placeholder Description
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 应用 进行测试,以确认客户端能够发送和接收消息。

为命名空间启用托管标识

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

Placeholder Description
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

该脚本将 az role assignment create 命令与命名空间的托管标识和自定义主题的 ID 配合使用,并将 事件网格数据发送者 角色分配给自定义主题上的命名空间托管标识。

通过自定义主题将路由消息配置到 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 存储库中的代码示例。