Blog

-generate-config-outで始める既存環境のIaC化

はじめに

こんにちは!新卒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つの引数を指定します。これらは別のファイルにまとめて記述するのが一般的です。

-generate-config-out オプション

-generate-config-out は、Terraform 1.5から追加された terraform plan コマンドの新しいオプションです。主な仕様と特徴は以下の通りです。

  • IaCの自動生成
    • import ブロックで指定したリソースのうち、まだ設定ファイル上に resource ブロックが存在しないものを見つけると、クラウド上の実際の設定を読み取り、指定したファイル名でHCLコードを新規作成します。
  • コマンドの構文
    • terraform plan -generate-config-out=<出力先のファイル名>.tf のように、出力したいファイル名を指定して実行します。
  • 既存ファイルの保持
    • 指定したファイルが既に存在し、何らかのコードが記述されている場合、Terraformはエラーを返し、既存のコードを誤って上書きしないように保護します。

実際に書き起こしてみる

実際にS3バケットを作成し、IaCを書き起こしてみます。下図に示すような、S3バケットをAWSコンソールから作成します。

fig. IaC管理対象のS3バケット

import ブロック用ファイルの準備をします。

terraform plan を実行します。インポートされているログが出力されます。

出力された generate.tf を確認します。s3の設定が書き出されていることが確認できました。

-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はコードの出力をスキップしてしまいます。

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 定義があると生成がスキップされる点など、実際に触ってみないと気づきづらい落とし穴もありました。

同じように試している方の参考になれば嬉しいです。

参考文献

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!