Terraform管理外のインフラリソースをTerraform管理したい
Terraformでのインフラ構成の管理において、Terraform管理外ですでに作られているリソースをTerraform管理かにおきたい場合、Terraform importの機能を使えば管理下におくことができます。
Terraform管理下におく方法
Terraform 管理下におく、つまり既存のリソースをtfstateに記録する方法は大きく分けて2つあります。
- terraform import でリソースを指定して、import
- この場合は terraform importを実行した場合、tfstateに指定したリソースの情報が記録されます。
- importブロックを指定して、terraform plan -generate-config-out="generated.tf" を実行して、管理外のリソースを-generate-config-outオプションで指定したファイルに出力する
- これにより、tfstateにリソースの情報が記録されるとともに、-generate-config-outに指定したファイルにimportしたリソースの設定が出力されます。 これを元に値を修正して利用することができます。
terraform plan -generate-config-outでimport内容が生成されない場合
ここで、2番目の terraform plan -generate-config-out を実行した際に、何もplan結果は実行されるがファイルに出力されない場合があります。
この要因として、importの作業とかですでに指定のリソースがtfstateに記録されている、つまりTerraform管理になっている場合が考えられます。
原因調査方法
terraformコマンド実行におけるトラブルシューティングは、まずはログレベルの変更から試します。 terraformの実行時のログレベルをDEBUGにすることで、ファイルの生成処理の状況を確認できます。
シェルでの例ですが、TF_LOGという環境変数に DEBUGを指定して実行します。
TF_LOG=DEBUG terraform plan -generate-config-out=generate.tf
こうすると、terraform実行時にデバッグログが出力されます。
2025-06-18T14:09:41.516Z [DEBUG] expandResourceImports: skipping import address aws_cloudfront_distribution.test-dist already in state
今回の例だと、容器のようにすでにtfstateに指定のリソースが記録されていたためスキップされていることがわかります。
importの生成ファイルのスキップ処理の実装について
上記のログの出力箇所について調べてみました。
terraform v1.12.2において、以下の処理でファイル生成がスキップされていることがわかります。
// filter out any known import which already exist in state for _, el := range knownImports.Elements() { if state.ResourceInstance(el.Key) != nil { log.Printf("[DEBUG] expandResourceImports: skipping import address %s already in state", el.Key) knownImports.Remove(el.Key) } }
先ほど説明した通り、importブロックを解析してファイル出力する処理において、すでにimportされているかをチェックして、それに含まれていたら出力をスキップしていることがわかります。