高度なシナリオでの Azure Export for Terraform の使用
この記事では、Azure Export for Terraform を使用して、より高度なタスクの一部を実行する方法について説明します。
- 既存の Terraform 環境にリソースを追加します。
- リモート バックエンド状態の既存の Terraform 環境にリソースをエクスポートする
既存のリソースへの追加
既定では、Azure Export for Terraform では、既存のユーザー ファイルとの競合を回避するために、出力ディレクトリが空になります。 既存の状態ファイルにリソースをインポートする必要がある場合は、--append
フラグを追加します。
aztfexport [command] --append <scope>
--append
フラグを指定すると、Azure Export for Terraform は、現在のディレクトリ内のいずれかのファイルに既存 provider
または terraform
ブロックがあるかどうかを確認します。 そうでない場合、ツールはブロックごとにファイルを作成し、エクスポートを続行します。 出力ディレクトリに状態ファイルがある場合、エクスポートされたリソースはすべて状態ファイルにインポートされます。
さらに、生成されるファイルには拡張子の前に .aztfexport
サフィックスが付いています - 例: main.aztfexport.tf
- これはファイル名の競合の可能性を回避するためです。
aztfexport --append
を複数回実行すると、ファイルに追加されたエクスポート結果とともに、単一の main.aztfexport.tf
がコマンドが実行されるたびに作成されます。
独自の Terraform 構成を使用する
既定では、Azure Export for Terraform はローカル バックエンドを使用して状態ファイルを格納します。 ただし、リモート バックエンドを使用することもできます。 Azure Export for Terraform を使用すると、独自の terraform
または provider
ブロックを定義して受け渡しできます。
ターゲット ディレクトリ内の .tf
ファイルでこれらのブロックを定義し、--append
フラグを使用してエクスポートし、構成を指定したバックエンドとプロバイダーのバージョン (指定されている場合) にエクスポートします。
重要
エクスポート時に、指定したバージョンの AzureRM がインストールされているバージョンと一致しない場合、コマンドは失敗します。
Azure Storage の例
この例は、記事「Azure Storage に Terraform 状態を格納する」に基づいています。
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>3.0"
}
}
backend "azurerm" {
resource_group_name = "tfstate"
storage_account_name = "storageacc"
container_name = "tfstate"
key = "terraform.tfstate"
}
}
provider "azurerm" {
features {}
}
Terraform Cloud の例
terraform {
cloud {
organization = "aztfexport-test"
workspaces {
name = "aztfexport-playground"
}
}
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>3.0"
}
}
}
provider "azurerm" {
features {
}
}
インライン エクスペリエンス
バックエンドにインラインでエクスポートするには、--backend-type
and--backend-config
オプションを使用します。 Terraform バックエンドの構成の詳細については、「Terraform バックエンドの構成」を参照してください。
Azure ストレージ アカウントの例を使用する場合は、「AzureRM バックエンド ドキュメント」で 定義されている次のものが必要です。
- リソース グループ名
- ストレージ アカウント名
- ストレージ コンテナー名
これらのパラメーターを、バックエンドの種類と共にコマンドに渡します。
aztfexport [subcommand] --backend-type=azurerm \
--backend-config=resource_group_name=<resource group name> \
--backend-config=storage_account_name=<account name> \
--backend-config=container_name=<container name> \
--backend-config=key=terraform.tfstate
重要なポイント:
- 前の例では、Unix 行継続文字を使用して、コードがブラウザにうまく表示されるようにしています。 PowerShell などのコマンド ライン環境に合わせてこれらの文字を変更するか、コマンドを 1 行に結合することが必要な場合があります。
- バックエンドの状態が既に存在する場合、Azure Export for Terraform は新しいリソースを既存の状態と自動的にマージします。 オプション インライン
--append
を指定する必要はありません。
Azure リソースを既存の Terraform 環境にエクスポートする
それでは、まとめてみましょう。 Terraform の管理に移動する必要がある新しいリソースが Terraform の外部で作成されたとします。 セクションを完了するには、バックエンドが構成されていることを確認します。 このチュートリアルでは、Azure Storage リモート状態のチュートリアルで指定されているものと同じ構成を使用します。
一時ディレクトリを作成する親ディレクトリで、次のコマンドを実行します。
aztfexport resource -o tempdir --hcl-only <resource_id>
重要なポイント:
- ディレクトリが存在しない場合、
-o
フラグが作成するように指定します。 --hcl-only
フラグが構成されたリソースを HCL にエクスポートするように指定します。
- ディレクトリが存在しない場合、
リソースを追加できることを調査したら、生成されたマッピング ファイルと
--append
フラグを使用して、Azure Export が既存の環境内の既存のリモート状態とプロバイダーのバージョンと一致していることを確認します。aztfexport map --append `./tempdir/aztfexportResourceMapping.json`
terraform init を実行します。
terraform init --upgrade
terraform plan を実行します。
Azure Export for Terraform には、[変更は必要ありません] と表示されます。
おめでとうございます。 インフラストラクチャとそれに対応する状態が Terraform 環境に正常に追加されました。
プランで問題が発生する場合は、「Azure Export for Terraform の概念」を参照して、生成されたコードのデプロイに関する制限事項をご覧ください--hcl-only
。 その記事が役に立たない場合は、GitHub の問題をご覧ください。