Terraform状态锁获取失败,DynamoDB相关报错求助
问题场景
terraform init执行成功,但运行terraform plan -var-file="variables.tfvars"时触发状态锁报错,具体信息如下:
Error: Error acquiring the state lock
│
│ Error message: 2 errors occurred:
│ * operation error DynamoDB: PutItem, https response error StatusCode: 400, RequestID: GR14O7ASBU1MPCN838P2JSCL97VV4KQNSO5AEMVJF66Q9ASUAAJG, api error ValidationException: One or more
│ parameter values were invalid: Missing the key id in the item
│ * Unable to retrieve item from DynamoDB table "Lock-Files": operation error DynamoDB: GetItem, https response error StatusCode: 400, RequestID:
│ DU7CSJE7862EV8O4IBG4GBEU6BVV4KQNSO5AEMVJF66Q9ASUAAJG, api error ValidationException: The provided key element does not match the schema
当前使用的backend.tf配置代码:
terraform { backend "s3" { bucket = "my-ews-baket1.0" region = "ap-southeast-1" key = "End-to-End-Kubernetes-Three-Tier-DevSecOps-Project/Jenkins-Server-TF/terraform.tfstate" dynamodb_table = "Lock-Files" encrypt = true } required_version = ">=0.13.0" required_providers { aws = { version = ">= 2.7.0" source = "hashicorp/aws" } } }
已执行操作:创建Lock-Files DynamoDB表、为IAM用户分配全权限、尝试terraform force-unlock但无效。
解决步骤
报错核心是DynamoDB表结构不符合Terraform状态锁的强制要求,Terraform对锁表有固定结构规范:
- 必须包含名为
id的字符串类型分区键,无需排序键 - 不需要额外属性或索引
按以下流程修复:
- 删除现有
Lock-Files表(确认无其他业务数据依赖) - 重新创建符合要求的DynamoDB表:
- 表名保持
Lock-Files - 分区键名称设为
id,类型选择「字符串」 - 其余配置保持默认即可
- 表名保持
- 重新执行
terraform init确保后端配置加载生效 - 再次运行
terraform plan -var-file="variables.tfvars"
若无法删除现有表,注意:DynamoDB不支持直接修改分区键的名称或类型,这种场景下重新建表是更高效的处理方式。
内容的提问来源于stack exchange,提问作者ch-ru

