0

我有一堆嵌套的 ARM 模板,打算使用 Azure PS 进行部署。

做到这一点的唯一方法是将这些模板托管在 a 中Azure blob container,然后在中生成SAS token并发送这两个参数main ARM template(指向嵌套的参数)。

这是生成 SAS 令牌的 PS:

$SasToken = ConvertTo-SecureString -AsPlainText -Force (New-AzureStorageContainerSASToken -Container $StorageContainerName -Context $StorageAccount.Context -Permission r -ExpiryTime (Get-Date).AddHours(4))

这是我的部署脚本的 2 个部分,它们将令牌传递给主 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"
    }

当我运行这些时,我得到这个错误:

错误:代码=无效模板;消息=部署模板验证失败:“在第 16 行和第 39 列为模板参数“_artifactsLocationSasToken”提供的值无效。

SAS token如果我在嵌套模板资源(在主模板中)中硬编码并将类型从更改securestringstring,它就可以工作!我错过了什么?

4

2 回答 2

0

似乎你错过了uri()templateLink 中的,试试下面的那个,看看这个使用securestring.

"templateLink": {
          "uri": "[uri(concat(parameters('_artifactsLocation'), '/', variables('nestedTemplatesFolder'), '/cosmosdb.json', parameters('_artifactsLocationSasToken')))]"
        }
于 2019-02-14T06:13:01.540 回答
0

我发现您可以在将 SAS 令牌作为参数传递给 ARM 模板时重现此问题,即“模板验证失败”。

就我而言,SAS 令牌被用于 Azure Function App 的“WEBSITE_RUN_FROM_PACKAGE”应用设置。

我对这个问题的解决方案是在 SAS 令牌(我从 PowerShell 传递到 ARM 模板)的值前面加上一些东西——这样它就不再是一个有效的 URL。例如,如果您在 SAS 标记前加上下划线并将其传递给 ARM 模板,则不再出现此问题。然后,您可以从 ARM 模板中去除下划线前缀。

于 2019-03-27T22:58:57.257 回答