通过审核日志和 Amazon CloudWatch 从 Amazon RDS for MySQL 或
- 39
从Amazon RDS for MySQL或MariaDB触发AWS Lambda函数
关键要点
本文将介绍如何使用审计日志和Amazon CloudWatch,从Amazon RDS for MySQL或MariaDB触发AWS Lambda函数。解决方案包括创建数据库表、启用审计日志、发布日志到CloudWatch、创建Lambda函数和CloudWatch订阅过滤器。审计日志将帮助记录所有的DML操作,以便可以实例化Lambda函数,并在必要时执行相关操作。AWS Lambda 是一种无服务器计算服务,可以帮助您设计事件驱动的架构。它直接集成了多个AWS服务,包括Amazon Aurora MySQL兼容版。在本文中,我们将演示如何通过使用audit logs和Amazon CloudWatch来从Amazon RDS for MySQL和Amazon RDS for MariaDB触发Lambda函数。同样的架构也可以适用于Amazon Aurora MySQL兼容版。
解决方案概述
此解决方案包括将RDS for MySQL或MariaDB的审计日志发布到CloudWatch日志组,并创建一个CloudWatch订阅过滤器来触发Lambda函数。
下面的图表展示了解决方案的架构和流程。
在此解决方案中,由Amazon RDS for MySQL或MariaDB生成的审计日志将发布到CloudWatch日志组。CloudWatch订阅过滤器基于用户定义的模式过滤日志当发生模式匹配时,订阅过滤器将触发指定的Lambda函数,并将日志事件发送给Lambda函数。
接收到的日志以base64编码并使用gzip格式压缩。我们将向您展示如何解码日志事件,仅获取Lambda函数所需的有效负载。
要部署此解决方案,我们需要完成如下步骤对应于架构图中标记的组件:
在Amazon RDS for MySQL或MariaDB中创建一个表,以触发Lambda函数。启用RDS for MySQL或MariaDB实例的审计日志。将审计日志发布到CloudWatch日志组。创建Lambda函数。创建一个CloudWatch订阅过滤器。前提条件
要跟随本文,您应该拥有一个需要触发Lambda函数的RDS for MySQL或MariaDB数据库实例。本文中,我们的数据库实例命名为Lambdatriggermariadb。有关创建RDS实例的说明,请访问创建RDS实例。
在Amazon RDS for MySQL或MariaDB中创建触发Lambda函数的表
在这一步中,我们创建一个与需要触发的Lambda函数同名的表,表中只有一个列用于插入Lambda函数的JSON有效负载。请按照以下步骤创建表:
连接到您的RDS for MySQL或MariaDB实例,选择您希望创建表的数据库。创建名为 MyLambda 的表:
sqlCREATE TABLE MyLambda(json VARCHAR(100))
启用RDS for MySQL或MariaDB实例的审计日志
通过启用审计日志,您可以捕捉在RDS实例中运行的DML查询。与错误日志、一般日志和慢查询日志不同,审计日志在参数组中没有直接的参数可用。您必须使用MariaDB审计插件和选项组来启用RDS for MySQL或MariaDB实例的审计。步骤如下:
在Amazon RDS控制台上,创建选项组。添加MariaDB审计插件。修改您的RDS实例,以使用您刚创建的选项组。在Amazon Aurora MySQL中,您可以通过在DB集群参数组中将参数serverauditlogging设置为1来启用审计日志。详细步骤参见配置审计日志捕获Amazon RDS for MySQL和Amazon AuroraMySQL兼容的数据库活动。
在您启用RDS实例上的审计日志后,日志将在Amazon RDS控制台的实例详细信息页面的日志部分列出,如下图所示。
将审计日志发布到CloudWatch日志组
现在我们需要将日志发布到CloudWatch。完成以下步骤:
在Amazon RDS控制台中,选择您的RDS实例并选择修改。在日志导出部分,选择审计日志。选择继续。在摘要页面中,确认启用发布到CloudWatch日志下的新值中有审计日志。选择立即应用。选择修改DB实例。成功发布审计日志后,CloudWatch控制台中将列出日志组,其命名约定为aws/rds/instance/lt数据库名称gt/audit。
创建Lambda函数
要创建您的Lambda函数,请完成以下步骤:
在Lambda控制台中,导航到函数。选择创建函数。选择从头开始创建。在函数名称中,输入一个名称本文使用MyLambda。在运行时中,选择Python 312。在架构中,选择x8664。选择创建函数。在代码部分,输入以下代码以获取插入表中的JSON数据作为Lambda函数的有效负载。您可以根据需要修改代码以执行其他自定义操作。注意:异步Lambda函数的调用有效负载大小为256 KB。有关更多详细信息,请参阅Lambda配额。
pythonimport gzipimport jsonimport base64
def lambdahandler(event context) try encodedZippedData = event[awslogs][data] # 查找事件对象中的审计日志事件 zippedData = base64b64decode(encodedZippedData) # 从base64解码事件 byteData = gzipdecompress(zippedData) # 解压gzip decodedData = byteDatadecode(utf8) # 从字节解码为utf8字符串 eventMessage = jsonloads(decodedData) # 将字符串转换为JSON eventMessage = eventMessage[logEvents][0][message] eventMessage = eventMessagesplit(values() eventMessage = eventMessage[1] eventMessage = eventMessagesplit()) eventMessage = eventMessage[0] eventMessage = eventMessage[22] # 移除多余的 eventMessage = jsonloads(eventMessage)
print(eventMessage[payload1]) print(eventMessage[payload2]) # 您可以使用eventMessage变量中的有效负载,编写自己的代码。except Exception as e print(Lambda执行失败,错误信息: e)
创建CloudWatch订阅过滤器
CloudWatch订阅过滤器允许您通过定义的术语或模式过滤来自CloudWatch日志组的日志数据,并将其发送到Amazon Kinesis Data Streams、Amazon Kinesis Data Firehose或Lambda。在此案例中,我们将在名为MyLambda的表的审计日志上创建一个过滤器,用于匹配任何INSERT操作。您可以根据需要选择任何表或过滤模式。
完成以下步骤以创建CloudWatch订阅过滤器:
在CloudWatch控制台中,导航到日志中的日志组。选择实例的审计日志日志组aws/rds/instance/lt数据库名称gt/audit。在订阅过滤器选项卡的创建菜单中,选择创建Lambda订阅过滤器。在Lambda函数中,选择您创建的Lambda函数。选择日志格式为其他。在订阅过滤器模式中,输入insert into MyLambda。 订阅过滤器模式按照您提供的确切字符串过滤日志条目以触发Lambda函数。注意:订阅过滤器区分大小写。对于给定的过滤器,无法添加一个以上的模式;不过,您可以在一个日志组中添加多个订阅过滤器。
在订阅过滤器名称中,输入您选择的名称本文中使用MyInsertFilter。对于选择要测试的日志数据,选择您的DB实例的名称本文中使用Lambdatriggermariadb。选择测试模式以确认过滤器模式与日志组中的条目匹配。注意:测试模式仅显示最近50个日志条目。因此,完整日志中可能存在匹配模式,但测试返回零匹配的情况也可能发生。
选择开始流。过滤器现在将显示在CloudWatch控制台的日志组页面的订阅过滤器选项卡中。
验证解决方案是否有效
要验证解决方案是否有效,连接到RDS实例并运行您创建度量过滤条件的查询。

