Зависимости между связанными шаблонами Azure RM - PullRequest
0 голосов
/ 09 февраля 2019

Я планирую создать два ресурса в своих группах ресурсов: одно веб-приложение и одну служебную шину.У веб-приложения будет строка подключения, указывающая на служебную шину.Итак, мне нужно сначала создать служебную шину, а затем добавить веб-приложение со строкой подключения.И для веб-приложения, и для служебной шины я использую связанные шаблоны.Мой упрощенный azuredeploy.json выглядит следующим образом:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "name": "myWebAppDeploy",
      "apiVersion": "2017-05-10",
      "type": "Microsoft.Resources/deployments",
      "dependsOn": [
        "UNKNOWN-DEPENDENCY"
      ],
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "link/to/webapp.azuredeploy.json",
          "contentVersion": "1.0.0.0"
        },
        "parameters": {
          "name": {
            "value": "myWebApp"
          },
          "connectionStrings": {
            "value": {
              "serviceBusConnectionString": "[listKeys(resourceId('Microsoft.ServiceBus/namespaces/authorizationRules', 'myServiceBus', 'RootManageSharedAccessKey'), '2017-04-01').primaryConnectionString]"
            }
          }
        }
      }
    },
    {
      "name": "myServiceBusDeploy",
      "apiVersion": "2017-05-10",
      "type": "Microsoft.Resources/deployments",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "link/to/servicebus.azuredeploy.json",
          "contentVersion": "1.0.0.0"
        },
        "parameters": {
          "name": {
            "value": "myServiceBus"
          }
        }
      }
    }
  ]
}

Независимо от того, что я помещаю в раздел UNKNOWN-DEPENDENCY, я получаю следующую ошибку:

Template deployment returned the following errors:10:02:23 AM - Resource Microsoft.ServiceBus/namespaces/authorizationRules 'myServiceBus/RootManageSharedAccessKey' failed with message '{
  "error": {
    "code": "ParentResourceNotFound",
    "message": "Can not perform requested operation on nested resource. Parent resource 'myServiceBus' not found."
  }
}'

Похоже, что он пытается развернутьвеб-приложение перед служебной шиной.Я попробовал следующее, но не повезло:

"myServiceBus"
"myServiceBusDeploy",
"[concat('Microsoft.Resources/deployments/', 'myServiceBusDeploy')]",
"[concat('Microsoft.ServiceBus/namespaces', 'myServiceBus')]"
"[resourceId('Microsoft.Resources/deployments', 'myServiceBusDeploy')]"
"[resourceId('Microsoft.ServiceBus/namespaces', 'myServiceBus')]"

У меня нет идей, и я не знаю, как установить зависимости между этими двумя связанными шаблонами.

ОБНОВЛЕНИЕ: Если я снова разверну шаблон после получения ошибки, он будет работать, поскольку служебная шина уже развернута при первом развертывании.Итак, я уверен, что с вложенными / связанными шаблонами все в порядке.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Проблема, как отметил Глеб, заключается в том, что listKeys оценивается немедленно (ограничение дизайна в ARM, которое мы пытаемся исправить).

Чтобы обойти это, вы можете сделать одну из двух вещей:

1) вместо передачи connstr в шаблон, просто передайте resourceId и выполните listKeys () при развертывании веб-приложения.

2) используйте вывод развертывания (из connstr) вразвертывание служебной шины и reference (), которые выводят развертывание.Это будет работать, но это также приведет к коротким замыканиям / проверке во вложенном развертывании, так что # 1 - лучший общий подход.

HTH

0 голосов
/ 09 февраля 2019

Вы можете использовать имя ресурса, от которого хотите зависеть ТОЛЬКО , если его УНИКАЛЬНО , что, если посмотреть в упрощенной версии, так и есть.Но если вы хотите быть уверены, что вам нужно использовать функцию resourceId():

"[resourceId('Microsoft.Resources/deployments', 'myServiceBusDeploy')]"

, вы также можете использовать функцию concat(), но вам нужно точно собрать строку resourceId:

/subscriptions/guid/resourceGroups/rg_name/providers/Microsoft.Network/networkInterfaces/resource_name

Сказав это, я не понимаю, почему это не сработает с вашей упрощенной версией шаблона.Возможно, в неупрощенной версии есть что-то, что может помешать dependsOn\resourceId.

Если вы используете развертывание на уровне подписки, вам может потребоваться создать что-то вроде этого:

/subscriptions/guid/resourceGroups/rg_name/providers/Microsoft.Resources/deployments/myServiceBusDeploy

да, напримерЯ всегда говорю людям здесь: «вложенные встроенные шаблоны - дерьмо, никогда не используйте их, если вы не знаете, что делаете».ошибка не происходит из свойства dependsOn, ошибка происходит из функции listKeys().поскольку вы используете вложенное встроенное развертывание, listkeys() оценивается при запуске развертывания, оно не является ресурсом, поэтому оно не учитывает свойство dependsOn.вам нужно либо переместить это во вложенный шаблон (развернутый из URL), либо использовать listkeys() вместе с функцией reference() (это подразумевает зависимость и ожидает создания ресурса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...