terraform import
コマンドを実行するとクラウド環境のリソースをterraformで管理できるようになります。
試しにAWSで下記のS3バケットを作成します。
次にimport用のコードを記述します。
config.tfは基本的な設定で、importするリソースについてのコードはS3.tfに記述しています。
# config.tf
terraform {
required_version = "~> 1.1"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.5"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
# S3.tf
resource "aws_s3_bucket" "tf-bucket-20220403-1" {
}
下記のようにimportコマンドを実行します。
$ # フォーマット
$ terraform import aws_s3_bucket.bucket bucket-name
$ # 実行例
$ terraform import aws_s3_bucket.tf-bucket-20220403-1 tf-bucket-20220403-1
aws_s3_bucket.tf-bucket-20220403-1: Import prepared!
Prepared aws_s3_bucket for import
Import successful!
importの後にterraform plan
を実行すると、terraform.tfstateファイルにリソース情報が記録されたことを確認できます。(tagsの"Name" = "tf-bucket1"
は最初のマネージメントコンソールで設定しています。)
$ terraform plan
Terraform used the selected providers to generate the following execution plan. Resource actions
are indicated with the following symbols:
~ update in-place
Terraform will perform the following actions:
# aws_s3_bucket.tf-bucket-20220403-1 will be updated in-place
~ resource "aws_s3_bucket" "tf-bucket-20220403-1" {
+ acl = "private"
+ force_destroy = false
id = "tf-bucket-20220403-1"
~ tags = {
- "Name" = "tf-bucket1" -> null
}
~ tags_all = {
- "Name" = "tf-bucket1"
} -> (known after apply)
# (8 unchanged attributes hidden)
# (1 unchanged block hidden)
}
ただ、importはあくまでクラウド環境のリソースをterraform管理下にするだけなので、この状態でterraform apply
を実行するとS3.tfファイルの内容でリソースの設定が更新されます。
つまり、クラウド環境の設定は下記の設定で上書きされます。
# S3.tf
resource "aws_s3_bucket" "tf-bucket-20220403-1" {
}
上書きしないようにするには更新されたterraform.tfstateファイルを参考にパラメータを設定する必要があります。
設定完了後、terraform plan
を実行し、差分が表示されなければクラウド環境とs3.tfの内容が同期できたということになります。