如何从 ARM 模板创建带有事件网格订阅的逻辑应用程序
How do I create Logic App with Event Grid subscription from ARM-template
我制作了一个逻辑应用程序来侦听事件网格主题并且它工作正常,但是如果我删除它并尝试从模板创建它不起作用。它永远不会 运行s.
问题在于,虽然它确实创建了与事件网格的 API 连接,但它未授权并且它也没有创建对事件网格主题的任何订阅。在任何时候都不会显示任何错误。一切都成功了,但它并没有创造出它应该创造的一切。
为了解决这个问题,我向 Powershell 脚本添加了命令以对其进行身份验证。这工作正常,但这当然不会创建订阅。
如果我再次 运行 ARM 模板,我希望它现在创建它,因为连接无效,但不,它不是。我想 Azure 意识到模板中没有任何更改并且什么也不做?如果我编辑 ARM 模板并更改订阅名称,然后再次部署它,那么订阅就会创建并开始工作。
我当然可以使用 2 个不同的订阅名称作为参数调用模板两次,但这听起来很愚蠢。必须有一些更好的方法。
那么从模板和脚本创建这种逻辑应用程序的最佳方式是什么?
我认为没有办法解决首次部署后所需的授权。因此,最简单的解决方案是拥有 2 个单独的模板 - 一个用于 API 连接,另一个用于逻辑应用程序。
您的 PowerShell 脚本将首先部署 API 连接,授权它,然后部署逻辑应用程序。
您也可以将它们放在同一个模板中,并通过在每个资源上使用 condition
来控制部署哪个资源。
您可以将事件网格主题订阅和到它的逻辑应用程序连接创建为单独的资源。示例模板对象如下。请记住,连接正在使用 oauth。
事件网格主题订阅
{
"type": "Microsoft.EventGrid/topics/providers/eventSubscriptions",
"name": "[concat(parameters('TopicName'), '/Microsoft.EventGrid/', variables('name'))]",
"location": "[parameters('Location')]",
"apiVersion": "2018-01-01",
"properties": {
"destination": {
"endpointType": "WebHook",
"properties": {
"endpointUrl": "[parameters('Endpoint')]"
}
},
"filter": {
"includedEventTypes": [
"[parameters('EventType')]"
]
}
},
"dependsOn": [
]
}
网络连接
{
"type": "Microsoft.Web/connections",
"name": "[variables('connectionName')]",
"apiVersion": "2016-06-01",
"location": "[parameters('ConnectionLocation')]",
"properties": {
"displayName": "[variables('connectionName')]",
"api": {
"id": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Web/locations/northcentralus/managedApis/azureeventgrid/')]"
},
"parameterValues": {
"token:clientId": "[parameters('ConnectionClientId')]",
"token:clientSecret": "[parameters('ConnectionClientSecret')]",
"token:TenantId": "[parameters('ConnectionTenantId')]",
"token:resourceUri": "https://management.core.windows.net/",
"token:grantType": "client_credentials"
}
},
"dependsOn": []
}
我制作了一个逻辑应用程序来侦听事件网格主题并且它工作正常,但是如果我删除它并尝试从模板创建它不起作用。它永远不会 运行s.
问题在于,虽然它确实创建了与事件网格的 API 连接,但它未授权并且它也没有创建对事件网格主题的任何订阅。在任何时候都不会显示任何错误。一切都成功了,但它并没有创造出它应该创造的一切。
为了解决这个问题,我向 Powershell 脚本添加了命令以对其进行身份验证。这工作正常,但这当然不会创建订阅。
如果我再次 运行 ARM 模板,我希望它现在创建它,因为连接无效,但不,它不是。我想 Azure 意识到模板中没有任何更改并且什么也不做?如果我编辑 ARM 模板并更改订阅名称,然后再次部署它,那么订阅就会创建并开始工作。
我当然可以使用 2 个不同的订阅名称作为参数调用模板两次,但这听起来很愚蠢。必须有一些更好的方法。
那么从模板和脚本创建这种逻辑应用程序的最佳方式是什么?
我认为没有办法解决首次部署后所需的授权。因此,最简单的解决方案是拥有 2 个单独的模板 - 一个用于 API 连接,另一个用于逻辑应用程序。
您的 PowerShell 脚本将首先部署 API 连接,授权它,然后部署逻辑应用程序。
您也可以将它们放在同一个模板中,并通过在每个资源上使用 condition
来控制部署哪个资源。
您可以将事件网格主题订阅和到它的逻辑应用程序连接创建为单独的资源。示例模板对象如下。请记住,连接正在使用 oauth。
事件网格主题订阅
{
"type": "Microsoft.EventGrid/topics/providers/eventSubscriptions",
"name": "[concat(parameters('TopicName'), '/Microsoft.EventGrid/', variables('name'))]",
"location": "[parameters('Location')]",
"apiVersion": "2018-01-01",
"properties": {
"destination": {
"endpointType": "WebHook",
"properties": {
"endpointUrl": "[parameters('Endpoint')]"
}
},
"filter": {
"includedEventTypes": [
"[parameters('EventType')]"
]
}
},
"dependsOn": [
]
}
网络连接
{
"type": "Microsoft.Web/connections",
"name": "[variables('connectionName')]",
"apiVersion": "2016-06-01",
"location": "[parameters('ConnectionLocation')]",
"properties": {
"displayName": "[variables('connectionName')]",
"api": {
"id": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Web/locations/northcentralus/managedApis/azureeventgrid/')]"
},
"parameterValues": {
"token:clientId": "[parameters('ConnectionClientId')]",
"token:clientSecret": "[parameters('ConnectionClientSecret')]",
"token:TenantId": "[parameters('ConnectionTenantId')]",
"token:resourceUri": "https://management.core.windows.net/",
"token:grantType": "client_credentials"
}
},
"dependsOn": []
}