将现有的带有流的 dynamodb 表添加到 CDK

mon*_*key 7 amazon-web-services aws-cdk

我目前有一个 dynamodb 表,已经使用了几年,最初是在控制台中创建的。它包含大量有价值的数据。它使用流通过表的 lambda 触发器定期将快照发送到 s3 进行分析。最终用户大量使用该表本身来访问其数据。

我想将我的解决方案迁移到 CDK 中。我想探索的选项:

  1. 当您使用 Table.fromTableArn 构造时,您无法访问表流 arn,因此无法附加 lambda 触发器。有没有解决的办法?
  2. 有没有办法克隆我的 CDK 堆栈中的 dynamoDB 表内容,以便我的副本将以与原始状态完全相同的状态开始?然后我可以在 CDK 中添加和管理流等,没有问题。
  3. 值得检查一下我的假设:这是唯一的两个选择。

Bal*_*ala 9

  1. 将 Lambda 订阅到现有 Dynamo 表:

我们不需要在同一堆栈中创建表。我们不能在 lambda 上使用 addEventSource,但我们可以使用addEventSourceMapping并向 Lambda 添加必要的策略,这就是 addEventSource 在幕后所做的事情。

const streamsArn =
  "arn:aws:dynamodb:us-east-1:110011001100:table/test/stream/2021-03-18T06:25:21.904";
const myLambda = new lambda.Function(this, "my-lambda", {
  code: new lambda.InlineCode(`
  exports.handler = (event, context, callback) => {
    console.log('event',event)
    callback(null,'10')
  }
    `),
  handler: "index.handler",
  runtime: lambda.Runtime.NODEJS_10_X,
});

const eventSoruce = myLambda.addEventSourceMapping("test", {
  eventSourceArn: streamsArn,
  batchSize: 5,
  startingPosition: StartingPosition.TRIM_HORIZON,
  bisectBatchOnError: true,
  retryAttempts: 10,
});
const roleUpdates = myLambda.addToRolePolicy(
  new iam.PolicyStatement({
    actions: [
      "dynamodb:DescribeStream",
      "dynamodb:GetRecords",
      "dynamodb:GetShardIterator",
      "dynamodb:ListStreams",
    ],
    resources: [streamsArn],
  })
);
Run Code Online (Sandbox Code Playgroud)
  1. 将现有 DynamoDb 导入 CDK:

我们在cdk、synth中使用相同的属性重写dynamo db来生成Cloudformation,并使用资源导入将现有资源导入到堆栈中。这是一个SO答案