你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文提供分步说明,以 CloudEvents JSON 格式 将事件发布到 Azure 事件网格,并使用推送传送模型传送这些事件。 具体来说,使用 Azure CLI 和 Curl 将事件发布到事件网格中的命名空间主题,然后将这些事件从事件订阅推送到事件中心处理程序目标。 有关推送传递模型的详细信息,请参阅 推送传递概述。
注释
Azure CLI 事件网格扩展 尚不支持命名空间及其包含的任何资源。 我们将使用 Azure CLI 资源 创建事件网格资源。
如果没有 Azure 帐户,请在开始前创建一个免费帐户。
先决条件
在 Azure Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅 Azure Cloud Shell 中的 Bash 快速入门。
如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
如果使用的是本地安装,请使用
az login
命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录。出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 将扩展与 Azure CLI 配合使用。
运行az version命令,以查看已安装的版本和依赖库。 若要升级到最新版本,请运行az upgrade。
本文需要 Azure CLI 版本 2.0.70 或更高版本。 如果使用 Azure Cloud Shell,则最新版本已安装。
启用事件网格资源提供程序
如果这是首次在 Azure 订阅中使用事件网格,则可能需要注册事件网格资源提供程序。 运行以下命令,注册提供程序:
az provider register --namespace Microsoft.EventGrid
完成注册可能需要一些时间。 若要查看状态,请运行以下命令:
az provider show --namespace Microsoft.EventGrid --query "registrationState"
当
registrationState
为Registered
后,即可继续。
创建资源组
使用 az group create 命令创建 Azure 资源组。 您可以使用这个资源组来容纳本文中创建的所有资源。
使用 Cloud Shell 运行命令的一般步骤包括:
- 选择 “打开 Cloud Shell ”以查看右侧窗格中的 Azure Cloud Shell 窗口。
- 复制命令并将其粘贴到 Azure Cloud Shell 窗口中。
- 按 Enter 运行命令。
声明一个变量以保存 Azure 资源组的名称。 请用您喜欢的值替换
<your-resource-group-name>
,以指定资源组的名称。resource_group="<your-resource-group-name>"
location="<your-resource-group-location>"
创建资源组。 根据需要更改位置。
az group create --name $resource_group --location $location
创建命名空间
事件网格命名空间提供一个用户定义的终结点,可在其中发布事件。 以下示例使用 Azure Cloud Shell 中的 Bash 在资源组中创建命名空间。 命名空间名称必须唯一,因为它是域名系统(DNS)条目的一部分。 命名空间名称应符合以下规则:
- 它应介于 3-50 个字符之间。
- 它应该是区域唯一的。
- 仅允许的字符是 a-z、A-Z、0-9 和 -
- 它不应以保留的关键字前缀开头,例如
Microsoft
,System
或EventGrid
。
声明一个变量以保存事件网格命名空间的名称。 通过将
<your-namespace-name>
替换为您喜欢的值来指定命名空间的名称。namespace="<your-namespace-name>"
创建命名空间。 你可能想要更改部署的位置。
az eventgrid namespace create -g $resource_group -n $namespace -l $location
创建命名空间主题
创建用于保存发布到命名空间终结点的所有事件的主题。
声明一个变量以保存命名空间主题的名称。 指定命名空间主题名称,请用您喜欢的值替换
<your-topic-name>
。topic="<your-topic-name>"
创建命名空间主题:
az eventgrid namespace topic create -g $resource_group -n $topic --namespace-name $namespace
创建新的事件中心资源
创建一个事件中心资源,该资源将用作命名空间主题推送发送订阅的处理程序目标。
声明一个变量来保存事件中心命名空间名称。
eventHubsNamespace="<your-event-hubs-namespace-name>"
创建事件中心命名空间。
az eventhubs namespace create --resource-group $resource_group --name $eventHubsNamespace --location $location
声明一个变量用于保存事件中心名称。
eventHubsEventHub="<your-event-hub-name>"
运行以下命令,以在命名空间中创建一个事件中心。
az eventhubs eventhub create --resource-group $resource_group --namespace-name $eventHubsNamespace --name $eventHubsEventHub
使用托管标识将事件传递到事件中心
若要使用托管标识将事件传递到事件中心命名空间中的事件中心,请执行以下步骤:
- 启用系统分配的或用户分配的托管标识: 命名空间。 继续阅读下一部分,了解如何使用 Azure CLI 启用托管标识。
- 将标识添加到 事件中心命名空间上的 Azure 事件中心数据发送者 角色,继续阅读下一部分,了解如何添加角色分配。
- 在事件中心命名空间中启用“允许受信任的 Microsoft 服务绕过此防火墙”设置。
- 将使用事件中心的事件订阅配置为终结点,以使用系统分配或用户分配的托管标识。
在事件网格命名空间中启用托管标识
在事件网格命名空间中启用系统分配的托管标识。
az eventgrid namespace update --resource-group $resource_group --name $namespace --identity {type:systemassigned}
在事件中心为事件网格托管标识添加角色分配
获取事件网格命名空间系统托管标识主体 ID。
principalId=$(az eventgrid namespace show --resource-group $resource_group --name $namespace --query identity.principalId -o tsv)
获取事件中心事件中心资源 ID。
eventHubResourceId=$(az eventhubs eventhub show --resource-group $resource_group --namespace-name $eventHubsNamespace --name $eventHubsEventHub --query id -o tsv)
在事件中心为事件网格系统托管标识添加角色分配。
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\"}}}}}}"
将事件发送到主题
现在,按照本节中的步骤将示例事件发送到命名空间主题。
列出命名空间访问密钥
获取与创建的命名空间关联的访问密钥。 发布事件时,可以使用其中一个进行身份验证。 若要列出密钥,首先需要完整的命名空间资源 ID。 运行以下命令获取它:
namespace_resource_id=$(az eventgrid namespace show -g $resource_group -n $namespace --query "id" --output tsv)
从命名空间获取第一个密钥:
key=$(az eventgrid namespace list-key -g $resource_group --namespace-name $namespace --query "key1" --output tsv)
发布事件
检索命名空间主机名。 你将使用该主机名来编写要将事件发送到的命名空间 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
创建符合 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 规范。使用 CURL 将事件发送到主题。 CURL 是发送 HTTP 请求的实用工具。
curl -X POST -H "Content-Type: application/cloudevents+json" -H "Authorization:SharedAccessKey $key" -d "$event" $publish_operation_uri
导航到 Azure 门户中 的事件中心命名空间页 ,刷新页面并验证图表中的传入消息计数器是否指示已收到事件。
后续步骤
在本文中,你已创建并配置事件网格命名空间和事件中心资源。 有关从事件中心接收事件的分步说明,请参阅以下教程: