はじめに
terraformでLinuxやWSLを使用してインポートを実行することはあったのですが、PowerShellを使用してimportする際に詰まったので備忘録として残しておこうと思いました
前提条件
-
Windows PowerShellを使用すること
-
terraformの実行環境を設定していること
-
今回はVPCのインポートを実施するので事前にリソースを作成しておきます

※IDは検証用のため載せています。
terraform destroyを実行後、applyをすればIDが変更されるのでそのまま記載していますが自身のワークロード環境を共有する際は十分気を付けてください。 -
main.tfに下記を記載しておく
provider "aws" {
region = "{リージョン名}"
}
実践
terraform initコマンドを実行
実行後、ファイル内に下記の2つのファイルが作成されること
- .terraform
- .terraform.lock.hcl
terraformのドキュメントからVPCのimportブロックを探しterraform plan実行
今回はこのページを参照しました。
import {
to = aws_vpc.test_vpc
id = "vpc-a01106c2"
}
IDを自身のものに書き換えてterraform planコマンドを実行

下記のコマンドを実行する必要がありそうです。
terraform plan -generate-config-out=generated.tf
PowerShellでterraformをimportするためのコマンド
上記で出たエラーを解消するためには下記コマンドを実行する必要がありそうです。
terraform plan -generate-config-out generated.tf
エラーの原因は「=」でしたね。
下記のエラーは出力されましたが、「generated.tf」ファイルが作成されていれば問題ないです。
エラーの1番下の文言をGoogle翻訳すると下記のようになります。
"ipv6_netmask_length": `ipv6_ipam_pool_id,ipv6_netmask_length` のすべてを指定する必要があります
IPv6周りが悪さをしていそうですね。
では「generated.tf」をリファクタしていきましょう。
generated.tfをリファクタ
まずはコマンド実行で生成されたコードを見ていきましょう。
# __generated__ by Terraform
# Please review these resources and move them into your main configuration files.
# __generated__ by Terraform
resource "aws_vpc" "test_vpc" {
assign_generated_ipv6_cidr_block = false
cidr_block = "10.100.0.0/16"
enable_dns_hostnames = false
enable_dns_support = true
enable_network_address_usage_metrics = false
instance_tenancy = "default"
ipv4_ipam_pool_id = null
ipv4_netmask_length = null
ipv6_cidr_block = null
ipv6_cidr_block_network_border_group = null
ipv6_ipam_pool_id = null
ipv6_netmask_length = 0
region = "ap-northeast-1"
tags = {
Name = "test-vpc"
}
tags_all = {
Name = "test-vpc"
}
}
コメントアウトされているものや、デフォルトがnullのものは必要なさそうなので一旦削除してしまいます。
resource "aws_vpc" "test_vpc" {
cidr_block = "10.100.0.0/16"
enable_dns_hostnames = false
enable_dns_support = true
enable_network_address_usage_metrics = false
region = "ap-northeast-1"
tags = {
Name = "test-vpc"
}
}
こんな感じになりました。
このファイルはもう必要ないのでリファクタしたものはmain.tfに転記しgenerated.tfは削除してしまいましょう。
terraform planを再実行
ソースコードはこんな感じになっています。
main.tf
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_vpc" "test_vpc" {
cidr_block = "10.100.0.0/16"
enable_dns_hostnames = false
enable_dns_support = true
enable_network_address_usage_metrics = false
region = "ap-northeast-1"
tags = {
Name = "test-vpc"
}
}
import {
to = aws_vpc.test_vpc
id = "vpc-03dad4f0931c80148"
}
ではterraform planコマンドを実行していきましょう。

importの出力が出て、createやdestroyが存在しません。
正しくリソースをimport出来そうですね。
terraform applyを実行
最後にapplyを実行していきましょう。

planと同様の結果が表示され問題ないことを確認されます。
問題なければ「yes」と入力してimportが完了します。

後始末
完了後はimportブロックが不要になります。
再度取り込みしようとしてエラーになったり不便なので削除しておきます。
terraform destroyコマンドを実行すれば環境の削除、再度使用したい場合はapplyを実行すれば環境を構築出来て便利ですので利用してみてください。
※EC2、RDSなどのデータは保持されないので実際のワークロード環境でdestroyを使用する際は十分に注意して自己責任でお願いいたします。
まとめ
今回はVPCを取り込みましたが、その他のリソースも同様の手順で取り込んでいくことが可能です。
main.tfに記載する形で実行しましたが、terraformはリソースが増えたりワークロードの環境を使用する際はモジュールを使用するのもいいですね。
terraformは奥が深く面白いですが、難しく感じていた方も多いと思います。
この記事を通じて実際に手を動かしてみる方が増えたらうれしく思います。

