はじめに
こんにちは!新卒1年目のなべしまです。暖かくなってきましたね。
夏休みにはまだ早いですが、Terraformで自由研究を始めました!今回はTerraformでの試行錯誤を共有したいと思います。
筆者について
- 入社:
- 2025年4月(新卒1年目)
- 担当業務:
- 基幹システムグループ(ジョブローテ中)
- 接続サービス申込みに関連するシステム刷新を担当中
きっかけ
現在担当しているシステムでは、AWSを利用しており、リソース管理にはTerraformを活用しています。Terraformコードを書く際、先輩社員から「 -generate-config-out オプションを試してみてはどうか」と助言をもらいました。そこで、試行錯誤や調査の記録をブログにまとめることにしました。
既存リソースのIaC化
-generate-config-out オプションでは、importブロックを利用します。はじめにimportブロックについて触れ、-generate-config-out オプションによるIaCを紹介します。
importブロック
従来は terraform import というCLIコマンドを直接実行する必要がありました。一方で、Terraform 1.5で導入された import ブロックを使うことで、「インポートすること自体」をIaCで定義できるようになりました。
import ブロックの書き方は非常にシンプルで、以下の2つの引数を指定します。これらは別のファイルにまとめて記述するのが一般的です。
|
1 2 3 4 5 6 |
# importブロックの記入例 import { to = aws_s3_bucket.my_bucket # Terraform上のリソースアドレス(インポート先) id = "my-actual-bucket-name" # クラウドプロバイダ上の実際のID(インポート元) } |
-generate-config-out オプション
-generate-config-out は、Terraform 1.5から追加された terraform plan コマンドの新しいオプションです。主な仕様と特徴は以下の通りです。
- IaCの自動生成
importブロックで指定したリソースのうち、まだ設定ファイル上にresourceブロックが存在しないものを見つけると、クラウド上の実際の設定を読み取り、指定したファイル名でHCLコードを新規作成します。
- コマンドの構文
terraform plan -generate-config-out=<出力先のファイル名>.tfのように、出力したいファイル名を指定して実行します。
- 既存ファイルの保持
- 指定したファイルが既に存在し、何らかのコードが記述されている場合、Terraformはエラーを返し、既存のコードを誤って上書きしないように保護します。
|
1 2 3 |
# リソースのインポートのコマンド例 terraform plan -generate-config-out=generate.tf |
実際に書き起こしてみる
実際にS3バケットを作成し、IaCを書き起こしてみます。下図に示すような、S3バケットをAWSコンソールから作成します。

import ブロック用ファイルの準備をします。
|
1 2 3 4 5 6 7 |
# インポート用.tfファイル import { to = aws_s3_bucket.my_manual_bucket id = "aws-s3-sample-bucket-2026-03" } |
terraform plan を実行します。インポートされているログが出力されます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# ターミナル上で実行 $ terraform plan -generate-config-out=generate.tf ... Terraform will perform the following actions: # aws_s3_bucket.my_manual_bucket will be imported # (config will be generated) resource "aws_s3_bucket" "my_manual_bucket" { acceleration_status = null arn = "arn:aws:s3:::aws-s3-sample-bucket-2026-03" bucket = "aws-s3-sample-bucket-2026-03" bucket_domain_name = "aws-s3-sample-bucket-2026-03.s3.amazonaws.com" bucket_prefix = null bucket_region = "ap-northeast-1" ... |
出力された generate.tf を確認します。s3の設定が書き出されていることが確認できました。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 以下はgenerate.tfの内容 # __generated__ by Terraform # Please review these resources and move them into your main configuration files. # __generated__ by Terraform from "aws-s3-sample-bucket-2026-03" resource "aws_s3_bucket" "my_manual_bucket" { bucket = "aws-s3-sample-bucket-2026-03" force_destroy = false object_lock_enabled = false region = "ap-northeast-1" tags = {} tags_all = {} } |
-generate-config-out の注意点
作業をする中で、私がハマったポイントを2点紹介します。
importブロックのid について
import ブロックを書く際、インポート元のリソースを指定する id という項目があります。リソースの種類によって指定すべき値(フォーマット)が異なります。
- S3バケットの場合: バケット名
- 例:
aws-s3-sample-bucket-2026-03
- 例:
- ECSタスク定義の場合:ARN
- 例:
arn:aws:ecs:us-east-1:012345678910:task-definition/mytaskfamily:123
- 例:
リソースごとの正しい指定方法は、Terraform公式ドキュメント(Registry)の各リソースページにある、Importセクションを参照する必要があります。これは、Terraform 1.4 以前の import コマンドでも同様です。
resource ブロックについて
import ブロックの to で指定したリソースが、すでにどこかの .tf ファイル内で少しでも定義されている場合、Terraformはコードの出力をスキップしてしまいます。
|
1 2 3 |
# 属性が空のリソースでも、`-generate-config-out`時にはファイル生成がスキップされてしまう resource "aws_s3_bucket" "my_manual_bucket" {} |
Terraformにおける「インポート」とは、コンソールなどから手動で作成した既存リソースを、Terraformの管理下(Stateファイル)に取り込む機能です。
-generate-config-out を使う際、すでに .tf ファイル内に該当の resource ブロックが少しでも書かれていると、Terraformは「インポート先のコードは用意されている」と判断してしまいます。
コードを自動生成させたい場合は、対象の resource ブロックを事前に定義しないようにしましょう。
有効な活用例
ここまで紹介した terraform plan -generate-config-out は、「既存リソースをあとからTerraform管理に移したいが、まずは現状の設定を安全にコード化して出発したい」という場面で特に役立ちます。
- 手動で作ったリソースの棚卸し
- 先にコンソールから作ってしまったリソースなどを、後からIaC化して管理したい場合
- 既存環境のIaC化の第一歩
- 既存システムを一気に書き直すのが難しい場合に、一部リソースをインポートしてコード生成し、差分を確認しながら段階的に移行
ただし、生成されたHCLはあくまで“たたき台”です。不要な属性の修正やモジュール化は、運用方針に合わせて必ず見直す必要がありそうです。
おわりに
Terraformの terraform plan -generate-config-out は、import ブロックと組み合わせることで、インポート作業をIaCとして残しつつ、既存リソースの設定をコードに起こす手助けをしてくれる便利な機能です。
今回の検証ではS3バケットを例にしましたが、リソースの種類によって id の形式が異なる点や、既存の resource 定義があると生成がスキップされる点など、実際に触ってみないと気づきづらい落とし穴もありました。
同じように試している方の参考になれば嬉しいです。
参考文献
- Terraform公式ドキュメント: Import ブロック
- Terraform公式ドキュメント: terraform plan -generate-config-out
- Terraform Registry: 各リソースの Import セクション


