带有 DynamoDB 后端的 terraform:创建新工作区时出现 400 Bad Request

Posted

技术标签:

【中文标题】带有 DynamoDB 后端的 terraform:创建新工作区时出现 400 Bad Request【英文标题】:terraform with DynamoDB backend: 400 Bad Request when creating new workspace 【发布时间】:2020-12-17 17:12:24 【问题描述】:

我有在 DynamoDB 中保持锁的 terraform 堆栈:

terraform 
  backend "s3" 
    bucket  = "bucketname"
    key     = "my_key"
    encrypt = "true"
    role_arn = "arn:aws:iam::11111111:role/my_role"
    dynamodb_table = "tf-remote-state-lock"
  

当我运行 terraform workspace new test 时,它会失败并出现(相当误导的)错误:

failed to lock s3 state: 2 errors occurred:
* ResourceNotFoundException: Requested resource not found
* ResourceNotFoundException: Requested resource not found

如果我打开TF_LOG=DEBUG,那么我会看到400 Bad Request(更多详情on pastebin)

我做错了什么以及如何解决?

【问题讨论】:

您的帐户中是否存在该表?该角色可以访问它吗? 绝对是,是的。 【参考方案1】:

解决方案:terraform workspace whatsoever 应该只在terraform init 之后朗姆酒。如果您设置了TF_WORKSPACE,您可能会在tf init 期间出错,说工作空间尚不存在,因此您可能会在tf init 之前尝试朗姆酒tf ws new。不要这样做,只需仅在tf init 之后设置TF_WORKSPACE

【讨论】:

【参考方案2】:

您可能没有创建 AWS 资源。 documentation 对 s3 存储桶说了以下内容:

这假设我们创建了一个名为 mybucket 的存储桶。

我认为第二条消息来自未创建或未正确配置的 DynamoDb 表。该文档对使用 DynamoDb 进行锁定和一致性进行了如下说明:

dynamodb_table -(可选)用于状态的 DynamoDB 表的名称 锁定和一致性。该表必须有一个名为 带有字符串类型的 LockID。如果没有配置,状态锁定将是 已禁用。

【讨论】:

以上是关于带有 DynamoDB 后端的 terraform:创建新工作区时出现 400 Bad Request的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 localstack dynamoDB 锁定 terraform 状态:UnrecognizedClientException

Terraform + DynamoDB:所有属性都必须被索引

Terraform + Dynamodb - 了解 aws_appautoscaling_target 和 aws_appautoscaling_policy

每个 dynamodb 表的多个基本云监视警报的 Terraform 模块。定义一次使用多次

terraform dynamodb 中如何指定复合主键(hashkey)

由 Terraform 在 LocalStack 中创建的 DynamoDB 表在 NoSQL Workbench 中不可见