错误:获取状态锁时出错:ConditionalCheckFailedException:条件请求失败:ProvisionedThroughputExceededException
Error: Error acquiring the state lock: ConditionalCheckFailedException: The conditional request failed: ProvisionedThroughputExceededException
ID: terraform/state-lock-dynamodb-throughput-exceeded
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| Terraform v1.5 | active | — | — | — |
| Terraform v1.6 | active | — | — | — |
| Terraform v1.7 | active | — | — | — |
| AWS SDK v1.44 | active | — | — | — |
根因分析
用于状态锁定的 DynamoDB 表的读写容量单位不足,无法处理并发锁定请求,导致节流。
English
The DynamoDB table used for state locking has insufficient read/write capacity units to handle the concurrent lock requests, causing throttling.
官方文档
https://developer.hashicorp.com/terraform/language/settings/backends/s3#dynamodb-state-locking解决方案
-
Increase DynamoDB table provisioned capacity: `aws dynamodb update-table --table-name terraform-locks --provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=10` or switch to on-demand billing mode.
-
Implement a retry with jitter in your CI/CD script: `for i in 1 2 3 4 5; do terraform apply && break || sleep $((RANDOM % 10 + 5)); done`
-
Use `terraform apply -lock=false` to bypass locking entirely (only for non-critical environments, as it risks state corruption).
无效尝试
常见但无效的做法:
-
Increasing DynamoDB table read capacity units without increasing write capacity
80% 失败
State locking uses write operations (PutItem, DeleteItem) for lock acquisition and release; increasing only read capacity doesn't help with throttled writes.
-
Switching to a different DynamoDB table with same capacity settings
90% 失败
The issue is capacity, not table identity; any table with low capacity will throttle under high concurrency.
-
Adding a delay in CI/CD pipeline but not using exponential backoff
75% 失败
Fixed delays are ineffective because concurrent lock attempts can still cluster; Terraform's default retry uses exponential backoff, but if capacity is too low, all retries fail.