使用排序键的无服务器框架 Dynamo DB 表资源定义

Posted

技术标签:

【中文标题】使用排序键的无服务器框架 Dynamo DB 表资源定义【英文标题】:Serverless Framework Dynamo DB Table Resource Definition with Sort Key 【发布时间】:2018-05-03 06:26:51 【问题描述】:

我的 serverless.yml 中有一些类似这样的代码。

resources:
  Resources:
    uploadBucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: $self:service-$self:custom.stage-uploads
    visitsTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: $self:custom.visitsTable
        AttributeDefinitions:
          - AttributeName: userId
            AttributeType: S
          - AttributeName: visitId
            AttributeType: S
          - AttributeName: comments
            AttributeType: S
          - AttributeName: attachments
            AttributeType: S
          - AttributeName: ph
            AttributeType: N
          - AttributeName: ch
            AttributeType: N
        KeySchema:
          - AttributeName: userId
            KeyType: HASH
          - AttributeName: visitId
            KeyType: HASH
        ProvisionedThroughput:
            ReadCapacityUnits: 5
            WriteCapacityUnits: 5

我的目标是创建一个具有主键 userId 的表,排序键 visitId 并具有 cmets、附件、ph 和 ch 的字段。当我尝试sls deploy 时,出现以下错误。

无服务器错误 ----------------------------------------

发生错误:visitsTable - Property AttributeDefinitions 与表的 KeySchema 和二级索引不一致。

我在这里做错了什么?

编辑:我尝试的另一次尝试

resources:
  Resources:
    uploadBucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: $self:service-$self:custom.stage-uploads
    visitsTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: $self:custom.visitsTable
        AttributeDefinitions:
          - AttributeName: userId
            AttributeType: S
          - AttributeName: visitId
            AttributeType: S
        KeySchema:
          - AttributeName: userId
            KeyType: HASH
          - AttributeName: visitId
            KeyType: RANGE
        ProvisionedThroughput:
            ReadCapacityUnits: 5
            WriteCapacityUnits: 5

【问题讨论】:

您提到了 visitid 作为范围键(排序)。但是在您的 YAML 配置中,它被称为哈希键。 - AttributeName: visitId KeyType: RANGE 我想知道是否应该输入范围,但不确定这是否是“排序”。 我试过放范围但同样的错误。 (我把它全部大写,RANGE),就像你的例子一样,还有其他想法吗? 您正在尝试创建一个表。所以删除除 Key Schema 和 Indexes 之外的属性。从 AWS DOCS 可以清楚地看出,AttributeDefinitions 是一个属性数组,用于描述表和索引的关键架构。更多docs.aws.amazon.com/amazondynamodb/latest/APIReference/… 很有趣,那会是什么样子呢?我还需要 2 个 Keyschema 值吗? 【参考方案1】:

AWS DynamoDb 是一个 NO-SQL 类型的数据库,在创建表的过程中不需要定义所有的键。同样从 AWS 文档中可以清楚地看出,在属性定义中,您必须指定键架构和索引。

描述表和索引的键模式的属性数组。

请编辑您的代码如下

resources:
  Resources:
    uploadBucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: $self:service-$self:custom.stage-uploads
    visitsTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: $self:custom.visitsTable
        AttributeDefinitions:
          - AttributeName: userId
            AttributeType: S
          - AttributeName: visitId
            AttributeType: S
        KeySchema:
          - AttributeName: userId
            KeyType: HASH
          - AttributeName: visitId
            KeyType: RANGE
        ProvisionedThroughput:
            ReadCapacityUnits: 5
            WriteCapacityUnits: 5

更多CreateTable

【讨论】:

成功了,谢谢!我没有意识到我不需要其他信息。 你知道如何只删除使用无服务器创建的资源吗?例如,我想删除表,因为假设我更改了它,但我不希望整个堆栈丢弃,因为 lambda api 网关端点会更改。好奇你是否知道如何做到这一点。 您可以在 YAML 脚本中使用 DeletionPolicy: "Retain"。修改 YAML 文件并将上述属性添加到您的 Lambda 和 API 网关定义中。它会做的是,当您删除堆栈时,将删除 DynamoDB 表并保留其他资源。 我有点困惑如何将它与无服务器一起使用,你能给我举个例子吗,我创建了另一个问题。 ***.com/questions/47385994/…

以上是关于使用排序键的无服务器框架 Dynamo DB 表资源定义的主要内容,如果未能解决你的问题,请参考以下文章

在 Dynamo DB 中对本地二级索引进行索引

从 Parse 迁移到 AWS Dynamo DB

在Dynamo DB中索引本地二级索引

使用nodejs的AWS Dynamo DB生产设置

Kotlin Dynamo DB 自定义转换器

在Dynamo DB中选择where语句