【问题标题】:How to configure StreamArn of existing dynamodb table如何配置现有 dynamodb 表的 StreamArn
【发布时间】:2018-06-08 00:23:52
【问题描述】:

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

DynamoDB 表由其他 CloudFormation 堆栈创建。

如何在serverless.yml 中引用现有 dynamodb 表的 StreamArn

我的配置如下

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

【问题讨论】:

  • 您找到解决方案了吗?
  • 没有解决办法,我将streamArn保存在配置文件中并从那里引用。
  • 我想出了一个很好的解决方法...如果您不介意复制现有表格,请查看下面的答案。
  • 我编辑了我的答案以考虑到您的表是在 CloudFormation 堆栈中创建的。

标签: amazon-dynamodb serverless-framework amazon-dynamodb-streams


【解决方案1】:

编辑:
- 如果您的表是在另一个无服务器服务中创建的,您可以跳过步骤 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-autoscalingserverless.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. 将旧表中的数据复制到新创建的表中。
    为此,我使用了this script,如果旧表和新表位于同一区域并且表不是很大,则该方法效果很好。对于较大的表,您可能需要使用 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. 备份和删除旧表

【讨论】:

  • 如果我的 ddb 表不是由任何 cfn 模板创建的怎么办?
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 2022-09-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多