Terraform Importとは?コマンドとブロックの使い方について

Terraform × Import Terraform

Terraform Importを使うと、Terraformで管理していない既存のクラウドリソースをTerraformの管理下に置くことができます

Terraform Importには主に2つの方法があります。

  • import コマンドを使う方法
  • import ブロックを記述する方法

本記事では、Terraformの管理外にあるリソースを、Terraform配下に取り込むTerraform Importについて紹介します。

Terraform importとは

Terraform Importとは、すでに存在しているクラウドインフラのリソース(例:AWSのEC2インスタンスやIAMユーザーなど)を、Terraformで管理可能な状態にする機能です。

例えば、AWSのマネジメントコンソールやAWS CLIで作成されたリソースは、Terraformでは管理されていないため、コードで修正・削除ができません。

Terraform Importを使うことで、これらのリソースをTerraformの状態ファイル(terraform.tfstate)に取り込むことができ、以降はTerraformを使って管理・運用ができます。

Terraform Importの方法は主に以下の2つです。

  • importコマンドを使う方法
  • importブロックを使う方法(Terraform 1.5以降で利用可能)

公式ドキュメントはこちらです:

Import existing infrastructure resources | Terraform | HashiCorp Developer
Terraform lets you import existing infrastructure into state so that you can begin managing your infrastructure as code.

Terraform Importコマンドについて

terraform import コマンドは、既存のリソースをTerraformの状態ファイル(terraform.tfstate)に登録します。
この機能により、Terraformで管理していなかったリソースを、Terraform管理下に取り込むことができます。

ただし、Terraform構成ファイル(.tfファイル)には自動で何も追加されません
そのため、インポート対象に対応する resource ブロックを、事前に自分で正確に記述しておく必要があります

さらに、Terraformはインポートされたリソースの構成内容(属性や設定)をHCL形式で自動出力する機能を持っていません
そのため、AWS CLIやマネジメントコンソールを使って既存リソースの設定内容を確認し、Terraform構文に変換して .tf ファイルに記述する作業が求められます。

Terraform Importブロックについて

Terraform 1.5から導入された import ブロックを使う方法では、インポートの宣言をコードに記述できます。

コードベースでインポートを管理できるため、可読性が高く、チームでのレビューやCI/CDへの統合もしやすくなります。

また、terraform plan の中で、インポート対象が明示的に表示されるため、どのリソースを取り込むか明確になります。

import ブロックは、モダンなTerraformの運用においておすすめの方法です。

ここからはterraform-dev-userを例にimportコマンド/importブロックの使い方について紹介します。

Terraform importコマンドの実行

terraform import コマンドを使う場合、まず対象のresourceブロックを .tf ファイルに記述します。
たとえば、IAMユーザーを取り込む場合は以下のように書きます。

# terraform-dev-userのimport
resource "aws_iam_user" "terraform_dev_user" {
  name = "terraform-dev-user"
}

追加した状態で以下のコマンドを実行します。

% terraform import aws_iam_user.terraform_dev_user terraform-dev-user
aws_iam_user.terraform_dev_user: Importing from ID "terraform-dev-user"...
aws_iam_user.terraform_dev_user: Import prepared!
  Prepared aws_iam_user for import
aws_iam_user.terraform_dev_user: Refreshing state... [id=terraform-dev-user]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.

成功すると、terraform.tfstate にIAMユーザーの情報が取り込まれたことが確認できます。

tfstateファイルにterraform-dev-userが取り込まれている|クリックすると拡大します

その後 terraform plan を実行すると、差分がないこと(=リソースが一致していること)が分かります。

terraform planを実行すると差分がないことが分かる|クリックすると拡大します

Terraform importコマンドのメリット/デメリット

メリット

  • Terraform構成ファイルさえ用意すれば、即座に既存リソースを状態ファイルに取り込める
  • Terraform v1.0以前から利用可能で、幅広いバージョンで使える
  • 小規模なリソースや検証環境など、スピーディに取り込みたいときに便利

デメリット

  • 構成ファイル(HCL)を自動生成してくれないため、手動で正確に記述する必要がある
  • 既存リソースの属性を確認しながら書く作業が煩雑で、ミスの原因になりやすい
  • インポート操作が .tf ファイル上に残らないため、再現性や可読性に乏しい(チーム運用には不向き)

Terraform importブロックの実行

import ブロックを使用するには、次のように .tf ファイルに import を記述します。

# terraform-dev-userのimport
import {
  to = aws_iam_user.terraform_dev_user
  id = "terraform-dev-user"
}

resource "aws_iam_user" "terraform_dev_user" {
  name = "terraform-dev-user"
}

その後、terraform plan を実行すると、次のようなメッセージが表示されます。

Terraform will perform the following actions:

  # aws_iam_user.terraform_dev_user will be imported
    resource "aws_iam_user" "terraform_dev_user" {
        arn                  = "arn:aws:iam::xxxxxxxxxx:user/terraform-dev-user"
        id                   = "terraform-dev-user"
        name                 = "terraform-dev-user"
        path                 = "/"
        permissions_boundary = null
        tags                 = {}
        tags_all             = {}
        unique_id            = "AIDASE5KRLPEOF7RLZD7Y"
    }

Plan: 1 to import, 0 to add, 0 to change, 0 to destroy.
terraform planの結果「1 to import」と表示される|クリックすると拡大します

このように、コード上でインポートが明示されるため、変更管理がしやすいのが特徴です。

Terraform importブロックのメリット/デメリット

メリット

  • コードベースでインポートできるため、管理・再現性が高い
  • CI/CDに組み込む運用がしやすい
  • terraform plan でインポート内容が確認できる

デメリット

  • Terraform 1.5以降でのみ使用可能
  • すべてのリソースに対して直感的とは限らず、事前に構成を理解しておく必要がある

まとめ

Terraform Importは、Terraform管理外のリソースを管理下に取り込む非常に有用な手段です。

従来の import コマンドに加え、Terraform 1.5以降では import ブロックを活用することで、より柔軟かつチーム開発に適した形で運用ができます。

既存のインフラをコードで一元管理したい場合、Terraform Importを活用して、段階的にインフラをIaC(Infrastructure as Code)化していきましょう。