Я хочу создать конфигурацию Terraform для таблицы DynamoDB с несколькими (> 10) атрибутами. И мне не нужно добавлять все атрибуты в качестве индекса к
global_secondary_index или local_secondary_index.
Но когда я запускаю команду terraform plan, у меня появляется следующая ошибка:
All attributes must be indexed. Unused attributes: ...
Я нашел проверку валидации в репозитории Terraform в функции validateDynamoDbTableAttributes.
Но также, насколько я знаю, лучшая практика - это each table in DynamoDB is limited to a maximum of five global secondary indexes and five local secondary indexes от Общие рекомендации для вторичных индексов в DynamoDB.
А поскольку у меня более 10 атрибутов, это кажется мне проблемой.
Что хотелось бы понять, почему все атрибуты нужно индексировать и что делать, если у вас их большое количество.
Спасибо!





Вам нужно, чтобы нет определял каждый атрибут, который вы хотите использовать заранее, при создании вашей таблицы.
Блоки attribute внутри ресурсов aws_dynamodb_table являются нет, определяющими, какие атрибуты вы можете использовать в своем приложении. Это определение ключевой схемы для таблицы и индексов.
Например, следующий 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 сбивает с толку и не соответствует API DynamoDB) см. этот запрос на перенос.
Спасибо, это именно то, что мне нужно. Я новичок в DynamoDB и воссоздаю чужую таблицу с Terraform. Пока я писал все атрибуты в самом коде терраформирования, я задавался вопросом, разве это не должно быть NoSQL? Тогда почему мне нужно заранее определить эквивалент схемы таблицы SQL?
Я добавлял проецируемое поле в 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.
Спасибо, что подчеркнули тот факт, что этот блок кода Terraform определяет только атрибуты ключ. Я столкнулся с той же проблемой, и понимание того, что нюанс помог мне решить мою проблему только сейчас.