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

教程:将事件转接到事件网格云

本文逐步讲解将边缘事件转接到 Azure 云中的事件网格所需的所有步骤。 你可能需要执行此操作的原因如下:

  • 响应云中的边缘事件。
  • 将事件转接到云中的事件网格,并使用 Azure 事件中心或 Azure 存储队列来缓冲事件,然后在云中处理事件。

若要完成本教程,你需要理解有关边缘Azure 的事件网格概念。 有关其他目标类型,请参阅事件处理程序

重要

2023 年 3 月 31 日,Azure IoT Edge 上的事件网格支持将终止,因此请确保在该日期之前过渡到 IoT Edge 本机功能。 有关详细信息,请参阅从 Azure IoT Edge 上的事件网格过渡到 Azure IoT Edge

先决条件

若要完成本教程,您需要:

  • Azure 订阅 - 创建免费帐户(如果还没有的话)。
  • Azure IoT 中心和 IoT Edge 设备 - 按照 LinuxWindows 设备快速入门中的步骤操作(如果还没有这样做的话)。

部署事件网格 IoT Edge 模块

有多种方法可以将模块部署到 IoT Edge 设备,并且所有这些方法都适用于 IoT Edge 上的 Azure 事件网格。 本文介绍从 Azure 门户部署 IoT Edge 上的事件网格的步骤。

注意

在本教程中,将部署不带持久性的事件网格模块。 这意味着,本教程中创建的任何主题和订阅都将在重新部署模块时被删除。 有关如何设置持久性的详细信息,请参阅以下文章:Linux 中的持久状态Windows 中的持久状态。 对于生产工作负载,建议安装带有持久性的事件网格模块。

重要

在本教程中,将在客户端身份验证关闭的情况下部署事件网格模块,并允许 HTTP 订阅服务器。 对于生产工作负载,建议仅启用启用了客户端身份验证的 HTTPS 请求和订阅服务器。 有关如何安全配置事件网格模块的详细信息,请参阅安全性和身份验证

选择 IoT Edge 设备

  1. 登录到 Azure 门户
  2. 导航到 IoT 中心。
  3. 从“自动设备管理”部分的菜单中选择“IoT Edge” 。
  4. 在设备列表中单击目标设备的 ID
  5. 选择“设置模块” 。 请将页面保持打开状态。 将在该页面继续执行下一部分中的步骤。

配置部署清单

部署清单是一个 JSON 文档,其中描述了要部署的模块、数据在模块间的流动方式以及模块孪生的所需属性。 Azure 门户提供部署清单的创建向导,无需你手动构建 JSON 文档。 它分为三步:添加模块、指定路由和评审部署 。

添加模块

  1. 在“部署模块”部分,选择“添加”
  2. 从下拉列表的模块类型中选择“IoT Edge 模块”
  3. 提供容器的名称、映像、容器创建选项:

注意

请始终检查映像的版本,确保其具有所需的功能。 如果在计算机上已拉取以前版本的容器映像,则需要指定所需的版本标记,或在使用 :latest 标记再次拉取之前删除现有映像。 有关映像版本和标记的详细信息,请参阅发行说明

  • 名称:eventgridmodule
  • 映像 URImcr.microsoft.com/azure-event-grid/iotedge:latest
  • 容器创建选项
    {
      "Env": [
        "inbound__clientAuth:clientCert__enabled=false",
        "outbound__webhook__httpsOnly=false"
      ],
      "HostConfig": {
        "PortBindings": {
          "4438/tcp": [
            {
              "HostPort": "4438"
            }
          ]
        }
      }
    }
  1. 单击“保存”

  2. 单击“下一步”转到路由部分

    注意

    如果使用 Azure VM 作为边缘设备,请添加入站端口规则以允许端口 4438 上有入站流量。 有关添加规则的说明,请参阅如何打开 VM 的端口

设置路由

保留默认路由,然后选择“下一步”,转到评审部分

评审部署

  1. 评审部分介绍了根据上述两部分中的选择所创建的 JSON 部署清单。 确认列表中显示了两个模块:$edgeAgent 和 $edgeHub 。 这两个模块构成 IoT Edge 运行时,并且是每个部署中所需的默认模块。
  2. 审阅部署信息,然后选择“提交”

验证部署

  1. 提交部署后,返回到 IoT 中心的“IoT Edge”页。
  2. 选择用作部署目标的“IoT Edge 设备”,以打开其详细信息。
  3. 在设备详细信息中,验证事件网格模块是否已列为“在部署中指定”和“由设备报告” 。

可能需要等待一段时间,该模块才会在设备上启动并向 IoT 中心发回报告。 刷新页面以查看更新的状态。

在云中创建事件网格主题和订阅

按照本教程的说明,在云中创建事件网格主题和订阅。 记录新创建主题的 topicURLsasKeytopicName,本教程稍后将使用。

例如,如果你在“美国西部”中创建了一个名为 testegcloudtopic 的主题,则这些值将如下所示:

  • “TopicUrl”:https://testegcloudtopic.westus2-1.eventgrid.azure.net/api/events
  • “TopicName”:testegcloudtopic
  • “SasKey”:在主题的“AccessKey”下提供。 使用“key1”。

