導入: なぜTerraform importが重要なのか
インフラ運用において、「とりあえずAWSコンソールから手動で作成したリソース」は、後にIaC(Infrastructure as Code)化する際の大きな障壁となります。手動構築されたリソースは、Terraformの管理外であるため、コードを変更しても反映されず、構成ドリフト(乖離)の原因になります。Terraform importは、この「野良リソース」をコードと紐付け、Terraformの管理下へ安全に取り込むための必須スキルです。これを使うことで、既存のレガシー環境を破壊することなく、段階的にIaC化を進めることが可能になります。
基礎知識: tfstateとインポートの仕組み
Terraformは、管理対象のリソース情報を「tfstateファイル」というJSON形式のファイルで保持しています。Terraform importは、このtfstateに「既存リソースの識別子(IDなど)」を書き込み、Terraformがそのリソースを認識できるようにするコマンドです。
重要なのは、importを実行するだけではコード(.tfファイル)は自動生成されない点です。Terraformがリソースを認識できるようになるだけで、設定ファイル自体は手動で記述する必要があります。
実装/解決策: インポートのステップ
1. リソースに対応する空のブロック(resourceブロック)を.tfファイルに記述します。
2. terraform importコマンドを実行し、tfstateとリソースを紐付けます。
3. terraform planを実行し、差分を確認しながら、.tfファイルの記述を実際のパラメータと一致させます。
サンプルプログラム: S3バケットをインポートする手順
以下の例では、既に存在するS3バケットをTerraformで管理するコード例を示します。
resource “aws_s3_bucket” “my_bucket” {
# この時点では中身は空で構いません
}
resource “aws_s3_bucket” “my_bucket” {
# 実際のバケット名と一致させます
bucket = “example-bucket-name”
# 実際の設定に合わせて追記します
tags = {
Environment = “Production”
}
}
応用・注意点: 現場での落とし穴
インポート作業で最も多いミスは、「terraform planの結果を見て驚くこと」です。インポート直後の状態は、tfstateには情報が登録されていますが、コードと実際のパラメータが完全一致していないことがほとんどです。そのため、いきなりapplyをするのではなく、planコマンドを繰り返し実行し、差分がなくなるまでコードを修正するサイクルを徹底してください。
また、最新のTerraformでは「importブロック」をコード内に記述することで、コマンドを実行せずに宣言的にインポートすることも可能です。大規模なインフラ移行を行う際は、この機能を利用して計画的に進めることを推奨します。手作業による「状態の不整合」を減らし、安全なIaC化を目指しましょう。

コメント