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

使用命名空间主题将事件传递到 Azure 事件中心 - Azure CLI

本文提供分步说明,以 CloudEvents JSON 格式 将事件发布到 Azure 事件网格,并使用推送传送模型传送这些事件。 具体来说,使用 Azure CLI 和 Curl 将事件发布到事件网格中的命名空间主题,然后将这些事件从事件订阅推送到事件中心处理程序目标。 有关推送传递模型的详细信息,请参阅 推送传递概述

注释

Azure CLI 事件网格扩展 尚不支持命名空间及其包含的任何资源。 我们将使用 Azure CLI 资源 创建事件网格资源。

如果没有 Azure 帐户,请在开始前创建一个免费帐户

先决条件

启用事件网格资源提供程序

  1. 如果这是首次在 Azure 订阅中使用事件网格,则可能需要注册事件网格资源提供程序。 运行以下命令,注册提供程序:

    az provider register --namespace Microsoft.EventGrid
    
  2. 完成注册可能需要一些时间。 若要查看状态,请运行以下命令:

    az provider show --namespace Microsoft.EventGrid --query "registrationState"
    

    registrationStateRegistered 后,即可继续。

创建资源组

使用 az group create 命令创建 Azure 资源组。 您可以使用这个资源组来容纳本文中创建的所有资源。

使用 Cloud Shell 运行命令的一般步骤包括:

  • 选择 “打开 Cloud Shell ”以查看右侧窗格中的 Azure Cloud Shell 窗口。
  • 复制命令并将其粘贴到 Azure Cloud Shell 窗口中。
  • 按 Enter 运行命令。
  1. 声明一个变量以保存 Azure 资源组的名称。 请用您喜欢的值替换<your-resource-group-name>,以指定资源组的名称。

    resource_group="<your-resource-group-name>"
    
    location="<your-resource-group-location>"
    
  2. 创建资源组。 根据需要更改位置。

    az group create --name $resource_group --location $location
    

创建命名空间

事件网格命名空间提供一个用户定义的终结点,可在其中发布事件。 以下示例使用 Azure Cloud Shell 中的 Bash 在资源组中创建命名空间。 命名空间名称必须唯一,因为它是域名系统(DNS)条目的一部分。 命名空间名称应符合以下规则:

  • 它应介于 3-50 个字符之间。
  • 它应该是区域唯一的。
  • 仅允许的字符是 a-z、A-Z、0-9 和 -
  • 它不应以保留的关键字前缀开头,例如 MicrosoftSystemEventGrid
  1. 声明一个变量以保存事件网格命名空间的名称。 通过将<your-namespace-name>替换为您喜欢的值来指定命名空间的名称。

    namespace="<your-namespace-name>"
    
  2. 创建命名空间。 你可能想要更改部署的位置。

    az eventgrid namespace create -g $resource_group -n $namespace -l $location
    

创建命名空间主题

创建用于保存发布到命名空间终结点的所有事件的主题。

  1. 声明一个变量以保存命名空间主题的名称。 指定命名空间主题名称,请用您喜欢的值替换 <your-topic-name>

    topic="<your-topic-name>"
    
  2. 创建命名空间主题:

    az eventgrid namespace topic create -g $resource_group -n $topic --namespace-name $namespace 
    

创建新的事件中心资源

创建一个事件中心资源,该资源将用作命名空间主题推送发送订阅的处理程序目标。

  1. 声明一个变量来保存事件中心命名空间名称。

    eventHubsNamespace="<your-event-hubs-namespace-name>"
    
  2. 创建事件中心命名空间。

    az eventhubs namespace create --resource-group $resource_group --name $eventHubsNamespace --location $location  
    
  3. 声明一个变量用于保存事件中心名称。

    eventHubsEventHub="<your-event-hub-name>"
    
  4. 运行以下命令,以在命名空间中创建一个事件中心。

    az eventhubs eventhub create --resource-group $resource_group --namespace-name $eventHubsNamespace --name $eventHubsEventHub 
    

使用托管标识将事件传递到事件中心

