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

时间:2021-04-29 18:01:30

标签: azure azure-resource-manager

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

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

例如我有以下资源:

{
    "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)使用不同类型的函数时,这不起作用。

2 个答案:

答案 0 :(得分:0)

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

  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

答案 1 :(得分:0)

在使用“复制”方法添加密钥保管库策略以及添加静态密钥保管库策略时,我遇到了同样的问题。

我通过添加您在 ARM 中描述的静态策略解决了这个问题。接下来我定义了另一个/子资源,称为: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 流程。