当前位置: 首页 > 知识库问答 >
问题:

使用ARM创建事件网格订阅,为订阅收集事件

史懿轩
2023-03-14

基本上,我试图使用ARM部署一个事件网格订阅来收集订阅中的特定事件(主题类型= Azure订阅)。我已经有一个创建了事件网格触发功能的功能应用程序,只需要将该功能与事件网格订阅绑定为webhook。

我正在使用Azure DevOps中的发布管道来自动化整个工作流。

以下是我使用的一个示例:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "egstopic": {
      "type": "string",
      "defaultValue": "egstopic1",
      "metadata": {
        "description": "Event grid system topic"
      }
    },
    "eventSubName": {
      "type": "string",
      "defaultValue": "esub1",
      "metadata": {
        "description": "Event grid system topic"
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Location for all resources."
      }
    },
    "eventGridFunc":{
        "type": "string",
        "defaultValue": "VmAddedListener",
        "metadata": {
            "description" : "Function Name"
        }
      }
    },
  "variables": {
    "functionUrl" : "[concat('https://', variables('FunctionAppName'),'.azurewebsites.net/runtime/webhooks/eventgrid?functionName=', parameters('eventGridFunc'),'&code=')]",
    "functionAppName": "event-driven-func2"
  },
  "resources": [
    {
        "type": "Microsoft.EventGrid/Topics",
        "apiVersion": "2018-01-01",
        "name": "[parameters('egstopic')]",
        "location": "[parameters('location')]",
        "properties":{}
    },
    {
    "type": "Microsoft.EventGrid/Topics/providers/eventSubscriptions",
    "name": "[concat(parameters('egstopic'), '/Microsoft.EventGrid/', parameters('eventSubName'))]",
    "location": "[parameters('location')]",
    "apiVersion": "2018-01-01",
    "dependsOn": [
                "[parameters('egstopic')]"
            ],
    "properties": {
        "destination": {
            "endpointType": "WebHook",
            "properties": {
                "endpointUrl": "[concat(variables('functionUrl'), listKeys(resourceId('Microsoft.Web/sites/host/', variables('functionAppName'), 'default'),'2016-08-01').masterKey)]"
            }
        },
        "filter": {
            "includedEventTypes": [
                "Microsoft.Resources.ResourceWriteSuccess"
            ],
            "advancedFilters": [
                {
                "key": "data.operationName",
                "operatorType": "StringContains",
                "values": [
                    "Microsoft.Compute/virtualMachines/write"
                ]
                }
            ] 
        }           
        }
    }
  ]
}

这最终部署了事件网格主题,而不是事件网格订阅。

然后,有人建议我尝试以下操作:

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.1",
  "parameters": {
    "egstopic": {
      "type": "string",
      "defaultValue": "egstopic1",
      "metadata": {
        "description": "Event grid system topic"
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Location for all resources."
      }
    },
    "eventGridFunc":{
        "type": "string",
        "defaultValue": "VmAddedListener",
        "metadata": {
            "description" : "Function Name"
        }
      }
    },
  "variables": {
    "functionUrl" : "[concat('https://', variables('FunctionAppName'),'.azurewebsites.net/runtime/webhooks/eventgrid?functionName=', parameters('eventGridFunc'),'&code=')]",
    "functionAppName": "event-driven-func2",
    "eventSubName": "[concat('esub',uniquestring(resourceGroup().id))]",
    "eventSubTopic": "[concat('/subscriptions/',subscription().subscriptionid)]"

  },
  "resources": [
      {
        "type": "Microsoft.EventGrid/systemTopics/eventSubscriptions",
        "name": "eventSubEG1",
        "location": "[parameters('location')]",
        "apiVersion": "2020-04-01-preview",
        "properties": {
            "destination": {
                "endpointType": "WebHook",
                "properties": {
                    "endpointUrl": "[concat(variables('functionUrl'), listKeys(resourceId('Microsoft.Web/sites/host/', variables('functionAppName'), 'default'),'2016-08-01').masterKey)]"
                }
            },
            "filter": {
                "includedEventTypes": [
                    "Microsoft.Resources.ResourceWriteSuccess"
                ],
                "advancedFilters": [
                    {
                    "key": "data.operationName",
                    "operatorType": "StringContains",
                    "values": [
                        "Microsoft.Compute/virtualMachines/write"
                    ]
                    }
                ] 
            }           
          }
      }
    ]
}

