При развертывании шаблона ARM с использованием итерации ресурса я хотел бы передать свойства ресурса как объект.
Это позволило бы существовать различному набору параметров в каждом элементе массива копирования.Причина этого заключается в том, что некоторые свойства могут быть условно включены или исключены в зависимости от значений других.Например, в случае продукта управления API в документации говорится следующее относительно свойства subscriptionsLimit
-
Может присутствовать, только если свойство subscriptionRequired присутствует и имеет значение false.
Однако при развертывании примера шаблона ниже развертывание зависает в Azure.Просматривая связанные события, я вижу, что действие по развертыванию ресурса продолжает сбой с Внутренней ошибкой сервера (500), но никаких дополнительных подробностей нет.
Если я ссылаюсь на каждый параметр в properties
объект использует variables('productsJArray')[copyIndex()].whatever
, тогда развертывание завершается успешно.Однако это нежелательно, поскольку означает, что каждый объект properties
должен содержать идентичные параметры, что не всегда допустимо и может привести к сбою развертывания.
Пример шаблона
Обратите внимание, чтоЯ вывел variables('productsJArray')[copyIndex()]
, и это допустимый объект.Я даже скопировал вывод в шаблон и успешно развернул его.
{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"apiManagementServiceName": {
"type": "string",
"metadata": {
"description": "The name of the API Management instance."
}
},
"productsJson": {
"type": "string",
"metadata": {
"description": "A JSON representation of the Products to add."
}
}
},
"variables": {
"productsJArray": "[json(parameters('productsJson'))]"
},
"resources": [
{
"condition": "[greater(length(variables('productsJArray')), 0)]",
"type": "Microsoft.ApiManagement/service/products",
"name": "[concat(parameters('apiManagementServiceName'), '/', variables('productsJArray')[copyIndex()].name)]",
"apiVersion": "2018-06-01-preview",
"properties": "[variables('productsJArray')[copyIndex()]]",
"copy": {
"name": "productscopy",
"count": "[if(greater(length(variables('productsJArray')), 0), length(variables('productsJArray')), 1)]"
}
}
]
}
Пример параметров
{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"apiManagementServiceName": {
"value": "my-api-management"
},
"productsJson": {
"value": "[{\"name\":\"my-product\",\"displayName\":\"My Product\",\"description\":\"My product is awesome.\",\"state\":\"published\",\"subscriptionRequired\":true,\"approvalRequired\":false}]"
}
}
}
Вывод переменной 'productsJArray [0]'
"outputs": {
"properties": {
"type": "Object",
"value": {
"approvalRequired": false,
"description": "My product is awesome.",
"displayName": "My Product",
"name": "my-product",
"state": "published",
"subscriptionRequired": true
}
}
}