我有一堆嵌套的ARM模板,意味着要使用Azure PS进行部署。
唯一的方法是在Azure blob container
中托管这些模板,然后生成SAS token
并在main ARM template
中发送这两个参数(指向嵌套的参数)。
这是我的PS生成SAS令牌:
$SasToken = ConvertTo-SecureString -AsPlainText -Force (New-AzureStorageContainerSASToken -Container $StorageContainerName -Context $StorageAccount.Context -Permission r -ExpiryTime (Get-Date).AddHours(4))
以下是我的部署脚本的两部分,它将令牌传递给主ARM模板:
$Parameters['_artifactsLocationSasToken'] = $SasToken
和
New-AzureRmResourceGroupDeployment -Name ((Get-ChildItem $TemplateFile).BaseName + '-' + ((Get-Date).ToUniversalTime()).ToString('MMdd-HHmm')) `
-ResourceGroupName $ResourceGroupName `
-TemplateFile $TemplateFile `
-TemplateParameterObject $Parameters `
-Force -Verbose `
-ErrorVariable ErrorMessages
以下是主ARM模板的接收参数声明:
"_artifactsLocationSasToken": {
"type": "securestring"
}
以下是同一主ARM模板中的嵌套资源模板(恰好是cosmos db):
{
"apiVersion": "2017-05-10",
"dependsOn": [
"[concat('Microsoft.Resources/deployments/', variables('vnetConfig').Name)]"
],
"name": "[variables('cosmosDbConfig').Name]",
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[concat(parameters('_artifactsLocation'), '/', variables('nestedTemplatesFolder'), '/cosmosdb.json', parameters('_artifactsLocationSasToken'))]"
},
"parameters": {
"cosmosDbConfig": {
"value": "[variables('cosmosDbConfig')]"
}
}
},
"type": "Microsoft.Resources/deployments"
}
当我运行这些时,我收到此错误:
错误:Code = InvalidTemplate; Message =部署模板验证失败:'第16行和第39列'的模板参数'_artifactsLocationSasToken'提供的值无效。
如果我在嵌套模板资源(在主模板中)硬编码SAS token
并将类型从securestring
更改为string
,它就可以了!我错过了什么?
似乎你错过了templateLink中的uri()
,尝试下面的那个,看看这个sample也使用securestring
。
"templateLink": {
"uri": "[uri(concat(parameters('_artifactsLocation'), '/', variables('nestedTemplatesFolder'), '/cosmosdb.json', parameters('_artifactsLocationSasToken')))]"
}
我发现在将SAS令牌作为参数传递给ARM模板时,您可以重现此问题,即“模板验证失败”。
在我的例子中,SAS令牌被用于Azure功能应用程序的“WEBSITE_RUN_FROM_PACKAGE”应用程序设置。
我解决这个问题的方法是将SAS令牌(我从PowerShell传递给ARM模板)的值加上前缀 - 这样它就不再是有效的URL了。例如,如果您使用下划线为SAS令牌添加前缀并将其传递给ARM模板,则不再出现此问题。然后,您可以从ARM模板中删除下划线前缀。