Я работаю над внедрением GSI в CloudFormation с инфраструктурой как кодом. Все, что я хочу сделать, это использовать эту таблицу для подсчета записей в основной таблице DynamoTable. Вот как выглядит основная сказка:
Resources:
CaseRecords:
Type: AWS::DynamoDB::Table
Properties:
TableName: ${self:custom.tableName}
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: userId
AttributeType: S
- AttributeName: caseRecordId
AttributeType: S
KeySchema:
- AttributeName: userId
KeyType: HASH
- AttributeName: caseRecordId
KeyType: RANGE
Мне не нужны ключи из исходной таблицы, и все, что я хочу, это создать новый HASH-ключ для нового GSI, который сообщит мне, из какой таблицы был взят счет, который я отслеживаю, т. е. из приведенной выше таблицы.
Ниже показано, как я пытался реализовать GSI:
# Implement a GSI to handle item count totals
GlobalSecondaryIndexes:
- IndexName: gsiCaseCountTable
KeySchema:
- AttributeName: table-name
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 5
WriteCapacityUnits: 5
Однако ошибка, которую я получаю, выглядит следующим образом:
An error occurred: CaseRecords - Property Projection cannot be empty..
Когда я включаю PROJECTION, который у меня был, только userId
из исходной таблицы просто для отслеживания количества записей в исходной таблице для каждого пользователя, я пробую следующее:
Implement a GSI to handle item count totals
GlobalSecondaryIndexes:
- IndexName: gsiCaseCountTable
KeySchema:
- AttributeName: table-name
KeyType: HASH
Projection:
NonKeyAttributes:
- userId
ProjectionType: INCLUDE
ProvisionedThroughput:
ReadCapacityUnits: 5
WriteCapacityUnits: 5
Однако это также возвращает ошибку:
An error occurred: CaseRecords - Property AttributeDefinitions is inconsistent with the KeySchema of the table and the secondary indexes.
Как я могу правильно реализовать глобальный вторичный индекс в Dynamo с помощью шаблона CloudFormation, чтобы я мог записывать количество записей в исходной таблице????
Спасибо.
ОБНОВЛЕНИЕ
Если кому-то интересно, вот как я смог его развернуть. Это не идеальное решение, но оно позволяет мне отслеживать и подсчитывать записи в таблице элементов:
# NOTE: DynamoDB Serverless Configuration
# NoSQL Table for CaseRecord DB
Resources:
CaseRecords:
Type: AWS::DynamoDB::Table
Properties:
TableName: ${self:custom.tableName}
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: userId
AttributeType: S
- AttributeName: caseRecordId
AttributeType: S
KeySchema:
- AttributeName: userId
KeyType: HASH
- AttributeName: caseRecordId
KeyType: RANGE
# Set the capacity based on the stage
# ProvisionedThroughput:
# ReadCapacityUnits: ${self:custom.tableThroughput}
# WriteCapacityUnits: ${self:custom.tableThroughput}
# Implement a GSI to handle item count totals
GlobalSecondaryIndexes:
- IndexName: gsiCaseCountTable
KeySchema:
- AttributeName: userId
KeyType: HASH
Projection:
ProjectionType: KEYS_ONLY
ОБНОВЛЕНИЕ № 2 – НЕ ПРОШЕЛ
Основываясь на информации, предоставленной @Pedro Arantes ниже, я пытаюсь реализовать GSI с определениями атрибутов, которые я хочу использовать. Это тоже, однако, терпит неудачу. Ниже приведена реализация, а вот ссылка на документ AWS, который я использовал: AWS GSI Doc и вот неудачная реализация:
Resources:
CaseRecords:
Type: AWS::DynamoDB::Table
Properties:
TableName: ${self:custom.tableName}
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: userId
AttributeType: S
- AttributeName: caseRecordId
AttributeType: S
- AttributeName: table-name
AttributeType: S
- AttributeName: count
AttributeType: N
KeySchema:
- AttributeName: userId
KeyType: HASH
- AttributeName: caseRecordId
KeyType: RANGE
# Set the capacity based on the stage
# ProvisionedThroughput:
# ReadCapacityUnits: ${self:custom.tableThroughput}
# WriteCapacityUnits: ${self:custom.tableThroughput}
# Implement a GSI to handle item count totals
GlobalSecondaryIndexes:
- IndexName: gsiCaseCountTable
KeySchema:
- AttributeName: table-name
KeyType: HASH
Projection:
NonKeyAttributes:
- userId
- count
ProjectionType: INCLUDE
Как я могу заставить это работать только с NonKeyAttributes
, которые я объявил в AttributeDefinitions
???