使用事件域管理主题和发布事件

本文介绍以下操作:

  • 创建事件网格域
  • 订阅事件网格主题
  • 列出密钥
  • 将事件发布到域

若要了解事件域,请参阅了解用于管理事件网格主题的事件域

创建事件域

若要管理大型主题集,请创建一个事件域。

az eventgrid domain create \
  -g <my-resource-group> \
  --name <my-domain-name> \
  -l <location>

创建成功后会返回以下值:

{
  "endpoint": "https://<my-domain-name>.chinanorth2-1.eventgrid.azure.cn/api/events",
  "id": "/subscriptions/<sub-id>/resourceGroups/<my-resource-group>/providers/Microsoft.EventGrid/domains/<my-domain-name>",
  "inputSchema": "EventGridSchema",
  "inputSchemaMapping": null,
  "location": "chinanorth2",
  "name": "<my-domain-name>",
  "provisioningState": "Succeeded",
  "resourceGroup": "<my-resource-group>",
  "tags": null,
  "type": "Microsoft.EventGrid/domains"
}

请记下 endpointid,因为需要使用它们来管理域和发布事件。

管理对主题的访问

可通过角色分配来管理对主题的访问。 角色分配使用 Azure 基于角色的访问控制来限制对 Azure 资源的操作,仅允许经授权用户在特定范围内执行操作。

事件网格包含两个内置角色,可以使用这些角色为特定用户分配对域中不同主题的访问权限。 这些角色为 EventGrid EventSubscription Contributor (Preview)EventGrid EventSubscription Reader (Preview),分别用于创建/删除订阅,以及只允许列出事件订阅。

以下 Azure CLI 命令将 alice@contoso.com 限制为只能在主题 demotopic1 上创建或删除事件订阅:

az role assignment create \
  --assignee alice@contoso.com \
  --role "EventGrid EventSubscription Contributor (Preview)" \
  --scope /subscriptions/<sub-id>/resourceGroups/<my-resource-group>/providers/Microsoft.EventGrid/domains/<my-domain-name>/topics/demotopic1

有关管理对事件网格操作的访问权限的详细信息,请参阅事件网格安全性和身份验证

创建主题和订阅

事件网格服务根据创建域主题事件订阅的调用,在域中自动创建和管理相应的主题。 没有单独的步骤可在域中创建主题。 同样,删除某个主题的最后一个事件订阅时,也会删除该主题。

订阅域中主题的过程与订阅其他任何 Azure 资源相同。 对于源资源 ID,指定之前在创建域时返回的事件域 ID。 若要指定想要订阅的主题,请将 /topics/<my-topic> 添加到源资源 ID 的末尾。 若要创建接收域中的所有事件的域范围事件订阅,请指定事件域 ID 且不要指定任何主题。

通常情况下,将由你在前面的部分中向其授予了访问权限的用户创建订阅。 为了简化本文,将由你创建订阅。

az eventgrid event-subscription create \
  --name <event-subscription> \
  --source-resource-id "/subscriptions/<sub-id>/resourceGroups/<my-resource-group>/providers/Microsoft.EventGrid/domains/<my-domain-name>/topics/demotopic1" \
  --endpoint https://contoso.chinacloudsites.cn/api/updates

如果需要将事件订阅到某个测试终结点,始终可以部署能够显示传入事件的预生成 Web 应用。 可将事件发送到测试网站 (https://<your-site-name>.chinacloudsites.cn/api/updates)。

Button to deploy to Azure.

为主题设置的权限存储在 Microsoft Entra ID 中,必须显式删除。 如果用户对主题拥有写访问权限,则删除事件订阅不会撤销用户创建事件订阅的访问权限。

将事件发布到事件网格域

将事件发布到域的过程与发布到自定义主题相同。 但是,不是发布到自定义主题,而是将所有事件发布到域终结点。 在 JSON 事件数据中,可以指定要将事件发送到的主题。 例如,以下事件数组会导致将包含 "id": "1111" 的事件发送到主题 demotopic1,将包含 "id": "2222" 的事件发送到主题 demotopic2

[{
  "topic": "demotopic1",
  "id": "1111",
  "eventType": "maintenanceRequested",
  "subject": "myapp/vehicles/diggers",
  "eventTime": "2018-10-30T21:03:07+00:00",
  "data": {
    "make": "Contoso",
    "model": "Small Digger"
  },
  "dataVersion": "1.0"
},
{
  "topic": "demotopic2",
  "id": "2222",
  "eventType": "maintenanceCompleted",
  "subject": "myapp/vehicles/tractors",
  "eventTime": "2018-10-30T21:04:12+00:00",
  "data": {
    "make": "Contoso",
    "model": "Big Tractor"
  },
  "dataVersion": "1.0"
}]

若要使用 Azure CLI 获取域终结点,请使用:

az eventgrid domain show \
  -g <my-resource-group> \
  -n <my-domain>

若要获取域的密钥,请使用:

az eventgrid domain key list \
  -g <my-resource-group> \
  -n <my-domain>

然后,使用偏好的方法发出 HTTP POST,将事件发布到事件网格域。

注意

有关使用编程语言 SDK 将事件发布到事件网格域的示例,请使用以下链接:

搜索主题或订阅的列表

若要搜索和管理大量主题或订阅,事件网格的 API 支持列表和分页。

使用 CLI

例如,以下命令列出名称包含 mytopic 的所有主题。

az eventgrid topic list --odata-query "contains(name, 'mytopic')"

有关此命令的详细信息,请参阅az eventgrid topic list

后续步骤