处理 Azure 资源管理器链接模板中的依赖项
Handling dependencies in Azure Resource Manager Linked Templates
Azure 资源管理器 (ARM) 模板可以使用 Linked Templates。这些链接模板可以定义要在 ARM 模板部署期间创建的其他资源。
ARM 模板支持 dependencies,可确保先创建一些资源,然后再创建其他资源。
我想在链接模板中为在主模板中创建的资源指定依赖项。如果我在链接模板中包含依赖项,它看起来像这样:
"resources": [
{
"apiVersion": "2015-08-01",
"type": "Microsoft.Web/sites/hostNameBindings",
"name": "[concat(parameters('siteName'),'/', parameters('fqdn'))]",
"dependsOn": [
"[concat('Microsoft.Web/sites/', parameters('siteName'))]"
],
"properties": {
"siteName": "[parameters('siteName')]"
}
}
]
虽然 dependsOn
看起来正确,但在 Microsoft.Web/sites/{siteNameParameter}
处创建了资源,部署 ARM 模板输出以下错误消息:
InvalidTemplate : Deployment template validation failed: 'The resource 'Microsoft.Web/sites/blahblahblahblah' is not defined in the template. Please see https://aka.ms/arm-template for usage details.'.
我目前在定义链接模板调用时在 master 模板中定义此依赖项。这看起来很脆,很容易折断。有没有比在主 ARM 模板中定义依赖关系更好的方法?
{
"apiVersion": "2015-01-01",
"name": "SomeName",
"type": "Microsoft.Resources/deployments",
"dependsOn": [
"[concat('Microsoft.Web/sites/', parameters('siteName'))]"
],
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "https://tempuri.org/supersecrettemplatepath/azuredeploy.json",
"contentVersion": "1.0.0.0"
},
"parameters":
{
"fqdn": {
"value": "www.tempuri.org"
},
"siteName": {
"value": "[parameters('siteName')]"
}
}
}
}
您可以通过任一方式定义依赖关系 - 两者均有效。依赖于部署资源(您的第二种方法)将意味着整个嵌套部署在配置网站之前不会启动。如果您想并行启动一些事情,那么您可以将依赖项放在嵌套模板中(您的第一种方法)。这对您的场景可能重要,也可能不重要,但这是一个关键区别。
dependsOn
需要 resourceId
- 正如错误试图说明的那样,如果资源未在模板中定义,您需要 resourceId
中的更多详细信息,在此在这种情况下,您需要 resourceGroup
(也许是订阅,但我对此表示怀疑)。例如,您可以使用:
"dependsOn": [
"[resourceId(resourceGroup().name, 'Microsoft.Web/sites', parameters('siteName'))]"
],
"dependsOn": [
"[resourceId(subscription().subscriptionId, resourceGroup().name, 'Microsoft.Web/sites', parameters('siteName'))]"
],
dependsOn 需要链接部署的名称,而不是其中的资源之一。
例如:
取决于:"Microsoft.Resources/deployments/myExternalTemplate"
Azure 资源管理器 (ARM) 模板可以使用 Linked Templates。这些链接模板可以定义要在 ARM 模板部署期间创建的其他资源。
ARM 模板支持 dependencies,可确保先创建一些资源,然后再创建其他资源。
我想在链接模板中为在主模板中创建的资源指定依赖项。如果我在链接模板中包含依赖项,它看起来像这样:
"resources": [
{
"apiVersion": "2015-08-01",
"type": "Microsoft.Web/sites/hostNameBindings",
"name": "[concat(parameters('siteName'),'/', parameters('fqdn'))]",
"dependsOn": [
"[concat('Microsoft.Web/sites/', parameters('siteName'))]"
],
"properties": {
"siteName": "[parameters('siteName')]"
}
}
]
虽然 dependsOn
看起来正确,但在 Microsoft.Web/sites/{siteNameParameter}
处创建了资源,部署 ARM 模板输出以下错误消息:
InvalidTemplate : Deployment template validation failed: 'The resource 'Microsoft.Web/sites/blahblahblahblah' is not defined in the template. Please see https://aka.ms/arm-template for usage details.'.
我目前在定义链接模板调用时在 master 模板中定义此依赖项。这看起来很脆,很容易折断。有没有比在主 ARM 模板中定义依赖关系更好的方法?
{
"apiVersion": "2015-01-01",
"name": "SomeName",
"type": "Microsoft.Resources/deployments",
"dependsOn": [
"[concat('Microsoft.Web/sites/', parameters('siteName'))]"
],
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "https://tempuri.org/supersecrettemplatepath/azuredeploy.json",
"contentVersion": "1.0.0.0"
},
"parameters":
{
"fqdn": {
"value": "www.tempuri.org"
},
"siteName": {
"value": "[parameters('siteName')]"
}
}
}
}
您可以通过任一方式定义依赖关系 - 两者均有效。依赖于部署资源(您的第二种方法)将意味着整个嵌套部署在配置网站之前不会启动。如果您想并行启动一些事情,那么您可以将依赖项放在嵌套模板中(您的第一种方法)。这对您的场景可能重要,也可能不重要,但这是一个关键区别。
dependsOn
需要 resourceId
- 正如错误试图说明的那样,如果资源未在模板中定义,您需要 resourceId
中的更多详细信息,在此在这种情况下,您需要 resourceGroup
(也许是订阅,但我对此表示怀疑)。例如,您可以使用:
"dependsOn": [
"[resourceId(resourceGroup().name, 'Microsoft.Web/sites', parameters('siteName'))]"
],
"dependsOn": [
"[resourceId(subscription().subscriptionId, resourceGroup().name, 'Microsoft.Web/sites', parameters('siteName'))]"
],
dependsOn 需要链接部署的名称,而不是其中的资源之一。
例如:
取决于:"Microsoft.Resources/deployments/myExternalTemplate"