Amazon dynamodb 如何配置现有dynamodb表的StreamArn

Amazon dynamodb 如何配置现有dynamodb表的StreamArn,amazon-dynamodb,serverless-framework,amazon-dynamodb-streams,Amazon Dynamodb,Serverless Framework,Amazon Dynamodb Streams,我正在创建无服务器框架项目 DynamoDB表是由其他CloudFormation堆栈创建的 如何在serverless.yml 我有如下配置 resources: Resources: MyDbTable: //'arn:aws:dynamodb:us-east-2:xxxx:table/MyTable' provider: name: aws ... onDBUpdate: handler: handler.onDBUpdate events:

我正在创建无服务器框架项目

DynamoDB表是由其他CloudFormation堆栈创建的

如何在
serverless.yml

我有如下配置

resources:
  Resources:
    MyDbTable: //'arn:aws:dynamodb:us-east-2:xxxx:table/MyTable'
provider:
  name: aws
  ...
  onDBUpdate:
    handler: handler.onDBUpdate
    events:
      - stream:
        type: dynamodb
        arn:
          Fn::GetAtt:
            - MyDbTable
            - StreamArn
编辑:
-如果您的表是在另一个无服务器服务中创建的,您可以跳过步骤1、4和8。
-如果您的表是在标准的CloudFormation堆栈中创建的,请编辑此堆栈以添加步骤2的输出,并跳过步骤1、4和8


针对同一问题,我提出了以下解决方法:

  • 创建一个新的无服务器服务,其中仅包含表(您希望复制现有表设置):

    (可选)您可以使用从
    serverless.yml
    配置自动缩放:

    plugins:
      - serverless-dynamodb-autoscaling
    
    custom:
      capacities:
        - table: FoosTable  # DynamoDB Resource
          read:
            minimum: 5        # Minimum read capacity
            maximum: 50     # Maximum read capacity
            usage: 0.75       # Targeted usage percentage
          write:
            minimum: 5      # Minimum write capacity
            maximum: 50      # Maximum write capacity
            usage: 0.75       # Targeted usage percentage
    
  • 设置堆栈以输出表名、Arn和StreamArn:

        Outputs:
          FoosTableName:
            Value:
              Ref: FoosTable
          FoosTableArn:
            Value: {"Fn::GetAtt": ["FoosTable", "Arn"]}
          FoosTableStreamArn:
            Value: {"Fn::GetAtt": ["FoosTable", "StreamArn"]}
    
  • 部署堆栈

  • 将旧表中的数据复制到新创建的表中。
    为了做到这一点,我使用了在新旧表位于同一区域并且表不是很大的情况下效果很好的方法。对于较大的表,您可能希望使用AWS数据管道

  • 用先前输出的变量替换初始服务中对表的硬编码引用:

        provider:
          environment:
            stage: ${opt:stage}
            region: ${self:provider.region}
            dynamoDBTablesStack: "MyResourcesStack-${opt:stage}" # Your resources stack's name and the current stage
            foosTable: "${cf:${self:provider.environment.dynamoDBTablesStack}.FoosTableName}"
            foosTableArn: "${cf:${self:provider.environment.dynamoDBTablesStack}.FoosTableArn}"
            foosTableStreamArn: "${cf:${self:provider.environment.dynamoDBTablesStack}.FoosTableStreamArn}"
    
        functions:
          myFunction:
            handler: myFunction.handler
            events:
              - stream:
                  batchSize: 100
                  type: dynamodb
                  arn: ${self:provider.environment.foosStreamArn}
    
  • 部署这些更改

  • 测试一切
  • 备份并删除旧表

  • 您找到解决方案了吗?没有解决方案,我已将streamArn保存在配置文件中并从中引用。我想出了一个很好的解决方案。。。如果您不介意复制现有表,请检查下面我的答案。我编辑我的答案是考虑到您的表是在CloudFormation堆栈中创建的。如果我的ddb表不是由任何cfn模板创建的,该怎么办?
        provider:
          environment:
            stage: ${opt:stage}
            region: ${self:provider.region}
            dynamoDBTablesStack: "MyResourcesStack-${opt:stage}" # Your resources stack's name and the current stage
            foosTable: "${cf:${self:provider.environment.dynamoDBTablesStack}.FoosTableName}"
            foosTableArn: "${cf:${self:provider.environment.dynamoDBTablesStack}.FoosTableArn}"
            foosTableStreamArn: "${cf:${self:provider.environment.dynamoDBTablesStack}.FoosTableStreamArn}"
    
        functions:
          myFunction:
            handler: myFunction.handler
            events:
              - stream:
                  batchSize: 100
                  type: dynamodb
                  arn: ${self:provider.environment.foosStreamArn}