この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
ちゃだいん(@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