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

使用命名空间主题将事件传递到 Webhook - Azure CLI(预览版)

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

注意

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

如果没有 Azure 订阅,请在开始之前创建一个 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,则最新版本已安装。

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

  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 
    

创建消息终结点

在订阅命名空间主题之前,让我们创建事件消息的终结点。 通常情况下,终结点基于事件数据执行操作。 为了简化此快速入门,将部署用于显示事件消息的预生成 Web 应用。 所部署的解决方案包括应用服务计划、应用服务 Web 应用和 GitHub 中的源代码。

  1. 复制以下命令,指定 Web 应用的名称(事件网格查看器示例),然后按 Enter 运行命令。 将 <your-site-name> 替换为 Web 应用的唯一名称。 Web 应用名称必须唯一,因为它是 DNS 条目的一部分。

    sitename="<your-site-name>"
    
  2. 运行 az deployment group create,使用 Azure 资源管理器模板部署 Web 应用。

    az deployment group create \
      --resource-group $resource_group \
      --template-uri "https://raw.githubusercontent.com/Azure-Samples/azure-event-grid-viewer/master/azuredeploy.json" \
      --parameters siteName=$sitename hostingPlanName=viewerhost
    

部署可能需要几分钟时间才能完成。 部署成功后,请查看 Web 应用以确保它正在运行。 在 Web 浏览器中导航到 https://<your-site-name>.azurewebsites.net。 应会看到站点上当前未显示任何消息。

将事件传送到 Azure 事件网格查看器 Webhook

使用 Azure 事件网格查看器的 Webhook 创建命名空间的推送传递事件订阅。

  1. 定义一个变量,用于保存事件订阅的名称。

    event_subscription="<your_event_subscription_name>"
    
  2. EVENTGRIDWEBSITENAME 替换为事件网格查看器网站的名称。 例如:contosoegridviewer

    az resource create --api-version 2024-06-01-preview --resource-group $resource_group --namespace Microsoft.EventGrid --resource-type eventsubscriptions --name $event_subscription --parent namespaces/$namespace/topics/$topic --location $location --properties "{\"eventDeliverySchema\": \"CloudEventSchemaV1_0\",\"deliveryConfiguration\":{\"deliveryMode\":\"Push\",\"push\":{\"destination\":{\"endpointType\":\"WebHook\",\"properties\":{\"endpointUrl\":\"https:\/\/$sitename.azurewebsites.net\/api/updates\"}}}}}"
    

将事件发送到主题

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

列出命名空间访问密钥

  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 事件网格查看器是否收到了该事件

验证 Azure 事件网格查看器 Web 应用是否显示其从事件网格收到的事件。

显示 Azure 事件网格查看器和接收到的事件示例的屏幕截图。

在本快速入门中,使用 Webhook 作为事件处理程序。 有关使用 Azure 事件中心作为事件处理程序的快速入门,请参阅使用命名空间主题将事件传递到 Azure 事件中心