首页 > 解决方案 > AWS CDK 使用现有的 DynamoDB 和 Streams

问题描述

我正在将我的云解决方案迁移到 cdk。我可以通过 TableProps 在构造函数中看到如何将流添加到新的 DynamoDB:

const newTable = new dynamodb.Table(this, 'new Table', {
  tableName: 'streaming',
  partitionKey: { name : 'id', type: dynamodb.AttributeType.NUMBER },
  stream: StreamViewType.NEW_AND_OLD_IMAGES,
})

但是没有明显的方法可以在现有 DynamoDB 上启用流。我似乎无法访问现有项目的 TableProps。

const sandpitTable = dynamodb.Table.fromTableArn(this, 'sandpitTable', 'arn:aws:dynamodb:ap-southeast-2:xxxxxxxxxxxxxx:table/Sandpit');
sandpitTable.grantStreamRead(streamLambda);
// sandpitTable.  ??? what to do?

如何做到这一点?以及解决方案如何考虑灾难恢复并防止意外删除使用控制台时无法实现的 Dynamo DB。

标签: amazon-web-servicesamazon-dynamodbaws-cdk

解决方案


启用流只是 CloudFormation 中资源“AWS::DynamoDB::Table”的另一个属性,我不相信我们可以更改从另一个 cloudformation/cdk 堆栈在堆栈中(或手动)创建的资源,除非我们导入资源。 是文档。我可以试着总结一下。

  • 假设我们有一个没有元数据资源的现有 cdk 项目cdk --no-version-reporting deploy

  • 假设我们有您所说的带有分区键“id”的 Dynamo 表“流式传输”。

  • 在下面添加与原始表相同属性的 cdk 代码,如 RCU、WCU、键等。为简单起见,我只给出了名称和键,removingPolicy 是必须的

    const myTable = new dynamodb.Table(this, "dynamo-table", {
      tableName: "streaming",
       partitionKey: { name: "id", type: dynamodb.AttributeType.NUMBER },
       removalPolicy: cdk.RemovalPolicy.RETAIN,
    });
    
  • 我们现在可以默认合成并生成 CloudFormation 到 cdk.out 文件夹中cdk --no-version-reporting synth

  • 在我的情况下,从 .json 文件中获取逻辑 ID,它是 dynamotableF6720B98

  • 使用正确的表名和逻辑 ID 创建 ChangeSet 集 aws cloudformation create-change-set --stack-name HelloCdkStack --change-set-name ImportChangeSet --change-set-type IMPORT --resources-to-import "[{\"ResourceType\":\"AWS::DynamoDB::Table\",\"LogicalResourceId\":\"dynamotableF6720B98\",\"ResourceIdentifier\":{\"TableName\":\"streaming\"}}]" --template-body file://cdk.out/HelloCdkStack.template.json

  • 执行变更集

    aws cloudformation execute-change-set --change-set-name ImportChangeSet --stack-name HelloCdkStack

  • 最好检查漂移并进行必要的更改 aws cloudformation detect-stack-drift --stack-name HelloCdkStack

对于防止意外删除的其他问题,我们可以简单地添加删除策略以避免在删除堆栈/资源时删除发电机表。

removalPolicy: RemovalPolicy.RETAIN

推荐阅读