You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Terraform远程后端时DynamoDB状态锁获取失败求助

Terraform远程后端状态锁失败(ConditionalCheckFailedException)解决方法

问题说明

错误:获取状态锁失败
│
│ 错误信息:operation error DynamoDB: PutItem, https response error
│ StatusCode: 400, RequestID:
│ │ ConditionalCheckFailedException: 条件请求失败

使用AWS S3存储Terraform状态文件、DynamoDB做状态锁,迁移状态到远程后端后持续触发上述错误,对应DynamoDB表的Terraform配置如下:

resource "aws_dynamodb_table" "" {
  name         = var.table_name
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "LockID"

  attribute {
    name = "LockID"
    type = "S"
 }

解决步骤

1. 清理未释放的锁记录

登录AWS控制台,找到对应的DynamoDB表,查看是否存在LockID为你的Terraform状态文件S3路径(如s3://your-bucket/terraform.tfstate)的未过期条目。如果有,手动删除该条目释放锁。

2. 补全DynamoDB表的TTL配置

Terraform依赖TTL自动过期锁,当前配置缺少该字段,修改配置如下:

resource "aws_dynamodb_table" "terraform_state_lock" {
  name         = var.table_name
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "LockID"

  attribute {
    name = "LockID"
    type = "S"
  }

  # 添加TTL配置,Terraform会自动使用"Expires"字段管理锁过期
  ttl {
    attribute_name = "Expires"
    enabled        = true
  }
}

应用配置更新后,锁会在超时后自动释放,避免死锁。

3. 验证状态文件路径一致性

检查Terraform后端配置的key值,必须与DynamoDB锁记录的LockID完全匹配:

terraform {
  backend "s3" {
    bucket         = "your-state-bucket"
    key            = "path/to/terraform.tfstate" # 该路径需和DynamoDB的LockID一致
    region         = "us-east-1"
    dynamodb_table = "your-lock-table"
    encrypt        = true
  }
}

若曾手动修改过状态路径,需清理旧锁记录并修正后端配置。

4. 检查IAM权限

确保执行Terraform的角色/用户拥有DynamoDB的PutItem、GetItem、DeleteItem权限,补充IAM策略示例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:PutItem",
        "dynamodb:GetItem",
        "dynamodb:DeleteItem"
      ],
      "Resource": "arn:aws:dynamodb:your-region:your-account-id:table/your-lock-table"
    }
  ]
}

内容的提问来源于stack exchange,提问作者Priyadharshini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 13:48:16