在边缘创建事件网格主题

  1. 创建包含以下内容的 topic3.json。 有关有效负载的详细信息,请参阅 API 文档

        {
          "name": "sampleTopic3",
          "properties": {
            "inputschema": "eventGridSchema"
          }
        }
    
  2. 运行下面的命令来创建主题。 应返回 HTTP 状态代码 200 OK。

    curl -k -H "Content-Type: application/json" -X PUT -g -d @topic3.json https://<your-edge-device-public-ip-here>:4438/topics/sampleTopic3?api-version=2019-01-01-preview
    
  3. 运行下面的命令,以验证主题是否已成功创建。 应返回 HTTP 状态代码 200 OK。

    curl -k -H "Content-Type: application/json" -X GET -g https://<your-edge-device-public-ip-here>:4438/topics/sampleTopic3?api-version=2019-01-01-preview
    

    示例输出:

         [
           {
             "id": "/iotHubs/eg-iot-edge-hub/devices/eg-edge-device/modules/eventgridmodule/topics/sampleTopic3",
             "name": "sampleTopic3",
             "type": "Microsoft.EventGrid/topics",
             "properties": {
               "endpoint": "https://<edge-vm-ip>:4438/topics/sampleTopic3/events?api-version=2019-01-01-preview",
               "inputSchema": "EventGridSchema"
             }
           }
         ]
    

在边缘创建事件网格订阅

注意

如果需要确保在设备重启时挂起的事件得以保留,则需要为事件订阅启用暂留。 有关如何设置暂留的详细信息,请参阅以下文章:Linux 中的保留状态Windows 中的保留状态

  1. 创建包含以下内容的 subscription3.json。 有关有效负载的详细信息,请参阅 API 文档

         {
           "properties": {
             "destination": {
               "endpointType": "eventGrid",
               "properties": {
                         "endpointUrl": "<your-event-grid-cloud-topic-endpoint-url>?api-version=2018-01-01",
                         "sasKey": "<your-event-grid-topic-saskey>",
                         "topicName": null
               }
             }
           }
     }
    

    注意

    “endpointUrl” 指定云中的事件网格主题 URL。 “sasKey”是指事件网格云主题的键。 “topicName”中的值将用于将所有传出事件标记到事件网格。 在发布到事件网格域主题时,这可能很有用。 有关事件网格域主题的详细信息,请参阅事件域

    例如,

        {
          "properties": {
            "destination": {
              "endpointType": "eventGrid",
              "properties": {
                "endpointUrl": "https://testegcloudtopic.westus2-1.eventgrid.azure.net/api/events?api-version=2018-01-01",
                 "sasKey": "<your-event-grid-topic-saskey>",
                 "topicName": null
              }
            }
          }
        }
    
  2. 运行以下命令以创建订阅。 应返回 HTTP 状态代码 200 OK。

    curl -k -H "Content-Type: application/json" -X PUT -g -d @subscription3.json https://<your-edge-device-public-ip-here>:4438/topics/sampleTopic3/eventSubscriptions/sampleSubscription3?api-version=2019-01-01-preview
    
  3. 运行下面的命令,以验证订阅是否已成功创建。 应返回 HTTP 状态代码 200 OK。

    curl -k -H "Content-Type: application/json" -X GET -g https://<your-edge-device-public-ip-here>:4438/topics/sampleTopic3/eventSubscriptions/sampleSubscription3?api-version=2019-01-01-preview
    

    示例输出:

         {
          "id": "/iotHubs/eg-iot-edge-hub/devices/eg-edge-device/modules/eventgridmodule/topics/sampleTopic3/eventSubscriptions/sampleSubscription3",
          "type": "Microsoft.EventGrid/eventSubscriptions",
          "name": "sampleSubscription3",
          "properties": {
            "Topic": "sampleTopic3",
            "destination": {
              "endpointType": "eventGrid",
              "properties": {
                "endpointUrl": "https://testegcloudtopic.westus2-1.eventgrid.azure.net/api/events?api-version=2018-01-01",
                "sasKey": "<your-event-grid-topic-saskey>",
                "topicName": null
              }
            }
          }
        }
    

在边缘发布事件

  1. 创建包含以下内容的 event3.json。 有关有效负载的详细信息,请参阅 API 文档

        [
          {
            "id": "eventId-egcloud-0",
            "eventType": "recordInserted",
            "subject": "myapp/vehicles/motorcycles",
            "eventTime": "2019-07-28T21:03:07+00:00",
            "dataVersion": "1.0",
            "data": {
              "make": "Ducati",
              "model": "Monster"
            }
          }
        ]
    
  2. 运行下面的命令:

    curl -k -H "Content-Type: application/json" -X POST -g -d @event3.json https://<your-edge-device-public-ip-here>:4438/topics/sampleTopic3/events?api-version=2019-01-01-preview
    

验证云中的边缘事件

有关查看由云主题传递的事件的信息,请参阅教程

清理资源

  • 运行以下命令以删除主题及其所有订阅

    curl -k -H "Content-Type: application/json" -X DELETE https://<your-edge-device-public-ip-here>:4438/topics/sampleTopic3?api-version=2019-01-01-preview
    
  • 同时删除在云(Azure 事件网格)中创建的主题和订阅。

后续步骤

在本教程中,你在边缘上发布事件,并将其转接到 Azure 云中的事件网格。 现在,你已经了解了转接到云中事件网格的基本步骤: