Terraform错误:错误锁定状态:获取状态锁时出错:发生2个错误:

18

我尝试了 terraform 的版本 v0.12.26 和 v0.13.3,但都失败了。

terraform plan

正在获取状态锁。这可能需要一些时间...

错误:无法锁定状态:获取状态锁时出错:发生了 2 个错误: * ResourceNotFoundException:找不到请求的资源 * ResourceNotFoundException:找不到请求的资源

Terraform 获取状态锁来保护状态,防止多个用户同时写入。请解决上述问题后再尝试。对于大多数命令,您可以使用“-lock=false”标志禁用锁定,但不建议这样做。

相关源代码:

terraform {
  backend "s3" {
    encrypt        = false
    bucket         = "dev-terraform-state"
    key            = "dev/Oregon/eks/terraform.tfstate"
    region         = "us-west-2"
    dynamodb_table = "dev-lock-table"
  }
  required_version = ">= 0.12.0"
}

1
嗨。我注意到你有很多带答案的问题,但没有一个被接受。接受有帮助的问题是一个好习惯,因为它可以帮助其他人在未来遇到类似问题时解决。如果好的答案没有被接受,那么会促使人们提出重复的问题,并错误地认为给出的答案没有用处。 - Marcin
1
我想接受这些答案。但是,如何接受? - Melissa Jenner
在赞成/反对按钮下方有一个“√”符号。 - Marcin
我发现通过运行 terraform init 和 plan,AWS DynamoDB 表中的 dev-lock-table 没有被创建。但是,为什么它没有被创建? - Melissa Jenner
我删除了这一行代码:dynamodb_table = "dev-lock-table"。然后,"terraform plan" 就可以正常工作了。为什么呢? - Melissa Jenner
因为你不再完全锁定DynamoDB。 - Sirex
9个回答

25

错误是ResourceNotFoundException,这表明您的dev-lock-table不存在。

Terraform不会创建它。相反,在你使用它之前,必须先存在。参考文档

将dynamodb_table字段设置为现有的DynamoDB表名称。


3
从Google进入的任何人,请确保您在供应商配置中指定的区域创建了表格。 - chris
3
这个表需要一个主键作为LockID。 - demokritos
谢谢@chris,我也遇到了同样的问题,你的信息解决了我的问题!非常感谢。 - Rafael Bertelli
如果我手动从DynamoDB中删除锁定,会破坏任何东西吗? - astroanu
@astroanu 请确保为您的问题创建新的提问。 - Marcin

0
问题:AWS S3与Dynamodb后端 如果出现以下错误:加载状态错误:无法锁定s3状态:发生2个错误: * 操作错误DynamoDB:PutItem,https响应错误StatusCode:400,RequestID:XXXXXXXXXXXXXXXXXX,api错误ValidationException:一个或多个参数值无效:在项目中缺少关键字LockId
加载状态错误:无法锁定s3状态:发生2个错误: * 操作错误DynamoDB:PutItem,https响应错误StatusCode:400,RequestID:XXXXXXXXXXXXXXXXXXXX,api错误ValidationException:一个或多个参数值无效:在项目中缺少关键字LockId
解决方案是:在创建存储桶时,我将主要的LockId写成了LockID,修复后问题得到解决。谢谢

1
目前您的回答表达不够清晰。请[编辑]以添加更多细节,帮助其他人理解您的回答如何解决所提出的问题。您可以在帮助中心找到更多有关如何撰写好答案的信息。 - undefined

0

请检查您是否使用相同的AWS账户和正确的区域。DynamoDB表必须与CLI/SDK配置位于同一区域。


0
请确保下面代码中创建的表和指定的区域是相同的
terraform { backend "s3" { bucket = "" key = "" region = "us-east-1" dynamodb_table =

0

在修改了我的 backend.tfvars 文件后,我运行 terraform plan 后出现了完全相同的错误消息。为了修复它,我重新初始化了 IaC:

terraform init -backend-config=backend.tfvars

生成了另一个错误消息,指示我迁移现有的状态:

terraform init -backend-config=backend.tfvars -migrate-state

迁移现有状态使后端成功重新配置,然后我可以运行terraform plan

0

我运行了terraform force-unlock <LOCK_ID>(文档)来删除锁定。

这里有很多讨论链接


0
确保您正在使用特定的环境访问和安全凭据。
如果您的配置文件设置为默认,请确保您正在为该特定账户运行terraform apply,否则您可能需要重新配置密钥。

0

现在需要创建一个表格来工作,这样它就能保存状态了。

enter image description here

IAM

enter image description here


0
在我的情况下,我从另一个在不同的AWS账户中运行的存储库中fork了它,所以我有了错误的dynamodb_table。 我在后端配置中更新了dynamodb_table字段,然后它就正常工作了。
terraform {
  backend "s3" {
    key = <VALID_KEY_NAME>
    region = 'eu-central-1'
    dynamodb_table = <A table which exists>
    encrypt = true
  }
}

这是我的问题,你可以检查一下在dynamodb中是否已经存在这个表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接