Развертывание ARM завершается неудачно, когда свойства передаются объекту - PullRequest
0 голосов
/ 11 декабря 2018

При развертывании шаблона 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
                }
        }
}

1 Ответ

0 голосов
/ 11 декабря 2018

Проблема заключалась в том, что я передавал параметр name вместе с другими параметрами при настройке свойств ресурса.Это, очевидно, неправильно, но было бы полезно, если бы MS обработала ошибку более понятным для человека способом (думаю, они не могут думать обо всем).

Я обновил свой входящий параметр productsJson-

[{\"name\":\"cs-automation\",\"properties\":{\"displayName\":\"CS Automation Subscription\",\"state\":\"published\",\"description\":\"Allows access to the ConveyorBot v1 API.\",\"subscriptionRequired\":true,\"approvalRequired\":false}}]

И сейчас я передаю только необходимые «свойства» -

"resources": [
    {
        "type": "Microsoft.ApiManagement/service/products",
        "name": "[concat(parameters('apiManagementServiceName'), '/', variables('productsJArray')[copyIndex()].name)]",
        "apiVersion": "2018-06-01-preview",
        "properties": "[variables('productsJArray')[copyIndex()].properties]"
    }
]
...