是否可以仅在 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 才会被调用。
我已经设置了 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 才会被调用。