dynamodb如何在serverless.yml中定义无密钥模式?

时间:2018-09-20 01:22:31

标签: amazon-dynamodb serverless-framework serverless

我尝试在无服务器的aws lambda中应用一个dynamodb。 我的文件就像:

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的属性,只是该属性而不是键Schema,但是每个store元素都应具有这些属性。

但是有错误:

  

发生错误:StoreDynamoDbTable-属性AttributeDefinitions   与表和辅助表的KeySchema不一致   索引。

如何使lat和lng成为桅杆属性,而不是索引的关键元素?

1 个答案:

答案 0 :(得分:2)

DynamoDB要求您仅声明构成关键架构的属性。 (See AWS docs

如果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)键。 Check this to learn more about DynamoDB's key schema.