将现有的 dynamodb table 与流添加到 CDK

Add existing dynamodb table with stream to CDK

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

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

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

我们不需要在同一个堆栈中创建 table。我们不能在 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],
  })
);
  1. 正在将现有的 DynamoDb 导入 CDK:

我们在cdk、synth中重写具有相同属性的dynamo db来生成Cloudformation并使用resource import to import an existing resources into a stack. Here is an