出力を入力へ

プログラミングに関する自分が考えた事を中心にまとめます

Terraformでリソースをインポートしたり削除したり

TerraformでTerraform管理外の既存のリソースを管理下に入れる方法と外す方法. 管理下に入れるコマンドが import なら管理から外すのは export だろ,と思ったけどそんなコマンドはなかった.

リソースをインポートする

まずはインポートする方法から. Terraform importコマンドを利用することでリソースをTerraformの管理下に置く.

実行コマンドは terraform import [options] ADDRESS ID の書式の通り. ADDRESSは Resource Adressingにある通りで, tfファイルでリソースを指定するときに利用する書式. aws_s3_bucket.my_bucket_name とかそういうやつ.

IDはTerraformのドキュメントに記載されたIDで,リソースドキュメントの最後に記載されている. 例えばS3ならS3 bucketリソースに記載の通りバケット名. EC2インスタンスならインスタンスリソースに記載の通りインスタンスID.

このIDがリソースによってフォーマットが大きく異なり,基本的には上記の通りリソース名だが, SQSのようにIDがURLだと https://queue.amazonaws.com/80398EXAMPLE/MyQueue のように記載したり, ECSタスク定義のようにIDが存在しないとARNとして arn:aws:ecs:us-east-1:012345678910:task-definition/mytaskfamily:123 のように記載したりと たまに例外があるので注意が必要.

$ AWS_DEFAULT_REGION=ap-northeast-1 terraform import aws_s3_bucket.sample sample-bucket-name
aws_s3_bucket.sample: Importing from ID "sample-bucket-name"...
aws_s3_bucket.sample: Import prepared!
  Prepared aws_s3_bucket for import
  Prepared aws_s3_bucket_policy for import
aws_s3_bucket_policy.sample: Refreshing state... [id=sample-bucket-name]
aws_s3_bucket.sample: Refreshing state... [id=sample-bucket-name]

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.

リソースを除外する

importを取り消したいときなどの逆操作について. この操作がないと既存リソースを一度削除する必要が出てくるので リソースを除外するコマンドがないわけないだろうと思ったが Terraform Command一覧を見てもそれらしいものが無いので困っていた.

結論としては terraform state rm サブコマンドが目的の Terraformの管理下から除外するコマンドだった. サブコマンドが存在するのは terraform state コマンドと terraform workspace コマンドだけで,これに注意する必要があった.

実行コマンドは terraform state rm [options] ADDRESS... の書式通り.

$ AWS_DEFAULT_REGION=ap-northeast-1 terraform state rm aws_s3_bucket.sample
Removed aws_s3_bucket.sample
Successfully removed 1 resource instance(s).

Terraform backendがTerraform Cloudのような外部管理であってもリソースの追加/削除は可能なので いろんなところで利用することになりそう.

そして再度確認したら,きちんと 実践Terraformに記載されていた. あらためて見ると24章のリファクタリングは重要な操作なので再確認が必要.