Terraformのリソース名を変更する

2020年12月6日

Terraform

Terraform でリソースを作成した後に、名前を変更する方法を紹介します。たとえば、以下のように foo という名前のリソースを bar に変更するようなケースです。

resource "aws_s3_bucket" "foo" {
  bucket = "my-bucket"
}

resource "aws_s3_bucket" "bar" {
  bucket = "my-bucket"
}

Terraform のバージョンは v0.12.29 です。

目次

  1. 検証用の環境を作る
  2. ソースコードのリソース名を変更する
  3. terraform state mv コマンド
  4. モジュールの中のリソース名の変更も同じ手順で

検証用の環境を作る

以下のようにディレクトリと 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 です。

-技術ブログ
-