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章のリファクタリングは重要な操作なので再確認が必要.
実践Terraform AWSにおけるシステム設計とベストプラクティス (技術の泉シリーズ(NextPublishing))
- 作者:野村 友規
- 発売日: 2019/09/20
- メディア: オンデマンド (ペーパーバック)