DynamoDB 有触发器吗?
有。DynamoDB 的触发器由 DynamoDB Streams 加上 AWS Lambda 组成:流捕获每一次 item 级别的更改,而订阅了这条流的 Lambda 函数会自动作为响应运行。没有 CREATE TRIGGER 语句——触发器代码活在 Lambda 里,在数据库之外。
触发器是怎么工作的
你在表上启用 DynamoDB Streams,然后把流的 ARN 关联到一个 Lambda 函数。每一次创建、更新和删除都会被捕获成一条流记录;Lambda 服务每秒轮询这条流四次,并用一批批新记录同步调用你的函数。你也可以过滤事件,让函数只为你关心的那些更改运行。
函数实际收到的是什么
我们用 StreamViewType: NEW_AND_OLD_IMAGES 启用了一条流,写入一个订单、改了它的状态、再删除它,然后用 GetRecords 把分片读了回来。出来了三条记录:INSERT、MODIFY、REMOVE。下面是中间那一条,原样照录:
{
"eventID": "77dabd57-20e1-4827-83e9-0fa20153adb0",
"eventName": "MODIFY",
"eventVersion": "1.1",
"eventSource": "aws:dynamodb",
"awsRegion": "ddblocal",
"dynamodb": {
"ApproximateCreationDateTime": 1785266820,
"Keys": {"pk": {"S": "ORDER#1"}},
"NewImage": {
"total": {"N": "42"},
"pk": {"S": "ORDER#1"},
"status": {"S": "SHIPPED"}
},
"OldImage": {
"total": {"N": "42"},
"pk": {"S": "ORDER#1"},
"status": {"S": "PENDING"}
},
"SequenceNumber": "000000000000000019180",
"SizeBytes": 67,
"StreamViewType": "NEW_AND_OLD_IMAGES"
}
}两条 image 都在记录里。PENDING 到 SHIPPED 这个问题可以在函数内部回答,不必再回调表。触发器里的 GetItem 既费一次读,又和下一次写入竞态,所以可能递给你一个两条 image 都描述不了的第三状态。
视图类型在启用流时选定,已经写出的记录只携带当时要求的内容。选了 KEYS_ONLY 或 NEW_IMAGE,后面就没有 OldImage 可做 diff。
Lambda 把同样的记录放进 Records 数组交给你的函数,并加上 eventSourceARN 字段。上面的 awsRegion 读作 ddblocal,是因为这次运行用的是 DynamoDB Local;对着正式服务时会带上 Region。
触发器都用来做什么
典型用途包括:值变化时发通知、启动工作流、维护聚合与计数器,以及把每次更改复制到 S3 这类耐久存储做永久审计轨迹。如果函数出错,Lambda 会重试该批次,直到成功或记录过期;重试与批处理行为可配置。
值得了解的限制
AWS 建议一条流最多订阅两个 Lambda 函数——更多可能造成读限流。触发器函数应短命;重活应交给异步工作流,而不是在函数里跑长逻辑。
深入了解
从 DynamoDB Streams 指南 了解流模型本身,用表达式构建器 写出触发器会响应的写入,并下载 DynoTable 观察流入你的流的 item 变更。
参考资料
- DynamoDB Streams and AWS Lambda triggers — Amazon DynamoDB Developer Guide
- Change data capture for DynamoDB Streams — Amazon DynamoDB Developer Guide
- Quotas in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Using AWS Lambda with Amazon DynamoDB — AWS Lambda Developer Guide
最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。
该流记录于 2026-07-28 在 Node v24.18.0 上用 @aws-sdk/client-dynamodb 3.1095.0 对 DynamoDB Local 3.3.0 捕获,除缩进外未做改动。