若要使用托管标识将事件传递到事件中心命名空间中的事件中心,请执行以下步骤:

  1. 启用系统分配的或用户分配的托管标识: 命名空间。 继续阅读下一部分,了解如何使用 Azure CLI 启用托管标识。
  2. 将标识添加到 事件中心命名空间上的 Azure 事件中心数据发送者 角色,继续阅读下一部分,了解如何添加角色分配。
  3. 在事件中心命名空间中启用“允许受信任的 Microsoft 服务绕过此防火墙”设置
  4. 将使用事件中心的事件订阅配置为终结点,以使用系统分配或用户分配的托管标识。

在事件网格命名空间中启用托管标识

在事件网格命名空间中启用系统分配的托管标识。

az eventgrid namespace update --resource-group $resource_group --name $namespace --identity {type:systemassigned}

在事件中心为事件网格托管标识添加角色分配

  1. 获取事件网格命名空间系统托管标识主体 ID。

    principalId=$(az eventgrid namespace show --resource-group $resource_group --name $namespace --query identity.principalId -o tsv)
    
  2. 获取事件中心事件中心资源 ID。

    eventHubResourceId=$(az eventhubs eventhub show --resource-group $resource_group --namespace-name $eventHubsNamespace --name $eventHubsEventHub --query id -o tsv)
    
  3. 在事件中心为事件网格系统托管标识添加角色分配。

    az role assignment create --role "Azure Event Hubs Data Sender" --assignee $principalId --scope $eventHubResourceId
    

创建事件订阅

创建新的推送传递事件订阅。

event_subscription="<your_event_subscription_name>"
az resource create --api-version 2023-06-01-preview --resource-group $resource_group --namespace Microsoft.EventGrid --resource-type eventsubscriptions --name $event_subscription --parent namespaces/$namespace/topics/$topic --location $location --properties "{\"deliveryConfiguration\":{\"deliveryMode\":\"Push\",\"push\":{\"maxDeliveryCount\":10,\"deliveryWithResourceIdentity\":{\"identity\":{\"type\":\"SystemAssigned\"},\"destination\":{\"endpointType\":\"EventHub\",\"properties\":{\"resourceId\":\"$eventHubResourceId\"}}}}}}"

将事件发送到主题

现在,按照本节中的步骤将示例事件发送到命名空间主题。

列出命名空间访问密钥

  1. 获取与创建的命名空间关联的访问密钥。 发布事件时,可以使用其中一个进行身份验证。 若要列出密钥,首先需要完整的命名空间资源 ID。 运行以下命令获取它:

    namespace_resource_id=$(az eventgrid namespace show -g $resource_group -n $namespace --query "id" --output tsv)
    
  2. 从命名空间获取第一个密钥:

    key=$(az eventgrid namespace list-key -g $resource_group --namespace-name $namespace --query "key1" --output tsv)
    

发布事件

  1. 检索命名空间主机名。 你将使用该主机名来编写要将事件发送到的命名空间 HTTP 终结点。 API 版本 2023-06-01-preview首次可用以下操作。

    publish_operation_uri="https://"$(az eventgrid namespace show -g $resource_group -n $namespace --query "topicsConfiguration.hostname" --output tsv)"/topics/"$topic:publish?api-version=2023-06-01-preview
    
  2. 创建符合 CloudEvents 的示例事件:

    event=' { "specversion": "1.0", "id": "'"$RANDOM"'", "type": "com.yourcompany.order.ordercreatedV2", "source" : "/mycontext", "subject": "orders/O-234595", "time": "'`date +%Y-%m-%dT%H:%M:%SZ`'", "datacontenttype" : "application/json", "data":{ "orderId": "O-234595", "url": "https://yourcompany.com/orders/o-234595"}} '
    

    data 元素是事件的有效负载。 可以将任何格式正确的 JSON 置于此字段中。 有关可以在事件中的属性(也称为上下文属性)的详细信息,请参阅 CloudEvents 规范。

  3. 使用 CURL 将事件发送到主题。 CURL 是发送 HTTP 请求的实用工具。

    curl -X POST -H "Content-Type: application/cloudevents+json" -H "Authorization:SharedAccessKey $key" -d "$event" $publish_operation_uri
    

    导航到 Azure 门户中 的事件中心命名空间页 ,刷新页面并验证图表中的传入消息计数器是否指示已收到事件。

    显示事件中心页面的屏幕截图,其中的图表显示已收到一个事件。

后续步骤

在本文中,你已创建并配置事件网格命名空间和事件中心资源。 有关从事件中心接收事件的分步说明,请参阅以下教程: