当AWS MySQL RDS表插入或更新数据时,是否可以自动触发Lambda函数?
AWS MySQL RDS 插入/更新事件触发Lambda的可行方案
MySQL RDS 不提供 DynamoDB 流那样的原生变更事件触发Lambda能力,目前可通过以下三种成熟方案实现需求:
方案1:DMS + 行级binlog CDC 捕获变更(通用方案,适配所有RDS MySQL版本)
- 第一步修改RDS实例对应的参数组,设置
binlog_format = ROW开启行级二进制日志,调整binlog_expire_logs_seconds参数确保binlog保留时长覆盖DMS同步延迟 - 配置AWS DMS(数据库迁移服务)同步任务,源端选择你的RDS MySQL实例,筛选规则仅捕获目标表的INSERT、UPDATE事件
- DMS任务的目标端直接绑定你需要触发的Lambda函数,DMS会将每条变更事件的行数据、操作类型等信息推送给Lambda执行
- 适用场景:全量/增量变更都需要捕获、存在直接数据库侧写入操作、高并发生产环境
- 注意事项:需要预留10%-20%的RDS性能冗余用于binlog生成和同步,需额外支付DMS实例的运行费用
方案2:Aurora MySQL 原生触发器调用Lambda(仅适配Aurora MySQL兼容版)
如果你使用的是Aurora MySQL,可以直接通过数据库内置的Lambda调用能力实现,无需额外中间服务:
- 为你的Aurora集群绑定允许调用Lambda的IAM角色,在VPC安全组中配置出网规则允许访问Lambda服务端点
- 在目标表上创建AFTER INSERT、AFTER UPDATE触发器,触发器内部调用
aws_lambda.invoke存储过程,将变更的行数据组装为JSON参数传递给Lambda
参考触发器代码:
DELIMITER ;; CREATE TRIGGER `after_insert_your_table` AFTER INSERT ON `your_table` FOR EACH ROW BEGIN CALL mysql.lambda_async( 'arn:aws:lambda:us-east-1:123456789012:function:your_target_lambda', JSON_OBJECT( 'op_type', 'INSERT', 'row_id', NEW.id, 'row_data', JSON_OBJECT('col1', NEW.col1, 'col2', NEW.col2) ) ); END;; DELIMITER ;
- 适用场景:使用Aurora MySQL、并发量中等、对延迟要求较高的场景
- 注意事项:高并发写入场景下触发器会增加数据库写入延迟,不建议单表QPS超过1000的场景使用
方案3:业务层埋点触发(最低成本方案,适合小项目)
如果所有对RDS的写入操作都通过你可控的业务层执行,可以直接在业务代码中埋点实现:
- 业务代码执行完INSERT/UPDATE数据库操作且事务提交成功后,主动调用Lambda函数,或者先将事件推送到SNS/SQS再触发Lambda
- 适用场景:小型项目、无直接数据库侧写入操作、成本敏感的场景
- 注意事项:无法捕获绕过业务层直接在数据库执行的变更,需要自行实现调用失败的重试逻辑避免事件丢失
内容的提问来源于stack exchange,提问作者Shubham Kasaudhan
相关产品推荐
相关产品推荐

