如何在 ARM 模板中组合复制和奇异属性

How to combine copy and singular properties in ARM template

如何在我的 Azure ARM 模板中创建一个数组,其中包含单个对象和使用复制机制动态创建的对象。

在我的 ARM 模板中,我想创建一个由 'static' 元素和基于数组中的值动态创建的元素组合而成的列表。

例如我有以下资源:

{
    "type": "Microsoft.KeyVault/vaults",
    "apiVersion": "2019-09-01",
    "name": "[parameters('keyVaultName')]",
     ...
    "properties": {
         ...
         // Option 1: I can do a singular accessPolicty
         "accessPolicies": [
                {
                    //  here I reference a static object
                      "objectId": "[parameters('configuredResourceId')]",
                    ...
                }
         ],
         // Option 2: Or iterate a list
         "copy": [
           {  
            // List of all properties per project. This will dynamically set the event processor (including secrets) and event hub.
            "name": "accessPolicies",
            "count": "[length(parameters('serviceNames'))]",
            "input": {
                "objectId": "[reference(resourceId('Microsoft.Web/sites', parameters('serviceNames')[copyIndex('accessPolicies')]), '2019-08-01', 'Full').identity.principalId]",
                "tenantId": "[subscription().tenantId]",
                "permissions": {
                    "keys": "[parameters('keysAppPermissions')]",
                    "secrets": "[parameters('secretsAppPermissions')]"
                }
            }
        ]
     }
 } 

当我只包含选项 1 或选项 2 时它起作用了。然而,包括两者(并非完全出乎意料)这给出了我无法定义相同的 属性 两次的错误:

 'Can not add property accessPolicies to Newtonsoft.Json.Linq.JObject. Property with the same name already exists on object.'.
 
 

在某些情况下,我可能可以解决这个问题,方法是在变量中使用副本,然后将元素添加到数组中。但是当我想根据资源状态使用不同类型的功能时(例如 fethcing IDs),这不起作用。

有几种方法,我认为最简单的是:

  1. 使用静态访问策略创建保管库
  2. 对于动态列表,使用子资源循环

几个链接:

https://github.com/Azure/azure-quickstart-templates/tree/master/quickstarts/microsoft.keyvault/keyvault-add-access-policy

https://docs.microsoft.com/en-us/azure/templates/microsoft.keyvault/vaults/accesspolicies?tabs=json

我在使用 'copy' 方法添加 Key-Vault 策略以及添加静态 Key-Vault 策略时遇到了同样的问题。

我按照您在 ARM 中描述的那样通过添加静态策略解决了这个问题。接下来我定义了 another/child 资源,它被称为:Microsoft.KeyVault/vaults/accessPolicies

我必须做的最后一步是添加 dependsOn 属性 并引用所属的 Key-Vault。

显示您在 JSON 接近您的代码:

{
    "type": "Microsoft.KeyVault/vaults",
    "apiVersion": "2019-09-01",
    "name": "[parameters('keyVaultName')]",
     ...
    "properties": {
         ...
         // Step 1: add static policies:
        "accessPolicies": [
            {
                //  here I reference a static object
                "objectId": "[parameters('configuredResourceId')]",
                ...
            }
        ],

    }
},
...
{
    "type": "Microsoft.KeyVault/vaults/accessPolicies",
    "name": "[concat(parameters('keyVaultName'), '/add')]",
    "apiVersion": "2019-09-01",
    // Step 2: add depending key-vault (parent resource)
    "dependsOn": [ 
        "[resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName'))]"
    ],
    "properties": {
        // Step 3: add the copy method to iterate policies
        "copy": [
            {
                // List of all properties per project. This will dynamically set the event processor (including secrets) and event hub.
                "name": "accessPolicies",
                "count": "[length(parameters('serviceNames'))]",
                "input": {
                    "objectId": "[reference(resourceId('Microsoft.Web/sites', parameters('serviceNames')[copyIndex('accessPolicies')]), '2019-08-01', 'Full').identity.principalId]",
                    "tenantId": "[subscription().tenantId]",
                    "permissions": {
                        "keys": "[parameters('keysAppPermissions')]",
                        "secrets": "[parameters('secretsAppPermissions')]"
                    }
                }
            }
        ]
    }  
},
...

请尝试上面的ARM流程

对于一般情况,将对象添加到多个变量中(使用资源 属性 上的 copy function as necessary) and use the union 数组函数。