Устранение ошибок, связанных с недопустимым шаблоном

В этой статье объясняется, как устранять ошибки, связанные с недопустимым шаблоном для файлов Bicep и шаблонов Azure Resource Manager (шаблоны ARM). Ошибка происходит по нескольким причинам, например из-за ошибки в синтаксисе, недопустимого значения параметра или циклической зависимости.

Симптом

При развертывании шаблона появляется ошибка с таким текстом:

Code=InvalidTemplate
Message=<varies>

Сообщение об ошибке зависит от типа ошибки.

Причина

Эта ошибка может появиться в результате ошибок нескольких различных типов. Как правило, это синтаксические или структурные ошибки в шаблоне.

Решение 1. Синтаксическая ошибка

Если появляется сообщение об ошибке, указывающее, что шаблону не удалось пройти аутентификацию, возможно, в нем есть синтаксическая ошибка.

Code=InvalidTemplate
Message=Deployment template validation failed

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

name: 'storage${uniqueString(resourceGroup().id)}'

При получении сообщения об ошибке такого типа проверьте синтаксис выражения. Для выявления ошибок в шаблоне можно использовать Visual Studio Code с последним расширением Bicep или расширением инструментов Azure Resource Manager.

Решение 2. Неправильная длина сегментов

Шаблон также считается недопустимым, если имя ресурса указано в неправильном формате. Сведения об устранении ошибки см. в статье Устранение ошибок несоответствия имен и типов ресурсов.

Решение 3. Недопустимый параметр

Вы можете задать допустимые значения параметров в шаблоне. Если при развертывании указать недопустимое значение, то появится сообщение об ошибке, аналогичное приведенному ниже.

Code=InvalidTemplate;
Message=Deployment template validation failed: 'The provided value {parameter value}
for the template parameter {parameter name} is not valid. The parameter value is not
part of the allowed values

Проверьте допустимые значения параметра в шаблоне и используйте допустимое значение при развертывании. Дополнительные сведения см. в разделах с описанием допустимых значений для Bicep или шаблонов ARM.

Решение 4. Слишком много целевых групп ресурсов

Эта ошибка могла возникать у вас в предыдущих развертываниях, так как для одного развертывания существовало ограничение в пять целевых групп ресурсов. В мае 2020 г. это ограничение было увеличено до 800 групп ресурсов. Дополнительные сведения см. в разделах о развертывании в нескольких группах ресурсов для Bicep или шаблонов ARM.

Решение 5. Обнаружена циклическая зависимость

Эта ошибка возникает, когда ресурсы зависят друг от друга таким образом, что это не позволяет начать развертывание. Сочетание взаимозависимостей заставляет два или более ресурсов ждать других ресурсов, которые также ожидают. Например, resource1 зависит от resource3, resource2 зависит от resource1, а resource3 зависит от resource2. Как правило, эту проблему можно устранить, удалив ненужные зависимости.

Bicep создает неявную зависимость, когда один ресурс использует символическое имя другого ресурса. Использование явных зависимостей с помощью dependsOn обычно не требуется. Дополнительные сведения см. в разделе Зависимости для Bicep.

Устранить циклическую зависимость можно следующим образом.

  1. Найдите в шаблоне ресурс, указанный в циклической зависимости.
  2. Для этого ресурса изучите dependsOn свойство и все способы использования reference функций или resourceId , чтобы узнать, от каких ресурсов он зависит.
  3. Изучите эти ресурсы, чтобы узнать, от каких ресурсов зависят они. Отслеживайте зависимости, пока не найдете ресурс, который зависит от первоначального ресурса.
  4. Для ресурсов, участвующих в циклической зависимости, тщательно изучите все случаи использования свойства dependsOn, чтобы выявить все лишние зависимости. Чтобы устранить неполадки при развертывании, удалите циклические зависимости. Вместо удаления кода можно использовать комментарии, чтобы код не выполнялся во время следующего развертывания. Вы можете использовать однострочные комментарии (//) или многострочные комментарии (/* ... */) в шаблонах ARM или файлах Bicep .
  5. Повторно разверните шаблон.

Удаление значений из свойства dependsOn может привести к ошибкам при развертывании шаблона. Если возникла ошибка, верните удаленную зависимость в шаблон. Если вы использовали комментарии для обхода кода в шаблоне, вы можете удалить комментарии, чтобы восстановить код.

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

  1. vm1.
  2. vm2.
  3. Расширение на vm1 зависит от vm1 и vm2. Расширение задает на vm1 значения, получаемые от vm2.
  4. Расширение на vm2 зависит от vm1 и vm2. Расширение задает на vm2 значения, получаемые от vm1.

Этот подход пригоден и для приложений службы приложений. Рекомендуется переместить значения конфигурации в дочерний ресурс ресурса приложения. Два веб-приложения можно развернуть в следующем порядке.

  1. webapp1.
  2. webapp2.
  3. Конфигурация webapp1 зависит от webapp1 и webapp2. Она содержит параметры приложения со значениями из webapp2.
  4. Конфигурация webapp2 зависит от webapp1 и webapp2. Она содержит параметры приложения со значениями из webapp1.

Решение 6. Проверка синтаксиса для экспортированных шаблонов

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

Вы можете экспортировать шаблон из портала, Azure CLI или Azure PowerShell. Существуют рекомендации по экспорту шаблона из ресурса или группы ресурсов или из журнала развертывания.

После экспорта шаблона ARM можно декомпилировать шаблон JSON в Bicep. Затем используйте рекомендации и анализатор кода для проверки кода.

Дополнительные сведения см. в следующих статьях: