SAS令牌作为SecureString,不使用Azure PowerShell进行ARM模板部署

问题描述 投票:0回答:2

我有一堆嵌套的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,它就可以了!我错过了什么?

azure-powershell arm-template securestring sas-token
2个回答
0
投票

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

"templateLink": {
          "uri": "[uri(concat(parameters('_artifactsLocation'), '/', variables('nestedTemplatesFolder'), '/cosmosdb.json', parameters('_artifactsLocationSasToken')))]"
        }

0
投票

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

在我的例子中,SAS令牌被用于Azure功能应用程序的“WEBSITE_RUN_FROM_PACKAGE”应用程序设置。

我解决这个问题的方法是将SAS令牌(我从PowerShell传递给ARM模板)的值加上前缀 - 这样它就不再是有效的URL了。例如,如果您使用下划线为SAS令牌添加前缀并将其传递给ARM模板,则不再出现此问题。然后,您可以从ARM模板中删除下划线前缀。

© www.soinside.com 2019 - 2024. All rights reserved.