Я использую функцию if () в операции копирования для Azure KeyVault:
"variables": {
"users": 3,
"user1": {
"tenantId": "[variables('tenantId')]",
"objectId": "abcd",
"permissions": {
"keys": [
"get"
],
"secrets": [
"get"
],
"certificates": [
"get"
]
}
},
"user2": {
"tenantId": "[variables('tenantId')]",
"objectId": "efgh",
"permissions": {
"keys": [
"get"
],
"secrets": [
"get"
],
"certificates": [
"get"
]
}
},
"user3": {
"tenantId": "[variables('tenantId')]",
"objectId": "ijkl",
"permissions": {
"secrets": [
"get"
]
}
},
"extraUsers": [
"[variables('user1')]",
"[variables('user2')]",
"[variables('user3')]"
]
"resources": [
{
"name": "myKeyVault",
"type": "Microsoft.KeyVault/vaults",
"apiVersion": "2018-02-14",
"location": "some_location",
"tags": {
"displayName": "KeyVault"
},
"properties": {
"copy": [
{
"name": "accessPolicies",
"count": "[add(variables('users'), length(variables('extraUsers')))]",
"input": {
"tenantId": "[variables('tenantId')]",
"objectId": "[if(less(copyIndex('myLoop'), variables('users')), reference(concat('Microsoft.Compute/virtualMachines/myVm', copyIndex('myLoop'), '/providers/Microsoft.ManagedIdentity/Identities/default'), '2015-08-31-PREVIEW').principalId, variables('extraUsers')[sub(copyIndex('myLoop'), variables('users'))].objectId)]",
"permissions": "[if(less(copyIndex('myLoop'), variables('users')), json($null), variables('extraUsers')[sub(copyIndex('myLoop'), variables('users'))].permissions)]"
}
}
],
Вышеприведенное сводится к:
if((index < A), <some object>.principalId, myArray[index - A].objectId)
Однако, когда я пытаюсьчтобы развернуть его, я получаю сообщение об ошибке, что индекс -1 не допускается.Кажется, что ARM оценивает как истинное, так и ложное выражения, поэтому, конечно, операция вычитания дает отрицательный результат в ложном выражении.
Однако, согласно ответу здесь, это должно быть исправлено во всех регионах:
Как функция if () выполняется в шаблонах диспетчера ресурсов Azure
Кто-нибудь знает, почему это происходит?
Я заметил, что последняя версия API для ресурса AKV в шаблонах ARM - 2018-02-14, что задолго до того, как bmoore-msft в приведенном выше вопросе упоминает, что ошибка была исправлена.Я не уверен, является ли версия API точным индикатором того, когда был выпущен код, или это просто метка.