3

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

DynamoDB 表由其他 CloudFormation 堆栈创建。

我如何引用现有的 dynamodb 表的 StreamArnserverless.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
4

1 回答 1

2

编辑:
-如果您的表是在另一个无服务器服务中创建的,则可以跳过步骤 1、4 和8。-
如果您的表是在标准CloudFormation 堆栈中创建的,请编辑此堆栈以添加步骤 2 的输出并跳过步骤 1、4和 8


遇到同样的问题,我想出了以下解决方法:

  1. 创建一个新的无服务器服务,其中只有表(您想要复制现有的表设置):

        service: MyResourcesStack
    
        resources:
          Resources:
          FoosTable:
            Type: AWS::DynamoDB::Table
            Properties:
              TableName: ${opt:stage}-${self:service}-foos
              AttributeDefinitions:
                - AttributeName: id
                  AttributeType: S
              KeySchema:
                - AttributeName: id
                  KeyType: HASH
              ProvisionedThroughput:
                ReadCapacityUnits: 1
                WriteCapacityUnits: 1
              StreamSpecification:
                StreamViewType: NEW_AND_OLD_IMAGES # This enables the table's stream
    

    (可选)您可以使用serverless-dynamodb-autoscaling从以下位置配置自动缩放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
    
  2. 设置堆栈以输出表名、Arn 和 StreamArn:

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

  4. 将旧表中的数据复制到新创建的表中。
    为此,我使用了这个脚本,如果旧表和新表位于同一区域并且表不是很大,则该脚本运行良好。对于较大的表,您可能需要使用 AWS Data Pipeline。

  5. 将您在初始服务中对表的硬编码引用替换为先前输出的变量:

        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}
    
  6. 部署这些更改

  7. 测试一切
  8. 备份和删除旧表
于 2018-11-28T13:16:52.043 回答