Closed10

【Terraform】リソース名を変更する

not75743not75743

題材

これをapply

main.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.65.0"
    }
  }
  backend "s3" {
    bucket = "<s3バケット>"
    key    = "<tfstateパス>"
    region = "ap-northeast-1"
  }
}

provider "aws" {
  region = "ap-northeast-1"
  default_tags {
    tags = {
      env       = "test"
      provision = "terraform"
    }
  }
}

resource "aws_s3_bucket" "s3" {
}
not75743not75743

方針

  • tfファイルでリソースをリネーム
  • tfstateをs3からpull
  • mvでtfstate編集
  • diffでtfstateが編集されていることを確認
  • tfstateをs3へpush
not75743not75743

リネーム

変えます

main.tf
- resource "aws_s3_bucket" "s3" {
+ resource "aws_s3_bucket" "s3-renamed" { 
}
not75743not75743

s3からtfstateをpull

もってきます。
terraform state pullは標準出力に出力するため、ローカルファイルへリダイレクトしましょう。

$ terraform state pull > terraform.tfstate

この後のmvでtfstateが必要であるため、このように持ってくる必要があります。
エラーの様子

$ terraform state mv -state=terraform.tfstate aws_s3_bucket.s3 aws_s3_bucket.s3-renamed
No state file was found!

State management commands require a state file. Run this command
in a directory where Terraform has been run or use the -state flag
to point the command to a specific state location.
not75743not75743

state mvする

ドキュメントにサンプルがあります。
tfstateにリソース名が記録されているから、それを書き換えてリソース名を変更しよう!
のイメージです
https://developer.hashicorp.com/terraform/cli/commands/state/mv#example-rename-a-resource

変更前

$ terraform state list
aws_s3_bucket.s3

変更

$ terraform state mv -state=terraform.tfstate aws_s3_bucket.s3 aws_s3_bucket.s3-renamed
Move "aws_s3_bucket.s3" to "aws_s3_bucket.s3-renamed"
Successfully moved 1 object(s).

バックアップが出来るので、diffで見てみます。

$ diff terraform.tfstate terraform.tfstate.1687059891.backup 
4c4
<   "serial": 2,
---
>   "serial": 1,
11c11
<       "name": "s3-renamed",
---
>       "name": "s3",

terraform.tfstateが更新されています。
serialとnameが変わっているためOKそうですね。

not75743not75743

s3からtfstateをpush

さきほどの逆です

$ terraform state push terraform.tfstate
not75743not75743

動作確認

planしても変更がでないこと

$ terraform plan
aws_s3_bucket.s3-renamed: Refreshing state... [id=terraform-xxxxxxxxxxxxxxxxxxxxxxxxxxx]

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.

リソース名を確認して変更後の値になること

$ terraform state list
aws_s3_bucket.s3-renamed
このスクラップは2023/06/18にクローズされました