🌟

Terraform Cloudで横着しすぎはよくない... ローカル環境からstate mvする方法

2024/07/31に公開

Terraform Cloudを使って、リソースを管理するときにリファクタしたくなることありますよね。

でもTerraform Cloudでばっかり操作していて、いざリファクタをしたくなったときにローカル環境でTerraform Cloud上のリソースを操作することも必要になります。

今回はTerraform Cloud上のtfstateをローカル環境から操作する方法をまとめたいと思います。

具体的にはterraform state mvを使って、resourceをmoduleに移します。

公式ではこちらで紹介されています。

手順

当方Macを使用しています。

Execution Mode を Local に変更

Terraform Cloud上のワークスペースのGeneral SettingsにExecution Modeという項目があるのでLocalに変更します。

tfenvインストール

https://formulae.brew.sh/formula/tfenv
tfenvをインストールします。

しなくてもいいですが、バージョン管理できたほうが楽なのでtfenvを使っています。

terraformインストール

tfenvを使って、使用を想定しているバージョンのterraformをインストールします。

tfenv install 1.9.3
tfenv use 1.9.3

terraform login

terraform loginコマンドでログインをします。

指示に従って、操作していくとTerraform Cloud上にtokenが発行され、そのtokenでログインをすることができます。

cloudブロックの設定

https://developer.hashicorp.com/terraform/cli/cloud/settings#the-cloud-block

Terraform CLIでTerraform Cloudの情報を読み書きするにはcloudブロックの設定が必要です。

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }

  cloud { # これ!
    organization = "organization_name"

    workspaces {
      project = "workspace_name"
      name    = "workspace_name"
    }
  }
}

ちなみに設定値はハードコードしないと怒られます。

Initializing modules...
╷
│ Error: Variables not allowed
│ 
│   on main.tf line 13, in terraform:
│   13:     organization = local.organization_name
│ 
│ Variables may not be used here.

terraform init

terraformを使用する上での初期設定をします。

terraform init

ここまで設定ができていればterraform state listでtfstateにあるリソースを一覧で確認することができます。

$ terraform state list
aws_iam_role.example

ちなみにcloudブロックの設定をしないでstateを確認しようとすると

$ terraform state list
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.

stateのファイルがないよ!と怒られます。

terraform state mv

terraform state mvを使って、リソースをモジュールに移動していきます。

terraform state mv aws_iam_role.example module.example_module.aws_iam_role.example

問題なく移動ができていれば Successfully moved と表示されます。

$ terraform state mv aws_iam_role.example module.example_module.aws_iam_role.example
Move "aws_iam_role.example" to "module.example_module.aws_iam_role.example"
Successfully moved 1 object(s).

stateを確認してみます。

$ terraform state list
module.example_module.aws_iam_role.example

moduleに移動ができていることが確認できました。

まとめ

まだ稼働していない環境であれば正直、一度環境を破壊して作り直したほうが早いかもしれませんね。

稼働後の環境や、再作成をするべきでない場面に遭遇した場合はこの手法を使っていきたいと思います。

SMARTCAMP Engineer Blog

Discussion