Обработка зависимостей в связанных шаблонах Azure Resource Manager

В шаблонах Azure Resource Manager (ARM) есть возможность использовать Связанные шаблоны. Эти связанные шаблоны могут определять дополнительные ресурсы для создания во время развертывания шаблона ARM.

Шаблоны ARM поддерживают зависимости, которые обеспечивают использование некоторых ресурсов создаются раньше других.

Я хотел бы указать зависимость в связанном шаблоне для ресурса, созданного в главном шаблоне. Если я включу зависимость в связанный шаблон, это будет выглядеть так:

"resources": [
    {
        "apiVersion": "2015-08-01",
        "type": "Microsoft.Web/sites/hostNameBindings",
        "name": "[concat(parameters('siteName'),'/', parameters('fqdn'))]",
        "dependsOn": [
            "[concat('Microsoft.Web/sites/', parameters('siteName'))]"
        ],
        "properties": {
            "siteName": "[parameters('siteName')]"
        }
    }
]

Хотя dependsOn выглядит правильным, ресурс создается в Microsoft.Web/sites/{siteNameParameter}, при развертывании шаблона ARM выводится следующее сообщение об ошибке:

InvalidTemplate: Ошибка проверки шаблона развертывания: «Ресурс« Microsoft.Web / sites / blahblahblahblah »не определен в шаблоне. Подробную информацию об использовании см. На странице https://aka.ms/arm-template. '.

В настоящее время я определяю эту зависимость в шаблоне master, когда определяю вызов связанного шаблона. Он кажется хрупким и легко ломается. Есть ли лучший способ, чем определение зависимостей в главном шаблоне ARM?

{
    "apiVersion": "2015-01-01",
    "name": "SomeName",
    "type": "Microsoft.Resources/deployments",
    "dependsOn": [
        "[concat('Microsoft.Web/sites/', parameters('siteName'))]"
    ],
    "properties": {
        "mode": "Incremental",
        "templateLink": {
            "uri": "https://tempuri.org/supersecrettemplatepath/azuredeploy.json",
            "contentVersion": "1.0.0.0"
        },
        "parameters":
        {
            "fqdn": {
                "value": "www.tempuri.org"
            },
            "siteName": {
                "value": "[parameters('siteName')]"
            }
        }
    }
}

person Dustin Venegas    schedule 01.09.2016    source источник


Ответы (3)


Вы можете определить зависимость любым способом - оба действительны. Включение зависимости от ресурса развертывания (ваш второй подход) будет означать, что все вложенное развертывание не будет запущено до тех пор, пока веб-сайт не будет подготовлен. Если вы хотите запускать некоторые вещи параллельно, вы должны поместить зависимость во вложенный шаблон (ваш первый подход). Это может иметь значение, а может и не иметь значения для вашего сценария, но это ключевое отличие.

dependsOn требует resourceId - и, поскольку ошибка пытается сказать, если ресурс не определен в шаблоне, вам нужны более подробные сведения в resourceId, в этом случае вам понадобится resourceGroup (возможно, подписка, но я сомневаюсь в этом). Так, например, вы можете использовать:

"dependsOn": [
    "[resourceId(resourceGroup().name, 'Microsoft.Web/sites', parameters('siteName'))]"
],
person bmoore-msft    schedule 02.09.2016
comment
Интересно! Мне придется дать этому рулон. Насколько я понимаю, @ bmore-msft, однако, имя resourceGroup (). Должно автоматически подставляться во все вызовы dependsOn по умолчанию. Разве это не относится к вложенным шаблонам? - person Dustin Venegas; 07.09.2016
comment
В некотором роде - если он не предоставлен, предполагается, что он находится в том же шаблоне - вложенные шаблоны на самом деле являются отдельными / независимыми развертываниями в AzureRM. - person bmoore-msft; 09.09.2016
comment
К сожалению, это выводит то же сообщение об ошибке, что и раньше. "Deployment template validation failed: 'The resource 'Microsoft.Web/sites/somesite' is not defined in the template. - person Dustin Venegas; 20.09.2016
comment
Вероятно, вам нужно увидеть все шаблоны - если вы можете опубликовать их где-нибудь, я могу взглянуть ... - person bmoore-msft; 23.09.2016
comment
без подписки я все еще получал ошибку. даже с подпиской его не ждали. Я пытался дождаться завершения хранилища, а затем получить ключ доступа, но он продолжал говорить ResourceNotFound. Как сильно раздражает :) - person MPavlak; 26.06.2017
comment
@MPavlak - использование listKeys в storageAccount - довольно распространенный шаблон - если он не работает для вас, начните обсуждение с помощью вашего шаблона ... gist.github.com/bmoore-msft/73246e41659206be031e8b2fe78eef1c - person bmoore-msft; 27.06.2017
comment
Я думаю, проблема в том, что я использую ресурсы развертывания, а один вспомогательный ресурс зависит от ресурса в другом развертывании. Я не могу заставить его ждать, что бы я ни делал. Я перенесу его туда, когда у меня будет секунда, чтобы снова заняться этой работой. Я прервался и просто создал один гигантский шаблон без ресурсов для развертывания, чтобы решить эту проблему. - person MPavlak; 27.06.2017
comment
Вы действительно обнаружили проблему ... зависит только от ресурсов в одном развертывании. Ресурс в дочернем развертывании находится в другом развертывании, чем его родительский. В этом случае вы должны использовать сам ресурс развертывания в качестве зависимости. - person bmoore-msft; 28.06.2017
comment
Он не работает с ресурсом, определенным в родительском шаблоне и зависимостью от вложенного шаблона. - person user2323308; 08.08.2020

Зависимому объекту требуется имя связанного развертывания, а не один из ресурсов в нем.

e.g.:

зависит от: "Microsoft.Resources / deployments / myExternalTemplate"

person Thomas Josefczak    schedule 07.12.2018

person    schedule
comment
Это помогло мне пропустить сообщение об ошибке, но не дождалось зависимости :( - person MPavlak; 26.06.2017