はじめに
以前、業務でterraform import
コマンドを利用してAWSの既存インフラストラクチャをimportする機会があったので、知識定着のためにも記事にしてみたいと思います。
terraform import
とは?
既存のインフラストラクチャをTerraformの管理下に置くためのコマンドになります。
AWS上で変更した内容をTerraform上にも反映させる時に使用します。
前提
今回は事前に作成したこちらのTerraformのコードを利用しております。
こちらの記事でご紹介しているコードと同様のものになります。
Terraformのバージョン情報は、以下になります。
% terraform --version
Terraform v1.1.8
on darwin_amd64
+ provider registry.terraform.io/hashicorp/aws v4.22.0
Your version of Terraform is out of date! The latest version
is 1.2.5. You can update by downloading from https://www.terraform.io/downloads.html
%
terraform import
するための手順
今回は、試験用にAWSにS3を作成してimportしてみたいと思います。
①S3の作成
AWSに手動で以下の設定のS3を作成しておきます。
※S3の作成方法や説明については割愛とさせて頂きます。
設定項目 | 内容 | 備考 |
---|---|---|
BucketName | testbucket0717 | 設定 |
AWS Region | ap-northeast-1 | デフォルト |
Object Ownership | ACLs disabled | デフォルト |
Block Public Access settings for this bucket | Block all public access | デフォルト |
Bucket Versioning | Disabled | デフォルト |
Tags | Key:Name Value:testbucket |
設定 |
Default encryption | Disable | デフォルト |
②s3.tf
の作成
作業ディレクトリ(ec2_create_code)直下に以下の内容でs3.tf
ファイルを作成します。
※この時点では、内容は空にしておきます。
# ----------------------------------
# S3
# ----------------------------------
resource "aws_s3_bucket" "s3" {
}
③terraform import
の実行
以下のコマンドを実行します。
terraform import aws_s3_bucket.s3 バケット名
Import successful!
が出力されたら問題なし。
% terraform import aws_s3_bucket.s3 testbucket0717
aws_s3_bucket.s3: Importing from ID "testbucket0717"...
aws_s3_bucket.s3: Import prepared!
Prepared aws_s3_bucket for import
aws_s3_bucket.s3: Refreshing state... [id=testbucket0717]
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
が作成されます。
※terraform.tfstate
は、管理対象のインフラストラクチャと構成に関する状態を保存するためのファイルになります。
{
"version": 4,
"terraform_version": "1.1.8",
"serial": 70,
"lineage": "*****************************",
"outputs": {},
"resources": [
{
"mode": "managed",
"type": "aws_s3_bucket",
"name": "s3",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"acceleration_status": "",
"acl": null,
"arn": "arn:aws:s3:::testbucket0717",
"bucket": "testbucket0717",
"bucket_domain_name": "testbucket0717.s3.amazonaws.com",
"bucket_prefix": null,
③terraform plan
の実行
terraform plan
を実行し、importされた内容が反映されていることを確認します。
※こちらのコマンドは、リソースに変更を加える前の確認で使用するコマンドであるため、何度実行しても問題ありません。
# aws_s3_bucket.s3 will be updated in-place
~ resource "aws_s3_bucket" "s3" {
+ force_destroy = false
id = "testbucket0717"
~ tags = {
- "Name" = "testbucket" -> null
}
~ tags_all = {
- "Name" = "testbucket"
} -> (known after apply)
# (8 unchanged attributes hidden)
# (2 unchanged blocks hidden)
}
s3.tf
ファイルについては変更されていないため、このまま apply を実行するとリソースが削除されてしまいます。
terraform import
を実行しても、tfファイル自体は変更されません。
④s3.tf
の修正
terraform.tfstate
を確認しながら、s3.tf
を修正する。
# ----------------------------------
# S3
# ----------------------------------
resource "aws_s3_bucket" "s3" {
bucket = "testbucket0717"
tags = {
Name = "testbucket"
}
tags_all = {
Name = "testbucket"
}
}
⑤再度、terraform plan
の実行
再度、terraform plan
を実行し、変更箇所が存在しないことを確認。
実行結果でNo changes
が表示されていたら問題ありません。
No changes. Your infrastructure matches the configuration.
参考