Terraformで “Requested resource not found” の state lock 関連のエラーに遭遇したら
ちゃだいん(@chazuke4649)です。
Terraformにて、パッと解決方法がわからなかったエラーの対処法です。
エラー内容
% terraform plan ╷ │ Error: Error acquiring the state lock │ │ Error message: 2 errors occurred: │ * ResourceNotFoundException: Requested resource not found │ * ResourceNotFoundException: Requested resource not found │ │ │ │ Terraform acquires a state lock to protect the state from being written │ by multiple users at the same time. Please resolve the issue above and try │ again. For most commands, you can disable locking with the "-lock=false" │ flag, but this is not recommended. ╵
直接原因
結論から言うと、「Requested resource(排他制御のDynamoDB)が見つかりません」ということのようです。
根本原因
今回の環境ではバックエンドS3を使用し、排他制御でDynamoDBを使用していました。が、検証環境でいろいろやっている中で、このエラー表示時点では、何かの拍子で排他制御用のDynamoDBテーブルを削除していました。今回自分の場合はこれが根本原因です。
ただし、これ以外のパターンで同様のエラーが出る場合もあるようなので、他関連情報は最後のリンクを見てみてください。
ちなみに自分の場合、バックエンドは以下の通り記載していました。
terraform { required_version = "= 1.0.7" required_providers { aws = "~> 3.58" } backend "s3" { bucket = "terraform-state-123456789012" key = "terraform.tfstate" region = "ap-northeast-1" acl = "bucket-owner-full-control" dynamodb_table = "terraform_state_lock" } }
対処法
元々作成していたものと同じ設定と名前でDynamoDBテーブルを再度作成すると、エラーが表示されなくなりました。
余談
-lock=false
オプションを付ければ、一時的にエラーは回避できますが、とはいえ上記は半永久的に表示されることになるため、いずれにせよDynamoDBテーブルの再作成が必要です。
ちなみに本来の排他制御によるエラー表示は、以下の通り、Lock ID が表示されます。Lock IDが表示されれば、 terraform force-unlock {LockIDを入力}
でロックを解除できます。
% terraform plan ╷ │ Error: Error acquiring the state lock │ │ Error message: ConditionalCheckFailedException: The │ conditional request failed │ Lock Info: │ ID: 6ae68083-5152-7ee0-f507-xxxxxxxxxxxx │ Path: terraform-state-123456789012/terraform.tfstate (以下省略)
参考情報
Terraform state locking via DynamoDB
Terraform - Terraformにてresource not foundでのstate lockエラーの解決について|teratail
v0.9 Terraform s3 backed docs unclear · Issue #12774 · hashicorp/terraform