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

时间:2018-04-24 16:40:09

标签: amazon-dynamodb terraform

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

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

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

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

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

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

谢谢!

2 个答案:

答案 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,但您可以使用您的应用程序创建其他属性 Two items, both have Attribute1, but differing custom attributes

这意味着您可以拥有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的属性。