我想为DynamoDB表创建一个具有多个(> 10)属性的Terraform配置。而且我没有必要将所有属性添加为索引
global_secondary_index
或local_secondary_index
。
但是当我运行terraform plan
命令时,我有下一个错误:
All attributes must be indexed. Unused attributes: ...
我在validateDynamoDbTableAttributes函数中的Terraform存储库中找到了验证检查。
但据我所知,最佳做法是来自General Guidelines for Secondary Indexes in DynamoDB的each table in DynamoDB is limited to a maximum of five global secondary indexes and five local secondary indexes
。
由于我有超过10个属性,因此对我来说这似乎是一个问题。
我想了解为什么必须索引所有属性以及如果您拥有大量属性,该怎么做。
谢谢!
答案 0 :(得分:14)
在创建表格时,不必须先定义您想要使用的每个属性。
attribute
资源中的 aws_dynamodb_table
块不,用于定义您可以在应用程序中使用的属性。他们是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。
答案 1 :(得分:0)
我正在向LSI添加一个投影字段,并为该投影字段添加了一个属性条目。这是导致错误。您可以只在non_key_attributes中列出投影字段,如下所示,由于它不是键,因此不必将其定义为属性:
local_secondary_index {
name = "allocated_plus_created-lsi"
range_key = "allocated_plus_created"
projection_type = "INCLUDE"
non_key_attributes = ["allocated"]
}
不应将已分配的内容定义为TF的属性。