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

В этой статье описывается, как устранить ошибки, связанные с недопустимым шаблоном.This article describes how to resolve invalid template errors.

СимптомSymptom

При развертывании шаблона появляется следующее сообщение об ошибке:When deploying a template, you receive an error indicating:

Code=InvalidTemplate
Message=<varies>

Сообщение об ошибке зависит от типа ошибки.The error message depends on the type of error.

Причина:Cause

Эта ошибка может появиться в результате ошибок нескольких различных типов.This error can result from several different types of errors. Как правило, это синтаксические или структурные ошибки в шаблоне.They usually involve a syntax or structural error in the template.

Решение 1 — синтаксическая ошибкаSolution 1 - syntax error

Если появляется сообщение об ошибке, указывающее, что шаблону не удалось пройти аутентификацию, возможно, в нем есть синтаксическая ошибка.If you receive an error message that indicates the template failed validation, you may have a syntax problem in your template.

Code=InvalidTemplate
Message=Deployment template validation failed

Такую ошибку легко допустить, так как выражения шаблонов могут быть сложными.This error is easy to make because template expressions can be intricate. Например, представленное ниже назначение имени для учетной записи хранения содержит один набор квадратных скобок, три функции, три набора круглых скобок, один набор одинарных кавычек и одно свойство.For example, the following name assignment for a storage account has one set of brackets, three functions, three sets of parentheses, one set of single quotes, and one property:

"name": "[concat('storage', uniqueString(resourceGroup().id))]",

Если вы не укажете соответствующий синтаксис, шаблон создаст значение, которое не будет соответствовать ожидаемому.If you don't provide the matching syntax, the template produces a value that is different than your intention.

При получении сообщения об ошибке такого типа тщательно проверьте синтаксис выражения.When you receive this type of error, carefully review the expression syntax. Рекомендуется использовать редактор JSON, например Visual Studio или Visual Studio Code, в котором отображаются предупреждения о синтаксических ошибках.Consider using a JSON editor like Visual Studio or Visual Studio Code, which can warn you about syntax errors.

Решение 2 — неправильная длина сегментовSolution 2 - incorrect segment lengths

Шаблон также считается недопустимым, если имя ресурса указано в неправильном формате.Another invalid template error occurs when the resource name isn't in the correct format.

Code=InvalidTemplate
Message=Deployment template validation failed: 'The template resource {resource-name}'
for type {resource-type} has incorrect segment lengths.

Имя ресурса на корневом уровне должно содержать на один сегмент меньше, чем тип ресурса.A root level resource must have one less segment in the name than in the resource type. Каждый сегмент разделяется косой чертой.Each segment is differentiated by a slash. В следующем примере тип содержит два сегмента, а имя — один. Так что это допустимое имя.In the following example, the type has two segments and the name has one segment, so it's a valid name.

{
  "type": "Microsoft.Web/serverfarms",
  "name": "myHostingPlanName",
  ...
}

В приведенном ниже примере указано недопустимое имя , так как оно содержит такое же количество сегментов, что и тип.But the next example is not a valid name because it has the same number of segments as the type.

{
  "type": "Microsoft.Web/serverfarms",
  "name": "appPlan/myHostingPlanName",
  ...
}

В случае дочерних ресурсов тип и имя должны содержать одинаковое количество сегментов.For child resources, the type and name have the same number of segments. Это целесообразно, так как полное имя и тип дочернего элемента включает имя родительского элемента и его тип.This number of segments makes sense because the full name and type for the child includes the parent name and type. Таким образом в полном имени на один сегмент меньше, чем в полном типе.Therefore, the full name still has one less segment than the full type.

"resources": [
    {
        "type": "Microsoft.KeyVault/vaults",
        "name": "contosokeyvault",
        ...
        "resources": [
            {
                "type": "secrets",
                "name": "appPassword",
                ...
            }
        ]
    }
]

Разобраться с правильной длиной сегментов сложно при использовании типов Resource Manager, которые применяются для поставщиков ресурсов.Getting the segments right can be tricky with Resource Manager types that are applied across resource providers. Например, для применения блокировки ресурсов на веб-сайте требуется тип с четырьмя сегментами.For example, applying a resource lock to a web site requires a type with four segments. Поэтому имя содержит три сегмента:Therefore, the name is three segments:

{
    "type": "Microsoft.Web/sites/providers/locks",
    "name": "[concat(variables('siteName'),'/Microsoft.Authorization/MySiteLock')]",
    ...
}

Решение 3 — недопустимый параметрSolution 3 - parameter is not valid

Если указать недопустимое значение, то появится сообщение об ошибке, аналогичное приведенному ниже.If you provide a parameter value that is not one of the allowed values, you receive a message similar to the following error:

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

Внимательно проверьте допустимые значения в шаблоне и укажите одно из них во время развертывания.Double check the allowed values in the template, and provide one during deployment. Дополнительные сведения о допустимых значениях параметров см. в статье Раздел параметров в шаблонах Azure Resource Manager.For more information about allowed parameter values, see Parameters section of Azure Resource Manager templates.

