Azure RM 链接模板之间的依赖关系

Dependencies between Azure RM linked templates

我计划在我的资源组中创建两个资源:一个 Web 应用程序和一个服务总线。 Web 应用程序将有一个连接字符串指向服务总线。因此,我需要先创建服务总线,然后添加带有连接字符串的 Web 应用程序。对于 Web 应用程序和服务总线,我都使用链接模板。我的简化 azuredeploy.json 看起来像这样:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "name": "myWebAppDeploy",
      "apiVersion": "2017-05-10",
      "type": "Microsoft.Resources/deployments",
      "dependsOn": [
        "UNKNOWN-DEPENDENCY"
      ],
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "link/to/webapp.azuredeploy.json",
          "contentVersion": "1.0.0.0"
        },
        "parameters": {
          "name": {
            "value": "myWebApp"
          },
          "connectionStrings": {
            "value": {
              "serviceBusConnectionString": "[listKeys(resourceId('Microsoft.ServiceBus/namespaces/authorizationRules', 'myServiceBus', 'RootManageSharedAccessKey'), '2017-04-01').primaryConnectionString]"
            }
          }
        }
      }
    },
    {
      "name": "myServiceBusDeploy",
      "apiVersion": "2017-05-10",
      "type": "Microsoft.Resources/deployments",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "link/to/servicebus.azuredeploy.json",
          "contentVersion": "1.0.0.0"
        },
        "parameters": {
          "name": {
            "value": "myServiceBus"
          }
        }
      }
    }
  ]
}

无论我在 UNKNOWN-DEPENDENCY 部分输入什么,我都会收到以下错误:

Template deployment returned the following errors:10:02:23 AM - Resource Microsoft.ServiceBus/namespaces/authorizationRules 'myServiceBus/RootManageSharedAccessKey' failed with message '{
  "error": {
    "code": "ParentResourceNotFound",
    "message": "Can not perform requested operation on nested resource. Parent resource 'myServiceBus' not found."
  }
}'

看起来它正在尝试在服务总线之前部署 Web 应用程序。我尝试了以下方法,但没有成功:

"myServiceBus"
"myServiceBusDeploy",
"[concat('Microsoft.Resources/deployments/', 'myServiceBusDeploy')]",
"[concat('Microsoft.ServiceBus/namespaces', 'myServiceBus')]"
"[resourceId('Microsoft.Resources/deployments', 'myServiceBusDeploy')]"
"[resourceId('Microsoft.ServiceBus/namespaces', 'myServiceBus')]"

我没有想法,不知道如何设置这两个链接模板之间的依赖关系。

更新: 如果我在收到错误后再次部署我的模板,它将工作,因为服务总线已经在第一次部署中部署。所以,我很确定 nested/linked 模板没问题。

您可以使用您想要依赖的资源的名称 ONLY 如果它 UNIQUE,看简化版本, 这是。但是如果你真的想确定你需要使用 resourceId() 函数:

"[resourceId('Microsoft.Resources/deployments', 'myServiceBusDeploy')]"

你也可以使用concat()函数,但是你需要assemble resourceId string exactly:

/subscriptions/guid/resourceGroups/rg_name/providers/Microsoft.Network/networkInterfaces/resource_name

话虽如此,我不明白为什么这不适用于您的简化版模板。可能是非简化版本有一些可能会干扰 dependsOn\resourceId.

如果您使用的是订阅级部署,您可能需要构建如下内容:

/subscriptions/guid/resourceGroups/rg_name/providers/Microsoft.Resources/deployments/myServiceBusDeploy

是的,就像我经常告诉这里的人:"nested inline templates are crap, never use them unless you know what you are doing"。错误不是来自 dependsOn 属性,而是来自 listKeys() 函数。因为您使用的是嵌套内联部署,部署开始时正在评估 listkeys(),它不是资源,所以它不支持 dependsOn 属性。您需要将其移动到嵌套模板(从 url 部署)或将 listkeys()reference() 函数一起使用(这意味着依赖并等待创建资源)。

正如 Gleb 指出的那样,这里的问题是正在立即评估 listKeys(我们正在尝试修复 ARM 中的设计限制)。

要解决此问题,您可以执行以下两项操作之一:

1) 不将connstr传递给模板,只需传入resourceId并在web应用程序部署中执行listKeys()。

2) 在服务总线部署中使用(connstr 的)部署输出,并使用该部署输出的 reference()。这会起作用,但它也会使嵌套部署的 /validation 短路,因此 #1 是更好的整体方法。

HTH