次の方法で共有


高度なシナリオでの 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 の問題をご覧ください

クエリをさらにカスタマイズする

上記以外の高度なフラグとその使用方法について説明します。

クラウド環境の選択

パブリック クラウド以外の別の環境を指定するには、--env フラグを使用します。 たとえば、米国政府の場合は次のようになります。

aztfexport [command] --env="usgovernment" [further options] <scope>

Terraform プロバイダー バージョンの変更

優先する AzureRM または AzAPI バージョンに簡単にアクセスするには、--provider-version フラグを使用します。 たとえば、AzAPI バージョン 1.10.0 の場合は、次のようになります。

aztfexport [command] --provider-name=azapi --provider-version=1.10.0 [further options] <scope>

認証

認証構成の管理用には、さまざまなフラグが存在します。 一部のフラグは、v0.15 で追加されました。

  • --env
  • --tenant-id
  • --auxiliary-tenant-ids
  • --client-id
  • --client-id-file-path
  • --client-certificate
  • --client-certificate-path
  • --client-certificate-password
  • --client-secret
  • --client-secret-file-path
  • --oidc-request-token
  • --oidc-request-url
  • --oidc-token
  • --oidc-token-file-path
  • --use-managed-identity-cred (既定値は false)
  • --use-azure-cli-cred (既定値は true)
  • --use-oidc-cred (既定値は false)

上記のフラグは、azurerm プロバイダーの命名規則に従っています。 すべてのフラグは環境変数を介した構成も可能です。これには azurerm プロバイダーで定義されているものと同じ環境変数が含まれます。

aztfexport は、次の順序で各資格情報タイプを使用して認証を試行し、トークンが提供されると停止します。

  1. クライアント シークレット
  2. クライアント証明書
  3. OIDC
  4. マネージド ID
  5. Azure CLI

1 つ以上の use-xxx-cred が true でない場合、その資格情報タイプはスキップされます。 この動作はプロバイダーと同じです。

プロバイダー構成は、aztfexport からの認証構成をオーバーライドできます。 これによりユーザーは、aztfexport とプロバイダーで異なる資格情報タイプを使用できるようになります。

ロールの割り当てを含める

リソースのスコープをエクスポートするときにロールの割り当てを含める場合は、--include-role-assignment コマンドを使用します。

aztfexport [command] --include-role-assignment [further options] <scope>

次のステップ