在 AzAPI Terraform 提供者中啟用檢查前驗證

Terraform 可讓您定義、預覽和部署雲端基礎結構。 使用 Terraform 時,你可以用 HCL 語法建立設定檔。 HCL 語法可讓您指定雲端提供者 (例如 Azure) 和構成雲端基礎結構的元素。 建立組態檔之後,您會建立一個 執行計劃 ,讓您在部署基礎結構變更之前先預覽這些變更。 驗證變更之後,您可以套用執行計畫來部署基礎結構。

AzAPI Terraform 提供者內建的預先檢查驗證功能,會在 terraform plan 期間,在 Azure 建立或修改任何資源前,驗證你的 Azure 資源配置是否符合 ARM API 架構。 預檢檢查能及早發現配置錯誤——例如無效的位址前綴、不支援的屬性組合或配額違規——且不會產生部署失敗的成本。

檢查前驗證是 AzAPI 的主要差異化點之一,並原生支援供應商的直達ARM-API 架構。 你也可以直接從 Microsoft Terraform VS Code 擴充檔執行預檢查,而不必直接設定提供者旗標。

先決條件

  • Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。

當您使用Microsoft帳戶登入 Azure 入口網站時,會使用該帳戶的預設 Azure 訂用帳戶。

Terraform 會自動使用預設 Azure 訂用帳戶中的資訊進行驗證。

執行 az account show 以確認目前的Microsoft帳戶和 Azure 訂用帳戶。

az account show

您透過 Terraform 所做的任何變更都會顯示在顯示的 Azure 訂用帳戶上。 如果是您想要的,請略過本文的其餘部分。

啟用預檢驗驗證

將 enable_preflight = true 設定在 provider "azapi" 區塊中:

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 期間執行且沒有副作用,所以在 pull request 工作流程中對現用 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
}

下一步