快速入门:使用 Azure CLI 通过事件网格将自定义事件路由到 Azure 队列存储

Azure 事件网格是一个高度可缩放的无服务器事件代理,可用于集成使用事件的应用程序。 事件网格会将事件传递到支持的事件处理程序,Azure 队列存储就是其中之一。 本文使用 Azure CLI 执行以下步骤:

  1. 创建事件网格自定义主题。
  2. 为自定义主题创建 Azure 队列订阅。
  3. 将示例事件发送到自定义主题。
  4. 验证这些事件是否已传递到 Azure 队列存储。

如果没有 Azure 订阅,可在开始前创建一个试用帐户

创建资源组

事件网格主题是 Azure 资源,必须放置在 Azure 资源组中。 该资源组是在其中部署和管理 Azure 资源的逻辑集合。

使用“az group create”命令创建资源组。 以下示例在“chinanorth2”位置创建名为“gridResourceGroup”的资源组。

az group create --name gridResourceGroup --location chinanorth2

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

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

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

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

    registrationStateRegistered 后,即可继续。

创建自定义主题

事件网格主题提供用户定义的终结点,可向其发布事件。 以下示例在资源组中创建自定义主题。 将 <topic_name> 替换为自定义主题的唯一名称。 事件网格主题名称必须唯一,因为它由域名系统 (DNS) 条目表示。

  1. 指定主题的名称。

    topicname="<TOPIC NAME>"
    
  2. 运行下面的命令来创建主题。

    az eventgrid topic create --name $topicname -l chinanorth2 -g gridResourceGroup
    

创建队列存储

在订阅自定义主题之前,让我们创建事件消息的终结点。 创建用于收集事件的队列存储。

  1. 指定 Azure 存储帐户的唯一名称。

    storagename="<STORAGE ACCOUNT NAME>"    
    
  2. 运行以下命令,在存储中创建 Azure 存储帐户和队列(名为 eventqueue)。

    queuename="eventqueue"
    
    az storage account create -n $storagename -g gridResourceGroup -l chinanorth2 --sku Standard_LRS
    key="$(az storage account keys list -n $storagename --query "[0].{value:value}" --output tsv)"    
    az storage queue create --name $queuename --account-name $storagename --account-key $key
    

订阅自定义主题

以下示例订阅所创建的自定义主题,并传递终结点队列存储的资源 ID。 通过 Azure CLI,可采用终结点的形式传递队列存储 ID。 终结点的格式如下:

/subscriptions/<AZURE SUBSCRIPTION ID>/resourcegroups/<RESOURCE GROUP NAME>/providers/Microsoft.Storage/storageAccounts/<STORAGE ACCOUNT NAME>/queueservices/default/queues/<QUEUE NAME>

以下脚本获取队列存储帐户的资源 ID。 它构造队列存储的 ID 并订阅事件网格主题。 它将终结点类型设置为 storagequeue 并使用终结点的队列 ID。

重要

将到期日期占位符 (<yyyy-mm-dd>) 替换为实际值。 例如:在运行命令之前,替换为 2022-11-17

storageid=$(az storage account show --name $storagename --resource-group gridResourceGroup --query id --output tsv)
queueid="$storageid/queueservices/default/queues/$queuename"
topicid=$(az eventgrid topic show --name $topicname -g gridResourceGroup --query id --output tsv)

az eventgrid event-subscription create \
  --source-resource-id $topicid \
  --name mystoragequeuesubscription \
  --endpoint-type storagequeue \
  --endpoint $queueid \
  --expiration-date "<yyyy-mm-dd>"

创建事件订阅的帐户必须对队列存储具有写访问权限。 请注意为订阅设置到期日期

如果使用 REST API 创建订阅,则以独立参数的形式传递存储帐户 ID 和队列名称。

"destination": {
  "endpointType": "storagequeue",
  "properties": {
    "queueName":"eventqueue",
    "resourceId": "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.Storage/storageAccounts/<storage-name>"
  }
  ...

向自定义主题发送事件

让我们触发一个事件,看看事件网格如何将消息分发到终结点。 首先,让我们获取自定义主题的 URL 和密钥。

endpoint=$(az eventgrid topic show --name $topicname -g gridResourceGroup --query "endpoint" --output tsv)
key=$(az eventgrid topic key list --name $topicname -g gridResourceGroup --query "key1" --output tsv)

为简化本文,将使用要发送到自定义主题的示例事件数据。 通常情况下,应用程序或 Azure 服务会发送事件数据。 CURL 是发送 HTTP 请求的实用工具。 本文使用 CURL 向自定义主题发送事件。 以下示例将三个事件发送到事件网格主题:

for i in 1 2 3
do
   event='[ {"id": "'"$RANDOM"'", "eventType": "recordInserted", "subject": "myapp/vehicles/motorcycles", "eventTime": "'`date +%Y-%m-%dT%H:%M:%S%z`'", "data":{ "make": "Ducati", "model": "Monster"},"dataVersion": "1.0"} ]'
   curl -X POST -H "aeg-sas-key: $key" -d "$event" $endpoint
done

导航到门户中的队列存储,请注意,事件网格会将这三个事件发送到队列。

Screenshot showing the list of messages in the queue that are received from Event Grid.

清理资源

如果打算继续处理此事件,请不要清除本文中创建的资源。 否则,请使用以下命令删除本文中创建的资源。

az group delete --name gridResourceGroup

后续步骤

了解如何创建主题和事件订阅以后,即可进一步学习事件网格的功能:

请查看以下示例,了解如何使用不同的编程语言将事件发布到事件网格以及如何从事件网格使用事件。