如何在 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),这不起作用。
有几种方法,我认为最简单的是:
- 使用静态访问策略创建保管库
- 对于动态列表,使用子资源循环
几个链接:
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 数组函数。
如何在我的 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),这不起作用。
有几种方法,我认为最简单的是:
- 使用静态访问策略创建保管库
- 对于动态列表,使用子资源循环
几个链接:
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 数组函数。