Workspaceを利用しているTerraformでstateファイルを管理するS3バケットのキーを変更する
概要
下記の設定で運用しているTerraformのWorkspaceの利用をやめる対応しました。
- Workspaceを利用
- BackendにはS3を指定
その際に、 stateファイルを管理するS3バケットのキーの変更を行なったのですが、手順が複雑だったのでその対応をメモとして残します。
バケットのキーの変更内容は、下記の通りです。
Workspace を利用するとデフォルトで設定される Workspace_key_prefix /env: を削除した構成に変更
変更前 : s3_bucket/env:/stg/sample/terraform.tfstate
変更後 : s3_bucket/stg/sample/terraform.tfstate
変更に失敗した手順
Workspaceを利用した状態で下記のようにS3のkeyのみ変更した場合、 Workspaceが有効になっているのでs3_bucket/env:/stg/stg/sample/terraform.tfstate
に作成されてしまいました。
terraform {
required_version = "=0.14.6"
backend "s3" {
bucket = "s3_buckete"
- key = "sample/terraform.tfstate"
+ key = "stg/sample/terraform.tfstate"
region = "ap-northeast-1"
}
}
手順
ざっくりと流れを説明すると、S3バケットのstateファイルをローカルに持ってきて、新しいkeyでS3にstateファイルを新規作成します。
前提条件
Workspaceにstg
を利用している。
terraform init
を実行し、Workspaceにはstg
が選択された状態であること。
1. S3のstateファイルを取得する
下記のように、Backendの設定をしていると思います。
terraform {
required_version = "=0.14.6"
backend "s3" {
bucket = "s3_buckete"
key = "sample/terraform.tfstate"
region = "ap-northeast-1"
}
}
この部分をコメントアウトして、下記のコマンドを実行します。
terraform init
下記のメッセージが表示されるので yes
を入力します。
Initializing the backend...
Terraform has detected you're unconfiguring your previously set "s3" backend.
Do you want to migrate all Workspaces to "local"?
Both the existing "s3" backend and the newly configured "local" backend
support Workspaces. When migrating between backends, Terraform will copy
all Workspaces (with the same names). THIS WILL OVERWRITE any conflicting
states in the destination.
Terraform initialization doesn't currently migrate only select Workspaces.
If you want to migrate a select number of Workspaces, you must manually
pull and push those states.
If you answer "yes", Terraform will migrate all states. If you answer
"no", Terraform will abort.
Enter a value:
ローカルの作業ディレクトリに、S3で管理しているstateと同じファイルが作成されます。
./terraform.tfstate.d/stg/terraform.tfstate
2. Workspaceをdefault
に変更
Workspaceにdefault
を選択するために下記のコマンドを実行します。
terraform workspace select default
下記のコマンドで選択中のWorkspaceを確認できます。
terraform workspace show
下記のコマンドを実行します。
terraform state list
Workspaceがdefault
に切り替わっているため、stateファイルが存在しないと表示されます。
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.
3.ローカルにstateファイルを作成
作業ディレクトリ直下に terraform.tfstate
を作成します。
terraform state push terraform.tfstate.d/stg/terraform.tfstate
Workspaceのstateファイルを管理するterraform.tfstate.d
ディレクトリを削除します。
rm -r terraform.tfstate.d
下記のコマンドを実行します。先ほどはNo state file was found!
と表示されていましたが、今回はリソースが表示されるようになりました。
terraform state list
4. 新しいkeyでS3バケットにstateファイルを作成する
先ほどコメントアウトした下記についてコメントアウトを外し、key
を変更します。
terraform {
required_version = "=0.14.6"
backend "s3" {
bucket = "s3_buckete"
- key = "sample/terraform.tfstate"
+ key = "stg/sample/terraform.tfstate"
region = "ap-northeast-1"
}
}
下記のコマンドを実行します。
terraform init
下記のメッセージが表示されるので、yes
を入力します。
Initializing the backend...
Do you want to copy existing state to the new backend?
Pre-existing state was found while migrating the previous "local" backend to the
newly configured "s3" backend. No existing state was found in the newly
configured "s3" backend. Do you want to copy this state to the new "s3"
backend? Enter "yes" to copy and "no" to start with an empty state.
Enter a value:
S3バケットにstateファイルが作成されます。
5. 不要なローカルファイルを削除
ローカルのstateファイルは不要なため削除します。
rm terraform.tfstate
rm terraform.tfstate.backup
6. 動作確認
念の為、最後に動作確認をします。
.terraform
をディレクトリを削除。
rm -r .terraform
下記のコマンドを実行し、差分がなければOKです。
terraform init
terraform plan
7. 変更前のstateファイルの削除
Workspaceを利用していた際のstateファイルがS3に残ったままになっています。
s3_bucket/env:/stg/sample/terraform.tfstate
は不要なので削除してください。
最後に
Backend S3のkeyを変更するだけですが、結構大変でした。
もっと簡単にできる方法があれば、コメントで教えて頂けると嬉しいです。
Author And Source
この問題について(Workspaceを利用しているTerraformでstateファイルを管理するS3バケットのキーを変更する), 我々は、より多くの情報をここで見つけました https://zenn.dev/kobayashi_m42/articles/terraform-change-backend著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Collection and Share based on the CC protocol