Terraform + DynamoDB: все атрибуты должны быть проиндексированы

Я хочу создать конфигурацию 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 атрибутов, это кажется мне проблемой.

Что хотелось бы понять, почему все атрибуты нужно индексировать и что делать, если у вас их большое количество.

Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
44
0
13 197
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужно, чтобы нет определял каждый атрибут, который вы хотите использовать заранее, при создании вашей таблицы.

Блоки 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, но вы можете создать дополнительные атрибуты в своем приложении. Two items, both have Attribute1, but differing custom attributes

Это означает, что у вас может быть 10+ атрибутов, если вам не нужно определять их в AttributeDefinition, и, поскольку вы говорите, что вам не нужно их индексировать, все будет в порядке.

Для некоторого обсуждения путаницы (attribute сбивает с толку и не соответствует API DynamoDB) см. этот запрос на перенос.

Спасибо, что подчеркнули тот факт, что этот блок кода Terraform определяет только атрибуты ключ. Я столкнулся с той же проблемой, и понимание того, что нюанс помог мне решить мою проблему только сейчас.

Mass Dot Net 19.11.2019 21:26

Спасибо, это именно то, что мне нужно. Я новичок в DynamoDB и воссоздаю чужую таблицу с Terraform. Пока я писал все атрибуты в самом коде терраформирования, я задавался вопросом, разве это не должно быть NoSQL? Тогда почему мне нужно заранее определить эквивалент схемы таблицы SQL?

hyperwiser 18.09.2020 01:41

Я добавлял проецируемое поле в 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.

Другие вопросы по теме