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

Terraform Importの深淵:手動リソースを「コードの支配下」に屈服させる極意

インフラエンジニアのキャリアにおいて、避けて通れない「罪」がある。それが「コンソールでの手動構築」だ。
プロジェクトが急拡大し、技術的負債が山積する中で、誰かが深夜にポチポチと作成したAWSリソースが、今もあなたの監視をすり抜け、ドリフト(乖離)を起こしているのではないか?

今日は、Terraformの`import`コマンドを単なる作業として終わらせるのではなく、「既存インフラを宣言的コードの完全支配下に置き、二度とドリフトを許さないためのエンジニアリング」について語る。

—

1. importは「コマンド」ではなく「儀式」である

多くのエンジニアが犯す最大の過ちは、`terraform import`を打った直後に「終わった」と勘違いすることだ。
`import`は単にAWS上のリソースをTerraformの状態ファイル(`terraform.tfstate`)に紐付けるだけの「接続作業」に過ぎない。重要なのは、その後に続く「コードとの整合性検証」である。

極限のワークフロー:失敗しないための鉄則

1. Stateの隔離とバックアップ: 事故は常に起きる。`tfstate`のバックアップは必須。
2. 型定義の先行記述: コード側にHCL(HashiCorp Configuration Language)を書き、その型がリソースと一致しているか確認する。
3. `terraform plan`による執念の突き合わせ: コードと実際のリソースの差分がゼロになるまで、コードを修正し続ける。

—

2. 大規模環境での自動化ハック:`terracognita`と`terraformer`の境界線

数千のリソースを手動でインポートするなど正気の沙汰ではない。ここで、我々のような上級エンジニアはツールを「使い分ける」。

  • `terraformer` (Google): AWSの既存環境をコードに落とし込む際の最強の相棒。ただし、出力されるHCLは往々にして人間が読めないコードの墓場になる。
  • 戦略的アプローチ:

1. `terraformer`で全体構造を自動生成する。
2. 生成されたコードをモジュール化し、責務を分離する(ネットワーク、IAM、計算資源など)。
3. ここが重要: 全てをインポートせず、「変更頻度の高いリソース」だけを厳選して管理下に置く。

—

3. 完全自動化の解:独自スクリプトによる「インポート・パイプライン」

複雑な依存関係を持つリソース(例:RDSとセキュリティグループの複雑な絡み合い)をインポートする場合、CLIの叩き込みでは限界がある。私は以下のPythonスクリプトによるラッパーを推奨する。

import subprocess
import json

TerraformのPlanをJSONで解析し、ドリフトを検知する独自ロジック
def verify_drift(resource_address):
cmd = [“terraform”, “plan”, “-json”]
result = subprocess.run(cmd, capture_output=True, text=True)
# JSON出力を解析し、意図しない変更が含まれていないかチェックする
plan_data = json.loads(result.stdout)
# ここに独自のCI/CD検証ロジックを注入する
print(f”Verifying {resource_address}…”)

インポートの自動化実行
def perform_import(resource_type, resource_name, resource_id):
address = f”{resource_type}.{resource_name}”
cmd = [“terraform”, “import”, address, resource_id]
subprocess.run(cmd, check=True)
print(f”Successfully imported: {address}”)

実行例:一度の実行で関連リソースを連鎖的にインポートし、検証まで行う
if __name__ == “__main__”:
perform_import(“aws_s3_bucket”, “my_app_bucket”, “my-unique-bucket-name”)

—

4. パフォーマンスと内部アーキテクチャの最適化

インポート作業において、メモリ消費が問題になるほどの巨大な`tfstate`ファイルを抱えている場合、`terraform state mv`を使ってStateファイルを分割することをお勧めする。

  • State分割の極意:
  • `terraform state rm`で不要なリソースを切り離し、新しい`terraform.tfstate`へ移動させる。
  • これにより、`terraform plan`の計算量(メモリ消費)を劇的に削減でき、CI/CDパイプラインの高速化が可能になる。
  • 設計哲学: 巨大なモノリスなStateファイルは「悪」である。ドメインごとにStateを分割せよ。

—

5. 最後に:インフラの「真の管理」とは

`terraform import`が完了した瞬間、そのリソースはあなたの「所有物」となる。
一度管理下に入れたら、二度とコンソールから手動で変更させてはならない。私はチームに対し、以下のポリシーを徹底させている。

  • IAMポリシーの制限: 開発者のAWSコンソールへの書き込み権限を剥奪する。
  • ドリフト検知の自動化: 1時間に1回、`terraform plan`を回し、差分が出た瞬間にSlackへアラートを飛ばす(もちろん、修正はコード経由で行う)。

インフラ管理とは、単なるツールの操作ではない。「システムの状態をコードとして定義し、その定義が現実を強制的に支配する」という思想の実践である。

あなたがインポートするそのリソースは、単なるAWSのオブジェクトではない。あなたのコードという「論理」によって、物理的な世界の混沌を鎮圧するための第一歩なのだ。
さあ、コンソールを閉じ、`main.tf`を開こう。エンジニアリングの真髄は、そこにある。

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