在 AzAPI Terraform 提供程序中启用预检验证

使用 Terraform 可以定义、预览和部署云基础结构。 使用 Terraform 时,请使用 HCL 语法来创建配置文件。 HCL 语法允许你指定云提供商(如 Azure)和构成云基础结构的元素。 创建配置文件后,可以创建 一个执行计划 ,以便在部署基础结构更改之前预览这些更改。 验证更改后,应用执行计划来部署基础结构。

AzAPI Terraform 提供者包括内置的预检验证功能,该功能会在 terraform plan 过程期间,根据 ARM API 架构验证 Azure 资源配置,确保在 Azure 中创建或修改任何资源之前执行验证。 预检会提前捕获配置错误——例如无效的地址前缀、不支持的属性组合或配额冲突——而无需承担失败部署的成本。

预飞行验证是 AzAPI 的关键区别之一,原生兼容于提供商的直通 ARM-API 体系结构。 还可以在 Microsoft Terraform VS Code 扩展 中运行预运行检查,而无需直接设置提供程序标志。

先决条件

  • Azure 订阅:如果没有 Azure 订阅,请在开始之前创建 一个免费帐户

使用 Microsoft 帐户登录到 Azure 门户时,将使用该帐户的默认 Azure 订阅。

Terraform 使用默认 Azure 订阅中的信息自动进行身份验证。

运行 az account show 以验证当前Microsoft帐户和 Azure 订阅。

az account show

通过 Terraform 所做的任何更改都显示在显示的 Azure 订阅上。 如果这是你想要的,请跳过本文的其余部分。

启用预检验证

provider "azapi"块中设置enable_preflight = true

provider "azapi" {
  enable_preflight = true
}

默认情况下禁用预检以保留向后兼容性。 在您希望进行早期验证的环境中启用它,例如 CI 管道和拉取请求检查。

示例:在规划阶段捕获无效的地址前缀

以下配置创建具有无效的无类别域间路由(CIDR)块的虚拟网络。 启用预检后,错误会显示在过程中terraform plan,而不是在过程中terraform apply

terraform {
  required_providers {
    azapi = {
      source  = "Azure/azapi"
      version = "~> 2.0"
    }
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 4.0"
    }
  }
}

provider "azurerm" {
  features {}
}

provider "azapi" {
  enable_preflight = true
}

resource "azurerm_resource_group" "example" {
  name     = "rg-preflight-demo"
  location = "eastus"
}

resource "azapi_resource" "vnet" {
  type      = "Microsoft.Network/virtualNetworks@2024-01-01"
  parent_id = azurerm_resource_group.example.id
  name      = "vnet-example"
  location  = "eastus"

  body = {
    properties = {
      addressSpace = {
        addressPrefixes = [
          "10.0.0.0/160"  # Invalid prefix length — preflight catches this at plan time
        ]
      }
    }
  }
}

在使用此配置运行 terraform plan 时,预检会返回类似于以下内容的错误:

Error: preflight validation failed for resource "azapi_resource.vnet":
  The value '10.0.0.0/160' is not a valid CIDR block.

将地址前缀更正为有效值(例如), 10.0.0.0/16将清除错误。

预检的验证内容

预检会将资源正文发送到 ARM API 的预检终结点,该终结点将验证:

  • 针对 ARM 资源架构的属性值(例如,有效的 CIDR(无类 Inter-Domain 路由)范围、允许的 SKU 名称、必填字段)。
  • 支持的资源类型的订阅级配额和容量约束。
  • 预检模式下运行的 Azure 策略分配的合规性。

预检 不会 验证:

  • 跨资源依赖关系或排序。
  • 没有 ARM 预检终结点支持的资源(提供程序自动跳过对这些资源类型的验证)。
  • 身份验证或授权失败(标识和访问管理 (IAM))——这些失败在terraform apply期间显现。

在 CI 管道中使用预检

将预检添加到 CI 管道可提供快速的非破坏性验证步骤,用于在合并代码之前捕获配置错误。 在 Terraform 配置的提供程序块中启用 enable_preflight = true ,然后运行 terraform plan

provider "azapi" {
  enable_preflight = true
}

由于预检在 terraform plan 期间没有副作用,因此可以安全地针对实时 Azure 订阅在拉取请求工作流中运行。

使用ignore_no_op_changes禁用输出噪声

如果反复运行计划,AzAPI 可能会检测到配置与 ARM 状态之间的细微 no-op 差异(例如,API 返回的规范化默认值)。 要消除这些计划时间差异并专注于实际更改,请在提供程序块中设置 ignore_no_op_changes = true

provider "azapi" {
  enable_preflight      = true
  ignore_no_op_changes  = true
}

后续步骤