HCP Terraformでリソースを残しつつWorkspaceを削除する方法
HCP Terraformでリソースを残しつつ、Workspaceを削除することは可能か疑問に思い試してみました。
結論
Workspaceの強制削除を実行することで可能です。しかし、おすすめはしません。
Workspace削除後は、Stateファイルにアクセスできなくなるため、Terraformでリソースを管理することが困難になります。
Workspace内にStateファイルが保管されています。Workspaceを削除することで、Stateファイルも同時に削除されます。
引き続きTerraformで管理したい場合は、Workspace削除前にStateファイルを移行する必要があります。
Backend用のリソースを別途用意する必要やHCP Terraform外でのワークフローの考慮が必要になり、運用負荷は高くなると思います。
コンソール上でやってみた
実際に、テスト用のリソースを作ってWorkspace削除をやってみます。
テスト用リソースを作成
テスト用にSQSキューを作成するTerraformコードを作成しました。
provider "aws" {
region = "ap-northeast-1"
}
terraform {
cloud {
organization = "<Organizations名>"
workspaces {
project = "<Project名>"
name = "<Workspace名>"
}
}
}
resource "aws_sqs_queue" "thi" {
name = "hcp-tf-workspace-delete-test"
}
コードを実行して、リソースを作成します。
terraform init
terraform plan
terraform apply
SQSキューが作成されていることが確認できます。
$ aws sqs list-queues | grep hcp-tf-workspace-delete-test
https://sqs.ap-northeast-1.amazonaws.com/0123456789/hcp-tf-workspace-delete-test
Workspaceのみ削除
リソース残しつつ、Workspace削除します。
HCP Terraformのコンソールにて、Workspaceを選択します。
Workspace Settings
-> Destruction and Deletion
-> Force Delete from HCP Terraform
を選択します。
リソースが残っている場合、以下のように警告が表示されます。
Workspaceのdelete自体は可能なため、Force Delete
を実行します。
Workspaceが削除されたことを確認できました。
期待通り、SQSキューが削除されていないことも確認できました。
$ aws sqs list-queues | grep hcp-tf-workspace-delete-test
https://sqs.ap-northeast-1.amazonaws.com/0123456789/hcp-tf-workspace-delete-test
tfe providerでやってみた
tfe providerを使って、Workspaceを管理している場合はどうなるか試してみました。
前の手順で作成したSQSキューhcp-tf-workspace-delete-test
は予め削除しておいてください。
tfe_workspace | Resources | hashicorp/tfe | Terraform | Terraform Registry
リソース作成
tfe providerでWorkspaceを作成します。
force_delete
をtrue
に設定することで、Workspaceの強制削除が可能になります。(リソースが残っている状態でWorkspaceを削除)
ちなみに、デフォルトはfalse
です。
mkdir tfe
touch main.tf
resource "tfe_workspace" "test" {
name = "hcp-tf-workspace-delete-test"
organization = "Organizations名"
project_id = "<プロジェクトID>"
force_delete = true
}
Terraformを実行して、Workspaceを作成します。
terraform -chdir=tfe init
terraform -chdir=tfe apply
Terraformで作成したWorkspacを指定します。
先程のAWSリソース作成用コードを使い回します。
mkdir aws
mv main.tf aws/
provider "aws" {
region = "ap-northeast-1"
}
terraform {
cloud {
organization = "<Organizations名>"
workspaces {
project = "<Project名>"
name = "hcp-tf-workspace-delete-test"
}
}
}
resource "aws_sqs_queue" "thi" {
name = "hcp-tf-workspace-delete-test"
}
ディレクトリ構成は以下です。
.
├── aws
│ └── main.tf
└── tfe
└── main.tf
Terraformを実行して、SQSキューを作成します。
terraform -chdir=aws init
terraform -chdir=aws apply
SQSキューが作成できました。
$ aws sqs list-queues | grep hcp-tf-workspace-delete-test
https://sqs.ap-northeast-1.amazonaws.com/0123456789/hcp-tf-workspace-delete-test
Workspaceのみ削除
Workspaceを管理しているTerraformでdestoryを実行して、Workspaceを削除してみます。
terraform -chdir=tfe destroy
期待通り、SQSキューが残っていました。
$ aws sqs list-queues | grep hcp-tf-workspace-delete-test
https://sqs.ap-northeast-1.amazonaws.com/0123456789/hcp-tf-workspace-delete-test
force_delete
をfalse
にして、Workspaceを削除
force_delete
をfalse
にした場合の挙動をみてみましょう。
先ほどのSQSキューを手動で削除します。
その後、tfe/main.tf
でforce_delete
をfalse
に変更します。
resource "tfe_workspace" "test" {
name = "hcp-tf-workspace-delete-test"
organization = "Organizations名"
project_id = "<プロジェクトID>"
force_delete = false # ここを変更
}
先ほどと同様に、Applyをそれぞれ実行して、WorkspaceとSQSキューを作成します。
その後Workspace側をDestroyします。
この際に、管理対象リソースがあるとエラーが出力されDestroyが失敗します。
$ terraform -chdir=tfe destroy
│ Error: error deleting workspace ws-XXXXXXX: This workspace has 1 resources under management and must be force deleted by setting force_delete = true
AWS側のリソースを削除して、Workspace内に管理リソースが存在しない状態にすることでDestroyは成功します。
terraform -chdir=aws destroy
terraform -chdir=tfe destroy
Tips: No-code Provisioningで作成したWorkspaceの削除
No-code Provisioningで作成したWorkspaceも同様に削除可能です。
Workspace自体はユーザー側で操作が可能なため、Force delete workspace
を実行できます。
おわりに
手動・tfe providerでWorkspaceの強制削除をやってみました。
強制削除によって、リソースを残したままWorkspaceを削除することはできます。
Workspaceと一緒にStatefileが消えてしまいます。
バックアップの取得等を行ったうえで、十分に注意して実行しましょう。
以上、AWS事業本部の佐藤(@chari7311)でした。