1. ホーム
  2. azure

[解決済み] バックエンドの初期化が必要なため、"terraform init" を実行してください。

2022-03-01 05:52:32

質問

バックエンドに以下のようなTerraformの設定をしていて、しばらくの間うまくいっていました。

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
    }
  }

  backend "azurerm" {
    resource_group_name  = "my-rg"
    storage_account_name = "my-sa"
    ####!!!!! BELOW USED TO WORK !!!!###
    provider             = azurerm.mysub  
    key                  = "terraform.tfstate"
  }
}

provider "azurerm" {
  skip_provider_registration = true
  subscription_id            = "xxxxxx-xxxxx-xxxxx-xxxxx"  
  alias                      = "mysub"
  features {
  }
}

しかし、アップグレード後に、このブロックではプロバイダが許可されないと言われました(正確なエラーメッセージは覚えていません)。そこで、代わりにこのように変更しました。

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
    }
  }

  backend "azurerm" {
    resource_group_name  = "my-rg"
    storage_account_name = "my-sa"
    ###!!!! Direct Reference to Subscription ID !!!!###
    subscription_id      = "xxxxxx-xxxxx-xxxxx-xxxxx"  
    key                  = "terraform.tfstate"
  }
}

しかし、今はこう書いてある。

│ Error: Backend initialization required, please run "terraform init"
│
│ Reason: Backend configuration changed for "azurerm"
│
│ The "backend" is the interface that Terraform uses to store state,
│ perform operations, etc. If this message is showing up, it means that the
│ Terraform configuration you're using is using a custom configuration for
│ the Terraform backend.
│
│ Changes to backend configurations require reinitialization. This allows
│ Terraform to set up the new configuration, copy existing state, etc. Please run
│ "terraform init" with either the "-reconfigure" or "-migrate-state" flags to
│ use the current configuration.
│
│ If the change reason above is incorrect, please verify your configuration
│ hasn't changed and try again. At this point, no changes to your existing
│ configuration or state have been made.

もし、状態を記憶させて、後で同じものを破壊する方法を知っておきたい場合は、どのようなコマンドを使えばいいのでしょうか?私はすでにテラフォームを使ってこのRGに何度か繰り返しリソースを配置しており、それをそのままにしておきたいのです。

テラフォーム初期化 , OR,

terraform init -reconfigure , OR,

terraform init -migrate-state ??

バックエンドの場所は変わっていないので、そのまま続けたいのですが、バックエンドブロックの更新を無視して、"provider" から "subscription_id" を使用するようにしたいのです。どのコマンドを使用すればよいのでしょうか?

よろしくお願いします。

どのように解決するのですか?

terraform init ドキュメンテーション は、この状況について次のように述べています。

すでに初期化されたバックエンドでinitを再実行すると、新しいバックエンドの設定を使用するために作業ディレクトリが更新されます。どちらかというと -reconfigure または -migrate-state は、バックエンドの設定を更新するために提供されなければなりません。

-migrate-state オプションは既存の状態を新しいバックエンドにコピーしようとし、変更内容によってはワークスペース状態の移行を確認するための対話型プロンプトが表示されます。このオプションは -force-copy オプションはこれらのプロンプトを抑制し、移行の質問には "yes"と回答します。これは次のことを意味します。 -migrate-state .

-reconfigure オプションは既存の設定を無視し、既存の状態の移行を防ぎます。

ここでの判断ポイントは、Terraformに状態を新しい場所にコピーしようとする明示的なアクションを取らせるかどうかです( -migrate-state それとも、Terraformに古い設定を完全に忘れさせ、新しい設定を直接使用させたいのでしょうか?

物理的な位置は変更せず、代わりに同じ情報を違う方法で書いただけとのことですので -reconfigure はその状況にマッチするオプションです: 状態はすでに "new" の場所で利用可能なので、ここで明示的に移行する必要はありません (これは機能的には古い場所と同じですが、Terraform はそれを知ることができません) 。


バックエンドの設定をプロバイダに関連付けることは、これまで有効ではなかったので、以前動作していたものは、あなたが考えていたようには動作していなかったことに注意してください。

azurerm バックエンドは ARM_SUBSCRIPTION_ID 環境変数を明示的に設定しないと subscription_id ということは、以前はその環境変数が設定されたコンテキストで Terraform を実行しており、明示的に設定していなくてもバックエンドが適切なサブスクリプション ID を見つけることができたと推測されます。

バックエンドが無効な引数を拒否しなかった理由 provider は私には不明です。これはTerraformかバックエンドのどちらかのバグを示唆しています。 provider が、そのバックエンドの設定スキーマで宣言されています。