高度なシナリオでの 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-typeand--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 リモート状態のチュートリアルで指定されているものと同じ構成を使用します

  1. 一時ディレクトリを作成する親ディレクトリで、次のコマンドを実行します。

    aztfexport resource -o tempdir --hcl-only <resource_id>
    

    重要なポイント:

    • ディレクトリが存在しない場合、-o フラグが作成するように指定します。
    • --hcl-only フラグが構成されたリソースを HCL にエクスポートするように指定します。
  2. リソースを追加できることを調査したら、生成されたマッピング ファイルと --append フラグを使用して、Azure Export が既存の環境内の既存のリモート状態とプロバイダーのバージョンと一致していることを確認します。

    aztfexport map --append `./tempdir/aztfexportResourceMapping.json`
    
  3. terraform init を実行します。

    terraform init --upgrade
    
  4. terraform plan を実行します。

  5. Azure Export for Terraform には、[変更は必要ありません] と表示されます

おめでとうございます。 インフラストラクチャとそれに対応する状態が Terraform 環境に正常に追加されました。

プランで問題が発生する場合は、「Azure Export for Terraform の概念」を参照して、生成されたコードのデプロイに関する制限事項をご覧ください--hcl-only。 その記事が役に立たない場合は、GitHub の問題をご覧ください

次のステップ