Terraform Cloudで横着しすぎはよくない... ローカル環境からstate mvする方法
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インストール
tfenvをインストールします。
しなくてもいいですが、バージョン管理できたほうが楽なのでtfenvを使っています。
terraformインストール
tfenvを使って、使用を想定しているバージョンのterraformをインストールします。
tfenv install 1.9.3
tfenv use 1.9.3
terraform login
terraform login
コマンドでログインをします。
指示に従って、操作していくとTerraform Cloud上にtokenが発行され、そのtokenでログインをすることができます。
cloudブロックの設定
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に移動ができていることが確認できました。
まとめ
まだ稼働していない環境であれば正直、一度環境を破壊して作り直したほうが早いかもしれませんね。
稼働後の環境や、再作成をするべきでない場面に遭遇した場合はこの手法を使っていきたいと思います。
Discussion