在以下示例中,我们使用MySQL CLI客户端连接到MariaDB实例并对MyLambda表执行插入查询:
sqlINSERT INTO MyLambda VALUES({payload1data1payload2data2})
我们可以看到Lambda函数被触发,并且在CloudWatch日志组中的日志中打印出一条消息。该日志组在CloudWatch控制台中以命名约定aws/lambda/ltlambda函数名称gt列出。
提示与故障排除
您可以使用任何其他MySQL或MariaDB日志例如一般日志、慢查询日志或错误日志来触发Lambda函数,使用本文中所示的相同架构。
请注意,在使用一般或慢查询日志时,您必须将logoutput参数设置为FILE,以便将日志推送到CloudWatch。
本文中的示例展示了如何触发Lambda函数并获取有效负载。您还可以将Lambda函数作为路由函数,从中触发其他Lambda函数只需将要触发的函数名称作为JSON中的有效负载传递。
如果Lambda函数没有触发,请检查以下内容:
日志已生成并推送到CloudWatch日志组订阅过滤器已按预期创建,并关联正确的Lambda函数清理
当您完成此解决方案后,请删除您创建的资源,以避免持续收费。
禁用审计日志。修改RDS实例,以停止将日志发布到CloudWatch。删除CloudWatch日志组。删除CloudWatch订阅过滤器。删除Lambda函数。结论
在本文中,我们展示了如何部署一个解决方案,从您的RDS for MySQL或MariaDB实例触发Lambda函数。
请今天就尝试一下,如果您有任何问题或建议请在下方留言。
免费APN加速器关于作者
Asad Aazam 是AWS的解决方案架构师,专注于AWS安全服务和AWS数据库技术,如Amazon Aurora、Amazon RDS和Amazon DynamoDB。他帮助进行同构与异构的数据库迁移和优化在AWS云中。他目前拥有12项AWS认证中的11项。工作之余,他喜欢骑自行车、旅行和享受大自然的美丽。