本文介绍如何解决 Bicep 文件和 Azure 资源管理器模板(ARM 模板)的无效模板错误。 发生此错误的原因有多种,例如语法错误、参数值无效或循环依赖项。
症状
部署模板时,您会收到一个错误消息,提示:
Code=InvalidTemplate
Message=<varies>
错误消息取决于错误的类型。
原因
此错误可能是由多种不同类型的错误导致的。 它们通常涉及模板中的语法或结构错误。
解决方案 1:语法错误
如果收到指示模板验证失败的错误消息,则模板中可能存在语法问题。
Code=InvalidTemplate
Message=Deployment template validation failed
语法错误可能发生,因为模板表达式具有许多元素。 例如,存储帐户的名称分配包括单引号或双引号对、大括号、方括号和括号。 表达式还包含美元符号、逗号和点等函数和字符。
收到此类错误时,请查看表达式的语法。 若要识别模板错误,可以将 Visual Studio Code 与最新的 Bicep 扩展 或 Azure 资源管理器工具扩展配合使用。
解决方案 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 年 5 月,该限制增加到 800 个资源组。 有关详细信息,请参阅如何将其部署到 Bicep 或 ARM 模板中的多个资源组。
解决方案 5:检测到循环依赖项
当资源相互依赖时,你会收到此错误,从而阻止部署启动。 多个资源之间的相互依赖关系使得两个或更多的资源必须等待其他同样在等待的资源。 例如, resource1
取决于 resource3
、 resource2
resource1
依赖和 resource3
依赖 resource2
。 通常可以通过删除不必要的依赖项来解决此问题。
当一个资源使用另一个资源的符号名称时,Bicep 会创建隐式依赖项。 通常不需要使用显式依赖项 dependsOn
。 有关详细信息,请参阅 Bicep 依赖项。
若要解决循环依赖项,
- 在模板中,查找循环依赖项中标识的资源。
- 对于该资源,请检查
dependsOn
属性和任何使用reference
或resourceId
函数以查看它依赖的资源。 - 检查这些资源以查看它们依赖的资源。 追踪依赖关系,直到发现某个资源依赖于原始资源。
- 对于涉及循环依赖的资源,请仔细检查
dependsOn
属性的所有用法,以识别任何不必要的依赖项。 若要对部署进行故障排除,请删除循环依赖项。 可以使用注释,而不是删除代码,以便代码在下一次部署期间不会运行。 可以在 ARM 模板或 Bicep 文件中使用单行注释(//
)或多行注释(/* ... */
)。 - 重新部署模板。
从属性中删除值 dependsOn
可能会导致在部署模板时出错。 如果收到错误,请将依赖项添加回模板。 如果使用注释绕过模板中的代码,则可以删除注释以还原代码。
如果此方法无法解决循环依赖项,请考虑将部署逻辑的一部分移动到子资源(如扩展或配置设置)。 将这些子资源配置为在循环依赖项所牵涉的资源之后部署。 例如,假设要部署两个虚拟机,但必须在每个虚拟机上设置引用另一虚拟机的属性。 可以按下述顺序部署这两个虚拟机:
- VM1
- vm2
- vm1 上的扩展依赖于 vm1 和 vm2。 扩展在 vm1 上设置的值是从 vm2 获取的。
- vm2 上的扩展依赖于 vm1 和 vm2。 扩展在 vm2 上设置的值是从 vm1 获取的。
相同的方法适用于应用服务应用。 请考虑将配置值移到应用资源的子资源中。 可以按以下顺序部署两个 Web 应用:
- webapp1
- webapp2
- Webapp1 的配置取决于 webapp1 和 webapp2。 它包含应用程序设置,这些设置的值来自 webapp2。
- Webapp2 的配置取决于 webapp1 和 webapp2。 它包含应用设置,其值来自 webapp1。
解决方案 6:验证导出模板的语法
在 Azure 中部署资源后,可以导出 ARM 模板 JSON 并将其修改为其他部署。 在使用它部署资源 之前 ,应验证导出的模板是否具有正确的语法。
可以从 门户、 Azure CLI 或 Azure PowerShell 导出模板。 无论是从资源或资源组导出模板,还是从部署历史记录导出模板,皆有相关建议。
导出 ARM 模板后,可以将 JSON 模板反编译为 Bicep。 然后,使用最佳实践和 linter 来验证你的代码。
有关详细信息,请转到以下文章: