Terraform を使用すると、クラウド インフラストラクチャの定義、プレビュー、およびデプロイを行うことができます。 Terraform を使用する際は、HCL 構文を使って構成ファイルを作成します。 HCL 構文を使用すると、クラウド プロバイダー (Azure など) とクラウド インフラストラクチャを構成する要素を指定できます。 構成ファイルを作成したら、"実行プラン" を作成します。これにより、インフラストラクチャの変更をデプロイ前にプレビューすることができます。 変更を確認したら、実行プランを適用してインフラストラクチャをデプロイします。
AzAPI Terraform プロバイダーには、Azureでリソースが作成または変更される前に、terraform plan 中に ARM API スキーマに対してAzureリソース構成を検証する組み込みのプレフライト検証が含まれています。 プレフライトでは、無効なアドレス プレフィックス、サポートされていないプロパティの組み合わせ、クォータ違反など、構成エラーを早期にキャッチします。デプロイの失敗のコストは発生しません。
プレフライト検証は、AzAPI の主要な差別化要因の 1 つであり、プロバイダーの直接ARM-API アーキテクチャとネイティブに連携します。 プロバイダー フラグを直接設定せずに、Microsoft Terraform VS Code 拡張機能からプレフライトを実行することもできます。
前提条件
- Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
Terraform の構成: まだ構成していない場合は、次のいずれかのオプションを使用して Terraform を構成します。
Microsoft アカウントを使用して Azure portal にログインすると、そのアカウントの既定の Azure サブスクリプションが使用されます。
Terraform は、既定の Azure サブスクリプションの情報を使用して自動的に認証します。
az account show を実行して、現在の Microsoft アカウントと Azure サブスクリプションを確認します。
az account show
Terraform を使用して行った変更は、表示される Azure サブスクリプション上にあります。 これが必要な場合は、この記事の残りの部分をスキップしてください。
プレフライト検証を有効にする
enable_preflight = true ブロックでprovider "azapi"を設定します。
provider "azapi" {
enable_preflight = true
}
プレフライトは、旧バージョンとの互換性を維持するために既定で無効になっています。 CI パイプラインやプル要求チェックなど、早期検証が必要な環境で有効にします。
例: 計画時に無効なアドレスプレフィックスを検出する
次の構成では、無効なクラスレス Inter-Domain ルーティング (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 Policy割り当てのポリシー コンプライアンス。
プレフライトでは、次 の検証は行われません 。
- リソース間の依存関係またはシーケンス処理。
- ARM プレフライト エンドポイントがサポートされていないリソース (プロバイダーは、これらのリソースの種類の検証を自動的にスキップします)。
- 認証または承認 (IDENTITY and Access Management (IAM)) のエラー—これらのエラーは、
terraform apply中に発生します。
CI パイプラインでプレフライトを使用する
CI パイプラインにプリフライトを追加すると、コードがマージされる前に構成エラーをキャッチする、高速で非破壊的な検証手順が提供されます。 Terraform 構成のプロバイダー ブロックで enable_preflight = true を有効にしてから、 terraform plan実行します。
provider "azapi" {
enable_preflight = true
}
プリフライトは副作用なしで terraform plan 中に実行されるため、ライブ Azure サブスクリプションに対して pull request ワークフローで実行しても安全です。
で出力ノイズを無効にする ignore_no_op_changes
プランを繰り返し実行すると、AzAPI によって、構成と ARM 状態の小さな no-op の違いが検出される場合があります (たとえば、API によって返される正規化された既定値)。 これらの計画時の違いを抑制し、実際の変更に焦点を当てるには、プロバイダー ブロックで ignore_no_op_changes = true を設定します。
provider "azapi" {
enable_preflight = true
ignore_no_op_changes = true
}