[初心者向け]Terraformで既存リソースを取得する2つの方法

2023.12.01

こんにちは、ゲームソリューション部のsoraです。
今回は、[初心者向け]Terraformで既存リソースを取得する2つの方法ついて書いていきます。
初心者向けの内容ですが、意外と情報を探すのに苦労した話を聞いたため書いていきます。

importコマンド

importコマンドで.tfstateファイルに反映させる方法です。
まず空のリソースブロックを記載します。

resource aws_vpc vpc {
}

次に以下コマンドで対象のリソースを指定して実行します。

terraform import aws_vpc.vpc [VPC_ID]
# 別ディレクトリにある場合
terraform import [ディレクトリ名].aws_vpc.vpc [VPC_ID]

コマンドを実行すると、.tfstateファイルに既存リソースの情報が反映されているため、その情報をもとにデフォルトと差分があるパラメータを.tfファイルに記述します。

resource aws_vpc vpc {
    cidr_block = "10.x.0.0/16"
    tags = {Name = "xxxx"}
}

最後に、planを実行して差分がないことを確認します。

$ terraform plan
aws_vpc.vpc: Refreshing state... [id=vpc-xxxxxx]
No changes. Your infrastructure matches the configuration.

この方法について、インポート対象のリソースは少ない場合には良いのですが、複数インポートしたい場合には、リソースに対して1つずつ実行していく必要があるため不便です。
そのため、複数リソースのインポートをしたい場合には、次の方法がおすすめです。

importブロック

importブロックを記述して.tfstateファイルに反映させる方法です。

import {
    # リソースの識別子(今回はVPC ID)
    id = "vpc-xxxxxx"
    # インポートするリソースブロック
    to = aws_vpc.vpc
}
resource aws_vpc vpc {
    cidr_block = "10.x.0.0/16"
    tags = {Name = "xxxx"}
}

planを実行するとimportが1つ実行されることがわかります。
applyでimportを実行した後は先ほどのimportブロックは削除しても問題ありません。

$ terraform plan
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.

この方法は、importコマンドとは異なり、一度に複数のリソースをimportできるため、基本的にはこちらの方法を利用することが多いと思います。
ただし、1,2個のリソースであればimportコマンドの方が楽に感じるときもあるかもしれません。

最後に

今回は、[初心者向け]Terraformで既存リソースを取得する2つの方法を記事にしました。
どなたかの参考になると幸いです。