但是这最终以这个错误而失败:嵌套资源类型的段数必须与其资源名称相同。根资源类型的段长度必须比其资源名称大一个

只需要想办法用ARM或者Azure DevOps来自动化这个过程。

共有1个答案

阮喜
2023-03-14

我有一个基于你的模板更新的模板,并测试了这个模板,它工作得很好。它创建一个事件网格主题和订阅,并将事件网格触发器功能与它联系起来。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "eventGridTopicName": {
            "type": "String",
            "metadata": {
                "description": "The name of the Event Grid custom topic."
            }
        },
        "eventGridSubscriptionName": {
            "type": "String",
            "metadata": {
                "description": "The name of the Event Grid custom topic's subscription."
            }
        },
        "eventGridSubscriptionURL": {
            "type": "String",
            "metadata": {
                "description": "Event grid subscription URL."
            }
        },
        "location": {
            "defaultValue": "[resourceGroup().location]",
            "type": "String",
            "metadata": {
                "description": "The location in which the Event Grid resources should be deployed."
            }
        }
    },
    "resources": [
        {
            "type": "Microsoft.EventGrid/topics",
            "apiVersion": "2018-01-01",
            "name": "[parameters('eventGridTopicName')]",
            "location": "[parameters('location')]"
        },
        {
            "type": "Microsoft.EventGrid/topics/providers/eventSubscriptions",
            "apiVersion": "2018-01-01",
            "name": "[concat(parameters('eventGridTopicName'), '/Microsoft.EventGrid/', parameters('eventGridSubscriptionName'))]",
            "location": "[parameters('location')]",
            "dependsOn": [
                "[parameters('eventGridTopicName')]"
            ],
            "properties": {
                "destination": {
                    "endpointType": "WebHook",
                    "properties": {
                        "endpointUrl": "[parameters('eventGridSubscriptionURL')]"
                    }
                },
                "filter": {
                    "includedEventTypes": [
                        "All"
                    ]
                }
            }
        }
    ]
}

您可以通过转到功能应用程序复制事件网格订阅URL-

希望这有帮助!

 类似资料:
  • Node.js应用程序可以使用composer-client.BusinessNetworkConnection.onAPI调用从业务网络订阅事件。事件在业务网络模型文件中定义,并由交易处理函数文件中的指定交易处理。有关发布事件的更多信息,请参阅发布事件。 在你开始之前 在应用程序可以订阅事件之前,你必须定义一些事件和发送它们的交易。还必须部署业务网络,并且必须具有可连接到该业务网络的连接配置文件

  • 我正试图开发一个Azure函数来处理由事件中心的捕获功能创建的blob。然而,尽管捕获blobs被正确地存储在容器中,但似乎没有< code>Microsoft。EventHub . capturefile created 事件发布到函数订阅。功能endpoint的事件订阅已创建,没有错误,Azure CLI的输出为 该函数的主体是一个标准的Http触发器,其中包含事件网格endpoint订阅所需

  • Tendermint 会发出不同的事件,您可以通过Websocket订阅这些事件。这对于第三方应用程序(如 analysys)或检查状态非常有用。 事件列表 您可以通过 Websocket 调用 subscribe RPC 方法订阅上面的任何事件。 { "jsonrpc": "2.0", "method": "subscribe", "id": "0", "para

  • 调用: myContract.events.allEvents([options][, callback]) 与events相同,只是可以接收合约的全部事件。可以使用options.filter属性进行过滤。

  • 订阅指定的合约事件。 调用: myContract.events.MyEvent([options][, callback]) 参数: options - Object: 可选,用于部署的选项,包含以下字段: filter - Object : 可选,按索引参数过滤事件。例如 {filter: {myNumber: [12,13]}} 表示 “myNumber” 为12或13的所有事件 from

  • 我目前正在使用节点js将主题发布到事件网格,并通过事件网格订阅主题。在https://docs.microsoft.com/en-us/rest/api/eventgrid/使用事件网格API时,我收到一个错误,其中我在创建订阅时无权执行操作。我创建了一个主题并具有访问我的Azure帐户的门禁权限,因此我不明白为什么会出现这个Rest错误。 我的代码: 输出: 感谢您的帮助!