Terraform + DynamoDB: All attributes must be indexed

I was adding a projected field to an LSI and put an attribute entry in for the projected field. This was causing the error. You can just list the projected field in the non_key_attributes as shown below, it doesn't have to be defined as an attribute since it's not a key:

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

Allocated shouldn't be defined as an attribute for TF.


You do not have to define every attribute you want to use up front when creating your table.

attribute blocks inside aws_dynamodb_table resources are not defining which attributes you can use in your application. They are defining the key schema for the table and indexes.

For example, the following Terraform defines a table with only a hash key:

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

  attribute {
    name = "Attribute1"
    type = "S"
  }
}

Every item in this table has Attribute1, but you can create additional attributes with your application Two items, both have Attribute1, but differing custom attributes

This means that you can have your 10+ attributes as long as you don't need to define them in an AttributeDefinition, and since you say you don't need them to be indexed, you'll be fine.

For some discussion of the confusion (attribute is confusing and doesn't match the DynamoDB API), see this pull request.