【実務・中級編】Terraform import徹底解説!既存のAWSリソースをコード管理下に安全に取り込む手順 – インフラ構成管理(IaC)活用バイブル

Terraform Importの「闇」を暴く:手動リソースをコード化し、インフラの秩序を取り戻す完全攻略ガイド

現場で「とりあえずコンソールでポチポチ作った」リソースが、いつの間にか制御不能なレガシーと化している――。これは、Terraformを導入した多くのチームが直面する「技術的負債の第一段階」です。

今日は、その行き場のないリソースをTerraformの管理下に引き戻し、「宣言的なインフラ」へと昇華させるための極意を伝授します。単なるマニュアルの焼き直しではなく、実戦で血を流してきたエンジニアだけが知る「安全なインポート戦略」を共有します。

—

1. インポートの哲学:なぜ「闇雲にコマンドを打つ」のが失敗の元か

`terraform import`は、現在のクラウド状態をStateファイルに強引に書き込む行為です。しかし、Stateファイルだけを更新しても、コード(HCL)は空のまま。このギャップこそが、次回の`plan`で発生する「大規模なドリフト(構成乖離)」の正体です。

鉄則:
1. Stateへの反映(import)
2. コードへの落とし込み(generate)
3. ドリフト解消(plan/apply)

この3ステップを機械的に踏めるかどうかが、あなたの生産性を左右します。

—

2. 現場で震えるほど役立つ「インポート高速化」テクニック

A. terraform-provider-sfc (Importを自動化する魔法)

コマンドを一つずつ叩くのは時間の無駄です。既存のAWSリソースを一括で読み込み、HCLファイルを生成してくれるツール群を活用しましょう。

  • [Terraformer](https://github.com/GoogleCloudPlatform/terraformer): AWSリソースをスキャンし、HCLとStateを自動生成します。「大規模な既存環境」をインポートする際の初手として、これに勝るものはありません。

B. VS Code 必須設定:Terraform管理の神プラグイン

  • HashiCorp Terraform (公式): 必須。LSPによる補完とドキュメント参照はこれ一択。
  • Terraform Doc Snippets: 定型文を瞬時に生成。
  • Settings Sync: チーム全員で同じ拡張機能とフォーマッター設定を共有すること。`settings.json`をリポジトリの `.vscode/` 配下に含め、プロジェクトごとのルールを強制しましょう。

// .vscode/settings.json – チーム開発の最低限の作法
{
“terraform.languageServer”: {
“args”: [“serve”]
},
“editor.formatOnSave”: true, // 保存時にterraform fmtを走らせる
“editor.codeActionsOnSave”: {
“source.fixAll”: “explicit”
}
}

—

3. 実践:安全なインポート・ワークフロー

ステップ1:リソースの特定とImportブロックの活用

Terraform 1.5以降、`import` ブロックが導入されました。これにより、コマンド操作なしで宣言的にインポートが可能です。

main.tf にインポート定義を記述する
import {
to = aws_s3_bucket.my_bucket
id = “my-existing-bucket-name”
}

ステップ2:構成の生成と検証

`terraform plan` を実行し、Terraformが「どの属性が不足しているか」を教えてくれるのを待ちます。
ここで重要なのは、`terraform plan` の出力を精査し、既存リソースのパラメータとコードの差分をゼロにすることです。 焦って `apply` してはいけません。

ステップ3:ドリフトの排除

以下のような構成管理を推奨します。

modules/s3_bucket/main.tf
resource “aws_s3_bucket” “this” {
bucket = var.bucket_name
# 既存リソースのパラメータをここに完全に一致させる
# 差分が出る場合は、ここでHCL側を修正して一致させる
tags = {
ManagedBy = “Terraform”
}
}

—

4. チーム生産性を最大化する「構造化」のルール

インフラをコード化する際、単一の巨大な`main.tf`は「悪」です。以下の階層構造を徹底してください。

/infrastructure
/modules
/s3

  • main.tf # リソース定義
  • variables.tf
  • outputs.tf

/environments
/prod

  • main.tf # モジュールを呼び出すだけ
  • backend.tf # S3/DynamoDBを用いたState共有設定

プロの心得:

  • Backendの共有: `terraform.tfstate` をローカルに置くのは禁止です。S3 + DynamoDBによるStateロックは、チーム開発の「酸素」です。
  • `.tfvars` の管理: 環境ごとの変数は `prod.tfvars` などのファイルに分離し、Git管理下で変更履歴を追えるようにします。

—

5. テックリードからのメッセージ

インポート作業は「過去の自分(あるいは前任者)との対話」です。
「なぜこの設定値になっているのか?」というクラウド上の設定の意図を汲み取り、それをコードとしてドキュメント化する作業こそが、インフラエンジニアの真価です。

ツールはあくまで補助輪です。重要なのは、「クラウド上のリソースが常にコードの写し鏡である」という状態を維持し続ける規律です。

今日から、手動リソースに怯えるのはやめましょう。コマンドを叩く前に、まずは `import` ブロックを書き、計画を立てる。その「慎重かつ大胆なアプローチ」こそが、堅牢なインフラを構築する唯一の道です。

さあ、ターミナルを開いて、あなたのインフラを「コード」という名の秩序の下へ連れ戻しましょう。

タイトルとURLをコピーしました