在 Azure Resource Manager (ARM)中,服务器端验证由两个不同的部分组成:
- 静态验证,即开发人员与之交互的操作。
- 资源提供程序预检验证,即内部资源提供程序验证阶段。
静态验证检查 ARM 无需调用资源提供程序即可评估的模板的各个方面,例如:
- 模板结构和架构正确性
- 参数定义和基本值约束
- 表达式计算和模板一致性
在进行更深入的验证之前,这些检查可确保模板在语法上和结构上有效。
预检验证是在验证阶段执行的Azure Resource Manager(ARM)内部进程。 其用途是通过防止已知失败的部署来加速错误检测。 在此步骤中,ARM 调用相关资源提供程序来验证部署是否可行,而无需创建或修改任何资源。 此部分验证:
资源名称冲突:在预检期间,ARM 会评估最终的资源名称,并检查它们是否违反了提供程序强制实施的唯一性或命名规则。 在类似
concat()或uniqueString()这样的表达式被解析之后进行该检查。 预检验证通常在以下情况下失败:- 已采用全局唯一名称(例如存储帐户名称)
- 资源名称违反提供程序特定的命名约束
范围正确性:预检验证可确保将资源部署到有效范围,并且部署命令与模板中声明的资源类型匹配。 此验证包括:
- 部署范围(资源组、订阅、管理组、租户)是否与资源类型兼容
- 是否存在必需的父范围。 例如,在没有资源组的情况下在订阅范围内部署资源组范围的资源。
RBAC 权限(是否可以部署这些资源类型):在预检期间,ARM 会验证调用方在部署范围内是否有足够的权限来创建或修改请求的资源。 在执行之前,如果身份缺少权限,部署将被拒绝。 典型的预检权限失败包括:
- 缺少资源类型的写入权限
- 目标范围内的权限不足
- 未注册的必要资源提供程序
基础提供程序和 API 兼容性:预检验证会确认:
- 所引用的资源提供程序已注册
- 指定的 API 版本有效且受支持
- 资源类型由Azure Resource Manager识别
如果未注册提供程序或 API 版本无效,ARM 在预检期间无法完成部署。
如果其中任一检查失败,则部署永远不会启动。
局限性
预检验证是尽力而为的过程,无法捕获所有部署时错误。 它无法检测运行时失败(例如在执行期间自定义脚本扩展中的错误),并且当资源依赖于尚不可用的值(例如来自其他资源的动态生成属性)时,其验证可能不完整。
运行预检
当使用部署验证或 what-if 类型命令时,会自动运行预检验证。 例如,这些操作执行预检验证:
Azure CLI 或 PowerShell 中的 ARM JSON 或 Bicep 的验证
az deployment group validate \ --resource-group myResourceGroup \ --template-file main.bicepAzure门户审核 + 创建 步骤
目前,Azure门户仅支持部署 ARM JSON 模板。 有关详细信息,请参阅 Azure 门户Deploy ARM 模板。
What-if
在计算更改之前,What-if 包括预先检查,除非将其配置为跳过该步骤。 有关详细信息,请参阅 “运行 what-if 操作”。
预检错误显示在活动日志中,但不出现在部署历史记录中,因为部署从未开始。
后续步骤
- 若要使用 what-if 操作,请参阅 Bicep What-If:在部署前预览更改。