🛠

Workspaceを利用しているTerraformでstateファイルを管理するS3バケットのキーを変更する

2022/04/20に公開

概要

下記の設定で運用している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を変更するだけですが、結構大変でした。
もっと簡単にできる方法があれば、コメントで教えて頂けると嬉しいです。

Discussion