Dynamodb, как определить схему без ключей в serverless.yml?

Я пытаюсь применить dynamodb в своей бессерверной лямбде aws. Мой файл выглядит так:

resources:
  Resources:
    StoreDynamoDbTable:
      Type: 'AWS::DynamoDB::Table'
      DeletionPolicy: Retain
      Properties:
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
          - AttributeName: lat
            AttributeType: N 
          - AttributeName: lng
            AttributeType: N
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
        TableName: ${self:provider.environment.TableStore}

Я пытаюсь применить lat и lng как атрибуты storeTable, просто атрибут, а не ключ схемы, но каждый элемент магазина должен иметь эти атрибуты.

Но есть ошибка:

Произошла ошибка: StoreDynamoDbTable — определения атрибутов свойства несовместимы с KeySchema таблицы и вторичных индексов.

Как сделать lat и lng просто атрибутом мачты, а не ключевым элементом для индекса?


person user504909    schedule 20.09.2018    source источник


Ответы (1)


DynamoDB требует, чтобы вы объявляли ТОЛЬКО те атрибуты, которые составляют вашу ключевую схему. (см. документацию AWS)

Если id является единственным атрибутом, который используется для составления схемы ключей, ваш ресурс должен выглядеть следующим образом:

resources:
  Resources:
    StoreDynamoDbTable:
      Type: 'AWS::DynamoDB::Table'
      DeletionPolicy: Retain
      Properties:
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
        TableName: ${self:provider.environment.TableStore}

DynamoDB не заботится о других атрибутах. После вставки ваших данных DynamoDB обнаружит новые атрибуты, не объявляя их в схеме. В этом весь смысл нереляционной базы данных.


Кроме того, если вы хотите использовать дату в качестве ключа сортировки в своей схеме ключей, у вас может быть что-то вроде этого:

resources:
  Resources:
    StoreDynamoDbTable:
      Type: 'AWS::DynamoDB::Table'
      DeletionPolicy: Retain
      Properties:
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
          - AttributeName: date
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
          - AttributeName: date
            KeyType: RANGE
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
        TableName: ${self:provider.environment.TableStore}

Ключевая схема всегда имеет по крайней мере ключ раздела (HASH) и может дополнительно иметь ключ сортировки (RANGE). Проверьте это, чтобы узнать больше о схеме ключей DynamoDB.

person Quentin Hayot    schedule 20.09.2018