Terraform でリソースを作成した後に、名前を変更する方法を紹介します。たとえば、以下のように foo
という名前のリソースを bar
に変更するようなケースです。
resource "aws_s3_bucket" "foo" {
bucket = "my-bucket"
}
↓
resource "aws_s3_bucket" "bar" {
bucket = "my-bucket"
}
Terraform のバージョンは v0.12.29 です。
目次
検証用の環境を作る
以下のようにディレクトリと main.tf ファイルを作成します。
tf-state-mv-example
└── main.tf
main.tf
に以下のコードを記述します。
resource "null_resource" "foo" {}
ディレクトリの中に移動し terraform init
, terraform apply
してリソースを作成します。
null_resource
は何もしない特殊なリソースです。何もしませんが、通常のリソースと同じように扱われるため、安全にリソース名の変更を試すことができます。詳細は Provisioners Without a Resource - Terraform by HashiCorp を参照。
ソースコードのリソース名を変更する
リソース名を foo
から bar
に変更します。
resource "null_resource" "bar" {}
terraform plan
コマンドを実行します。
Terraform will perform the following actions:
# null_resource.bar will be created
+ resource "null_resource" "bar" {
+ id = (known after apply)
}
# null_resource.foo will be destroyed
- resource "null_resource" "foo" {
- id = "8322265297772811103" -> null
}
Plan: 1 to add, 0 to change, 1 to destroy.
リソースを削除・再作成が予定されました。Terraform は、リソース名を変更したときはリソースの再作成を行います。冒頭の例のように、S3 などデータを持ったリソースは再作成されては困ることがあります。このような時は terraform state mv
コマンドを使います。
terraform state mv コマンド
terraform state list
コマンドでリソース名を表示します。
null_resource.foo
terraform state mv
コマンドでリソース名を変更します。コマンドの詳細は Command: state mv - Terraform by HashiCorp を参照
terraform state mv null_resource.foo null_resource.bar
リソース名が変更されました。
Move "null_resource.foo" to "null_resource.bar"
Successfully moved 1 object(s).
terraform state list
コマンドで変更後のリソース名を確認します。null_resource.bar
に変更されていることが確認できます。
null_resource.bar
もう一度 terraform plan
コマンドを実行します。
null_resource.bar: Refreshing state... [id=8322265297772811103]
------------------------------------------------------------------------
No changes. Infrastructure is up-to-date.
plan の差分がなくなり、リソース名を変更することができました。
モジュールの中のリソース名の変更も同じ手順で
モジュールの中にあるリソース名の変更も同じように terraform state list
コマンドでリソース名を確認し、terraform state mv
コマンドを実行すれば OK です。