Решение 4 — слишком много целевых групп ресурсовSolution 4 - Too many target resource groups

Если вы указали более пяти целевых групп ресурсов в одном развертывании, поступает это сообщение об ошибке.If you specify more than five target resource groups in a single deployment, you receive this error. Рекомендуем консолидировать группы ресурсов в развертывании или развернуть некоторые шаблоны как отдельные развертывания.Consider either consolidating the number of resource groups in your deployment, or deploying some of the templates as separate deployments. Дополнительные сведения см. в разделе Развертывание ресурсов Azure в нескольких подписках или группах ресурсов.For more information, see Deploy Azure resources to more than one subscription or resource group.

Решение 5 — обнаружена циклическая зависимостьSolution 5 - circular dependency detected

Эта ошибка возникает, когда ресурсы зависят друг от друга таким образом, что это не позволяет начать развертывание.You receive this error when resources depend on each other in a way that prevents the deployment from starting. Сочетание взаимозависимостей вынуждает два или более ресурсов ожидать другие ресурсы, которые также находятся в ожидании.A combination of interdependencies makes two or more resource wait for other resources that are also waiting. Например, resource1 зависит от resource3, resource2 зависит от resource1, а resource3 зависит от resource2.For example, resource1 depends on resource3, resource2 depends on resource1, and resource3 depends on resource2. Как правило, эту проблему можно устранить, удалив ненужные зависимости.You can usually solve this problem by removing unnecessary dependencies.

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

  1. Найдите в шаблоне ресурс, указанный в циклической зависимости.In your template, find the resource identified in the circular dependency.
  2. Изучите свойство dependsOn и все случаи использования функции reference для этого ресурса, чтобы узнать, от каких ресурсов он зависит.For that resource, examine the dependsOn property and any uses of the reference function to see which resources it depends on.
  3. Изучите эти ресурсы, чтобы узнать, от каких ресурсов зависят они.Examine those resources to see which resources they depend on. Отслеживайте зависимости, пока не найдете ресурс, который зависит от первоначального ресурса.Follow the dependencies until you notice a resource that depends on the original resource.
  4. Для ресурсов, участвующих в циклической зависимости, тщательно изучите все случаи использования свойства dependsOn, чтобы выявить все лишние зависимости.For the resources involved in the circular dependency, carefully examine all uses of the dependsOn property to identify any dependencies that are not needed. Удалите эти зависимости.Remove those dependencies. Если вы не уверены, нужна ли зависимость, попробуйте удалить ее.If you are unsure that a dependency is needed, try removing it.
  5. Повторно разверните шаблон.Redeploy the template.

Удаление значений из свойства dependsOn может привести к ошибкам при развертывании шаблона.Removing values from the dependsOn property can cause errors when you deploy the template. Если возникла ошибка, верните удаленную зависимость в шаблон.If you get an error, add the dependency back into the template.

Если этот подход не помог устранить циклическую зависимость, рекомендуется переместить часть логики развертывания в дочерние ресурсы (например, расширения или параметры конфигурации).If that approach doesn't solve the circular dependency, consider moving part of your deployment logic into child resources (such as extensions or configuration settings). Настройте эти дочерние ресурсы для развертывания после ресурсов, участвующих в циклической зависимости.Configure those child resources to deploy after the resources involved in the circular dependency. Предположим, что вы развертываете две виртуальные машины, но на каждой из них необходимо задать свойства, которые ссылаются на другую виртуальную машину.For example, suppose you're deploying two virtual machines but you must set properties on each one that refer to the other. Их можно развернуть в следующем порядке.You can deploy them in the following order:

  1. vm1.vm1
  2. vm2.vm2
  3. Расширение на vm1 зависит от vm1 и vm2.Extension on vm1 depends on vm1 and vm2. Расширение задает на vm1 значения, получаемые от vm2.The extension sets values on vm1 that it gets from vm2.
  4. Расширение на vm2 зависит от vm1 и vm2.Extension on vm2 depends on vm1 and vm2. Расширение задает на vm2 значения, получаемые от vm1.The extension sets values on vm2 that it gets from vm1.

Этот подход пригоден и для приложений службы приложений.The same approach works for App Service apps. Рекомендуется переместить значения конфигурации в дочерний ресурс ресурса приложения.Consider moving configuration values into a child resource of the app resource. Два веб-приложения можно развернуть в следующем порядке.You can deploy two web apps in the following order:

  1. webapp1.webapp1
  2. webapp2.webapp2
  3. Конфигурация webapp1 зависит от webapp1 и webapp2.config for webapp1 depends on webapp1 and webapp2. Она содержит параметры приложения со значениями из webapp2.It contains app settings with values from webapp2.
  4. Конфигурация webapp2 зависит от webapp1 и webapp2.config for webapp2 depends on webapp1 and webapp2. Она содержит параметры приложения со значениями из webapp1.It contains app settings with values from webapp1.