ARM模板错误在请求中发现错误的JSON内容

时间:2019-10-21 11:13:55

标签: azure azure-devops azure-keyvault arm-template

我正在尝试使用Azure DevOps发布管道部署ARM模板。 Azure KeyVault是模板中的资源之一。当我使用Powershell脚本时,部署成功。但是,当使用Azure DevOps Release管道时,部署失败,并显示错误“在请求中找到错误的JSON内容”

https://i.stack.imgur.com/o9sbD.png

密钥库资源定义如下。

{
  "type": "Microsoft.KeyVault/vaults",
  "apiVersion": "2018-02-14",
  "name": "[parameters('keyVaultName')]",
  "location": "[parameters('location')]",
  "tags": {
    "displayName": "KeyVault"
  },
  "properties": {
    "enabledForDeployment": "[parameters('enabledForDeployment')]",
    "enabledForTemplateDeployment": "[parameters('enabledForTemplateDeployment')]",
    "enabledForDiskEncryption": "[parameters('enabledForDiskEncryption')]",
    "tenantId": "[parameters('tenantId')]",
    "accessPolicies": [],
    "sku": {
      "name": "[parameters('skuName')]",
      "family": "A"
    }
  }
}

更新:我怀疑这可能是由于租户ID造成的,并对租户ID进行了硬编码以进行测试。但是仍然没有运气。

1 个答案:

答案 0 :(得分:0)

根据日志,您正在任务中指定替代参数。这就是为什么您使用我提供的ARM模板,但仍然遇到Bad Request错误的原因。因为在任务逻辑中,ARM文件中的脚本是API的请求正文。而且,我们使用此API创建您在Azure中指定的资源。有关所描述的详细任务逻辑,请参阅我的previous answer

ARM模板中的参数定义正确,但是现在,由指定的覆盖参数引起的错误:

enter image description here

更具体地说,该错误是由于参数覆盖定义中的subscription().tenantId引起的。

您可以尝试使用Write-Host subscription().tenantId来获取其值,并使用 Azure powershell任务打印出来。您将看到它什么也没得到。一个字,只能在Json文件中使用,而不能在任务中使用。

现在,由于此表达式中没有值,因此您还覆盖了JSON文件中定义的先前值。当任务将要使用API​​创建天蓝色资源时,它将缺少请求主体中的关键参数值(tenantId)。


有2种解决方案可以解决它。

1。请勿尝试覆盖其值使用表达式的参数。

这里我只是说与Azure订阅相关的参数。大多数表达式无法在Azure ARM部署任务中编译。

2。如果您仍要使用任务中的特殊表达式覆盖这些特殊参数。

如果是这样,您必须首先添加一个任务,以从中获得tenantId。然后将其传递给ARM部署任务。

您可以使用以下示例脚本添加Azure Powershell任务:

Write-Output "Getting tenantId using Get-AzureRmSubscription..."

$subscription = (Get-AzureRmSubscription -SubscriptionId $azureSubscriptionId)

Write-Output "Requested subscription: $azureSubscriptionId"

$subscriptionId = $subscription.Id
$subscriptionName = $subscription.Name
$tenantId = $subscription.tenantId

Write-Output "Subscription Id: $subscriptionId"
Write-Output "Subscription Name: $subscriptionName"
Write-Output "Tenant Id: $tenantId"
Write-Host  "##vso[task.setvariable variable=TenantID;]$$tenantId"

然后在下一个任务中,您可以使用$(TenantID)来获取其值。

在这里您可以参考这两个出色的博客:Blog1Blog2


我仍然建议您使用第一种解决方案,因为如果选择第二种解决方案,管道的体积会增加并且变得复杂。