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

Posted

技术标签:

【中文标题】Terraform + DynamoDB:所有属性都必须被索引【英文标题】:Terraform + DynamoDB: All attributes must be indexed 【发布时间】:2018-10-05 00:32:01 【问题描述】:

我想为具有多个 (> 10) 属性的 DynamoDB 表创建 Terraform 配置。而且我不需要将所有属性作为索引添加到 global_secondary_indexlocal_secondary_index。 但是当我运行terraform plan 命令时,我有下一个错误:

All attributes must be indexed. Unused attributes: ...

我在 validateDynamoDbTableAttributes 函数的 Terraform 存储库中找到了验证检查。

但据我所知,最佳做法是 each table in DynamoDB is limited to a maximum of five global secondary indexes and five local secondary indexes 来自 General Guidelines for Secondary Indexes in DynamoDB。

而且由于我有超过 10 个属性,这对我来说似乎是个问题。

我想了解为什么必须为所有属性编制索引以及如果您有大量属性该怎么办。

谢谢!

【问题讨论】:

【参考方案1】:

您确实不必在创建表格时必须预先定义要使用的每个属性。

attribute 资源内的attribute没有定义您可以在应用程序中使用哪些属性。他们是defining the key schema for the table and indexes。

例如,以下 Terraform 定义了一个只有哈希键的表:

resource "aws_dynamodb_table" "test" 
  name           = "test-table-name"
  read_capacity  = 10
  write_capacity = 10
  hash_key       = "Attribute1"

  attribute 
    name = "Attribute1"
    type = "S"
  

此表中的每个项目都有Attribute1,但您可以使用您的应用程序创建其他属性

这意味着您可以拥有 10 多个属性,只要您不需要在 AttributeDefinition 中定义它们,并且既然您说您不需要将它们编入索引,那么您会没事的。

有关混淆的一些讨论(attribute 令人困惑,与 DynamoDB API 不匹配),请参阅this pull request。

【讨论】:

感谢您强调此 Terraform 代码块仅定义 key 属性的事实。我遇到了同样的问题,并理解细微差别帮助我解决了我自己的问题。 谢谢,这正是我所需要的。我是 DynamoDB 的超级新手,并且使用 Terraform 重新创建其他人的表。当我在我的 terraform 代码中编写所有属性时,我想知道,这不应该是 NoSQL 吗?那为什么我必须预先定义等效的 SQL 表模式呢?【参考方案2】:

我正在向 LSI 添加一个投影字段,并为投影字段添加一个属性条目。这是导致错误的原因。您可以只在 non_key_attributes 中列出投影字段,如下所示,它不必定义为属性,因为它不是键:

local_secondary_index 
  name = "allocated_plus_created-lsi"
  range_key = "allocated_plus_created"
  projection_type = "INCLUDE"
  non_key_attributes = ["allocated"]

Allocated 不应定义为 TF 的属性。

【讨论】:

以上是关于Terraform + DynamoDB:所有属性都必须被索引的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

Dynamodb 自动缩放地形导入