terraform import ブロックの使い方

概要

terraform v1.5.0以降からimportをCLIで実行するのではなく、宣言的に実行することが可能になりました。
本記事ではその使い方を記載します。

使い方

まず、インポートで使うファイルを用意する。importブロックは後で不要になるので、一時的なファイルを用意すると良いかもです。
たとえば import.tf を用意して、下記に必要な項目を記載します。
下記例ではRoute53のZONEについての記載です。

import {
  to = aws_route53_zone.kazuma_tokyo
  id = "(ここにZONEIDを記載)"
}

次に下記コマンドを実行することで、コードを出力します。ただし、すでにあるファイルに追記ができないのでファイル名は一時的なものにしておくと良いかもです。

$ terraform plan -generate-config-out=kazuma_tokyo_import_1.tf

出力されるコードは必ずしも完璧じゃないことがあるので、terraform plan を実行して確認しつつ、必要に応じて不要なブロックは削除して修正します。
問題がなくなると、terraform planを実行すると差分がなくなり、下記のようになります。

  # aws_route53_zone.kazuma_tokyo will be imported
    resource "aws_route53_zone" "kazuma_tokyo" {
        arn                 = "arn:aws:route53:::hostedzone/XXXXXXXX"
        comment             = "DNS"
        id                  = "XXXXXXXX"
        name                = "kazuma.tokyo"
        name_servers        = [
            "ns-2.awsdns-00.com.",
            "ns-102.awsdns-00.org.",
            "ns-153.awsdns-00.co.uk.",
            "ns-1112.awsdns-00.net.",
        ]
        primary_name_server = "ns-2.awsdns-00.com."

        zone_id             = "XXXXXXXXXX"

        vpc {
            vpc_id     = "vpc-123456"
            vpc_region = "ap-northeast-1"
        }
    }

Plan: 1 to import, 0 to add, 0 to change, 0 to destroy.

terraform apply を実行。
うまくいけばかきのようになります。

Apply complete! Resources: 1 imported, 0 added, 0 changed, 0 destroyed.

使ってみて思ったこと

CLIで実行するのとどれだけ違うのかというと、コードを生成してくれるのはやはり便利です。
完璧ではないものの、必要な項目をChatGPTとかで整形して、それをまとめてimportブロックに書けば、必要なコードを全て生成してくれるので一個一個やらなくてよくなります。
インポートしないといけないリソースが大量にある場合は使ってみると便利です。