是否可以仅在 Dynamo 的项目到期时调用 lambda

Is it possible to invoke lambda only on item expiry from Dynamo

我已经设置了 Dynamo table 并启用了流,还在其中一列上启用了 TTL (timetolive)。我还有一个 lambda,它将从 Dynamo Stream 中提取条目。

现在要么我添加、删除或编辑,要么 TTL 过期 - 所有这些都会导致 lambda 调用。

我对添加或编辑事件不感兴趣,我只想让流接收已删除的、TTL 过期的条目,这可能吗?

此外,我绝对可以在我的 lambda 代码中进行检查,仅当事件类型为“删除”时才进行处理,但仍然会调用添加的 lambda,无论如何都会进行编辑。请指导

遗憾的是,您无法创建 DynamoDB 流,以仅流式传输项目的删除或过期。一切都流式传输,由您的 lambda 函数来过滤感兴趣的事件。

对于 TTL 过期项目,您的函数需要 check:


        "userIdentity":{
            "type":"Service",
            "principalId":"dynamodb.amazonaws.com"
        }

一种替代方法,是第二个table,仅带有TTL 标记。如果您的主要 table 经历了大量更新和修改,这可能会有用。这样,您的第二个 table 上的流只会为每个项目调用您的函数两次,即创建和 TTL 到期,而不是为您不感兴趣的所有更新。

尚未找到仅在 TTL 到期时触发 lambda 的方法,但您可以从收到的事件记录有效负载中重新调整 TTL,如上所述检查属性 eventName + userIdentity

 Records: [
    {
      eventID: '36df5f15e7429cc986999f68349e6fef',
      eventName: 'REMOVE',
      eventVersion: '1.1',
      eventSource: 'aws:dynamodb',
      awsRegion: 'us-west-2',
      dynamodb: [Object],
      userIdentity: [Object],
      eventSourceARN: 'arn:aws:dynamodb:us-west-2:XXXXX:table/table-with-ttl/stream/2021-09-27T17:03:42.812'
    }
  ]
if (record.eventName === 'REMOVE') {
      // Check if deletion was done manually or triggered by the TTL timer.
      // https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/time-to-live-ttl-streams.html
      if (
        record.userIdentity &&
        record.userIdentity.type === 'Service' &&
        record.userIdentity.principalId === 'dynamodb.amazonaws.com'
      ) {
        const itemThatWasRemoved = unmarshall(record.dynamodb.OldImage)
        // Your code that only runs for TTL removals here
      }

您无法控制 DynamoDB 流,对于您的 table 发生的任何更改,它总是 post 事件,但是您可以通过添加 属性“FilterCriteria”来控制 lambda 调用“在你的“EventSourceMapping”

https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventfiltering.html

FilterCriteria: {"Filters": [{"Pattern": "{ \"userIdentity\": { \"type\": [ \"Service\" ] ,\"principalId\": [\"dynamodb.amazonaws.com\"] }}"}]}

使用上面的过滤器,只有当 TTL 到期事件 post 在 DymnamoDB 流中编辑时,您的 lambda 才会被调用。