监控和警报 Amazon RDS 的 DDL 和 DCL 更改
关键要点
使用 Amazon CloudWatch、Amazon RDS 性能洞察和增强监控,可以构建强大的监控和警报体系。DDL数据定义语言和 DCL数据控制语言变更需要特别的监控,以保障 RDS 数据库实例的可用性和稳定性。本文将介绍如何通过使用 AWS Lambda 和 Amazon SNS 集成,设置 MySQL、MariaDB 和 Aurora MySQL 兼容版本的审计功能。在 Amazon RDS、MariaDB 和 Aurora MySQL 中有强大的监控和告警机制,但对于 DDL 和 DCL 的变更通知缺乏现成的解决方案。这些更改可能会影响数据库实例的可用性和稳定性。因此,按照本文的指导,我们将设置日志记录并集成其他 AWS 服务,从而实现 DDL 和 DCL 更改的通知。
解决方案概述
MariaDB 审计插件是一个开源插件,提供 MySQL 数据库引擎的审计功能。Amazon RDS 为 MySQL 数据库实例提供此插件,作为可添加到选项组的选项。该插件记录每个客户端会话的数据库活动,包括连接用户、执行的查询、访问的表和更改的服务器变量的信息。该审计插件已经开源,并可以在 GitHub 上找到 auditpluginformysql。
Aurora MySQL 兼容版利用先进的审计功能,使用自定义数据库集群参数组来捕获数据库活动。存储在日志文件中的记录会发布到 CloudWatch 日志以供处理,并通过 Lambda 解析发布的数据库审计日志,以发送通知至 Amazon SNS。
以下是我们解决方案架构的示意图:
要部署此解决方案,请按照以下步骤操作:
为 Amazon RDS 的 MySQL 或 MariaDB,使用选项组启用审计插件;对于 Aurora MySQL 兼容版,使用参数组启用高级审计。配置和启用审计以捕获 DDL 和 DCL 数据库活动。将 MySQL 审计日志发布到 CloudWatch 日志。 调整保留策略,以定义日志数据在日志组中存储的时间。创建一个 SNS 主题和订阅。创建一个 Lambda 函数,并添加触发器,通过 Lambda 函数解析数据库日志。先决条件
请参考以下 AWS 管理控制台的数据库创建说明:
对于 Amazon RDS 的 MySQL,请参见 创建并连接到 MySQL DB 实例对于 Amazon RDS 的 MariaDB,请参见 创建并连接到 MariaDB DB 实例对于 Aurora MySQL 兼容版,请参见 创建并连接到 Aurora MySQL DB 集群请按照以下说明启用 AWS Command Line InterfaceAWS CLI以便通过命令行与 AWS 服务进行交互:
安装,请参考 安装或更新 AWS CLI配置,请参考 新配置快速设置启用 Amazon RDS for MySQL 的审计插件
默认的 Amazon RDS for MySQL 选项组未启用审计插件。由于默认选项组无法修改,需创建一个 自定义选项组,并 添加选项,将其应用于 RDS 实例。启用审计插件,请完成以下步骤:
在 Amazon RDS 控制台中,选择左侧导航栏中的 选项组。选择 创建组。输入组名称,例如:customoptiongrpmysql57。输入描述信息。选择 引擎 为 mysql。选择 主要引擎版本 为您使用的引擎版本57。选择 创建。在 选项组 页面,选择您的选项组,然后选择 添加选项。在 选项名称 中,选择 MARIADBAUDITPLUGIN。在 选项设置 部分,根据需要修改所需的参数值: 在 选项设置 中,使用 SERVERAUDITEVENTS。在 值 中,使用 QUERYDDL QUERYDCL。选择 立即应用 为 是。选择 添加选项。以下是使用 AWS CLI 在 Amazon Linux 2 EC2 实例的终端窗口中创建选项组的命令:
bashaws rds createoptiongroup optiongroupname customoptiongrpmysql57 enginename mysql majorengineversion 57 optiongroupdescription MySQL 57 审计日志已启用
添加选项至选项组的命令:
bashaws rds addoptiontooptiongroup optiongroupname customoptiongrpmysql57 options [{OptionSettings[{NameSERVERAUDITEVENTSValueQUERYDDLQUERYDCL}]OptionNameMARIADBAUDITPLUGIN}] applyimmediately
启用 Aurora MySQL 兼容版的高级审计
启用 Aurora MySQL 兼容版的高级审计特性,须创建一个 自定义 DB 集群参数组,并启用高级审计。请按照以下步骤进行:
在 Amazon RDS 控制台中,选择 参数组。选择 创建参数组。在 参数组系列 中,选择 auroramysql57。在 类型 中,选择 DB 集群参数组。输入组名,例如:customauroramysqlcluster57。输入描述信息。选择 创建。在 参数组 页面中,选择参数组并从操作菜单中选择 编辑。在 参数 部分,按照需要修改参数值: 将服务器审计日志设置值修改为 1。将服务器审计事件的值设置为 QUERYDDL QUERYDCL。选择 保存更改。以下是使用 AWS CLI 在 Amazon Linux 2 EC2 实例中的命令,用于创建参数组:
bashaws rds createdbclusterparametergroup dbclusterparametergroupname customauroramysqlcluster57 dbparametergroupfamily auroramysql57 description 启用审计的 Aurora MySQL 集群参数组
实现参数组中的审计启用:
bashaws rds modifydbclusterparametergroup dbclusterparametergroupname customauroramysqlcluster57 parameters ParameterName=serverauditloggingParameterValue=1ApplyMethod=immediate ParameterName=serverauditeventsParameterValue=QUERYDDLQUERYDCLApplyMethod=immediate
修改 Amazon RDS for MySQL或 MariaDB或 Aurora MySQL 兼容版
现在,需将自定义选项组分配给 Amazon RDS for MySQL DB 实例,或将集群参数组分配给 Aurora MySQL 兼容版 DB 实例。按照以下步骤操作:
在 Amazon RDS 控制台中,选择左侧导航栏中的 数据库。选择你的 DB 实例,并选择 修改。在 其他配置 下,在 数据库选项 部分,修改以下内容: 对于 Amazon RDS for MySQL 或 MariaDB,选择您创建的自定义选项组。对于 Aurora MySQL 兼容版,选择您创建的自定义参数组。请注意,将此新参数组附加到 DB 实例需要重新启动该个 DB 实例。对于 Aurora MySQL 兼容版,修改集群后需要重启集群成员 DB 实例。
选择 继续。在 计划修改 下,选择 立即应用。选择 修改 DB 实例 或 修改集群。为验证更改,请在 Amazon Linux 2 EC2 实例的终端窗口中运行以下命令:bashmysql h u pEnter password
MySQL [(none)]gt SHOW VARIABLES LIKE serverauditlogging Variablename Value serverauditlogging ON 1 row in set (000 sec)
MySQL [(none)]gt SHOW VARIABLES LIKE serverauditevents Variablename Value serverauditevents QUERYDDLQUERYDCL 1 row in set (000 sec)

使用 AWS CLI 进行 Amazon RDS for MySQL 或 MariaDB 的修改与新选项组关联的命令如下:
bashaws rds modifydbinstance dbinstanceidentifier rdsmysql01 optiongroupname customoptiongrpmysql57 applyimmediately
验证的命令:
bashaws rds describedbinstances dbinstanceidentifier rdsmysql01
要修改 Aurora MySQL 兼容版以关联新参数组,使用以下代码:
bashaws rds modifydbcluster dbclusteridentifier auroramysql01 dbclusterparametergroupname customauroramysqlcluster57 applyimmediately
验证的命令:
bashaws rds describedbclusters dbclusteridentifier auroramysql01
得到的示例输出:
bashDBCLUSTERMEMBERS pendingreboot auroramysql01instance1 True
若要使更改生效,请重启 DB 集群成员,使用以下命令:
bashaws rds rebootdbinstance dbinstanceidentifier auroramysql01instance1
将 MySQL 审计日志发布到 CloudWatch 日志
启用审计选项后,需要将数据库日志发布到 CloudWatch 日志组。为此,请完成以下步骤:
在 Amazon RDS 控制台中,选择 数据库。选择您的 DB 实例并选择 修改。在 其他配置 下,在 日志导出 部分,选择 审计日志可选择性地,选择 错误日志、一般日志 和 慢查询日志。选择 继续。在 计划修改 下,选择 立即应用。选择 修改 DB 实例 或 修改集群。使用 AWS CLI,对于 Amazon RDS for MySQL,运行以下命令:
bashaws rds modifydbinstance dbinstanceidentifier rdsmysql01 cloudwatchlogsexportconfiguration {EnableLogTypes[auditerrorgeneralslowquery]}
对于 Aurora MySQL 兼容版,使用以下代码:
bashaws rds modifydbcluster dbclusteridentifier auroramysql01 cloudwatchlogsexportconfiguration {EnableLogTypes[auditerrorgeneralslowquery]}
创建 SNS 主题
SNS 主题充当通信渠道。要创建 SNS 主题,请按以下步骤进行:
在 Amazon SNS 控制台中,选择左侧导航栏中的 主题。选择 创建主题。在 类型 中,选择 标准。在 名称 中,输入名称例如,lambdardsnotification。根据企业标准提供任何可选详细信息。选择 创建主题。使用 AWS CLI,以下命令可在 Amazon Linux 2 EC2 实例的终端窗口中创建:
bashaws sns createtopic name lambdardsnotificationaws sns settopicattributes topicarn arnawssns[awsregion][youraccountnumber]lambdardsnotification attributename KmsMasterKeyId attributevalue KMSKEY
免费永久加速器苹果版创建 SNS 订阅
要接收发布到 SNS 主题的消息,必须将一个端点订阅到该主题。当订阅端点到主题时,该端点会接收分配给主题的消息。可以选择多种 端点类型;若要与外部服务和产品集成,请使用 HTTPS 协议及集成 URL。为此示例,我们使用电子邮件作为协议及邮箱作为端点。要创建订阅,请完成以下步骤:
在 Amazon SNS 控制台中,选择左侧导航栏中的 订阅。选择 创建订阅。在 主题 ARN 中,选择之前创建的 SNS 主题。在 协议 中,选择 电子邮件。在 端点 中,输入接收事件通知的电子邮件地址。根据企业标准提供任何可选详细信息。选择 创建订阅。使用 AWS CLI,在 Amazon Linux 2 EC2 实例的终端窗口中运行以下命令:
bashaws sns subscribe topicarn arnawssnsuseast100000lambdardsnotification protocol email notificationendpoint emailuser@domaincom
您应该会收到一封确认订阅的电子邮件。
选择 确认订阅。创建 Lambda 函数并添加触发器
Lambda 函数的执行角色是允许该函数访问 AWS 服务和资源的 AWS 身份和访问管理 (IAM) 角色。在这里创建一个具有访问 CloudWatch 和 Amazon SNS 的权限的执行角色。创建函数时提供执行角色。当调用函数时,Lambda 会通过采用此角色自动为您的函数提供临时凭证。您无需在函数代码中调用 stsAssumeRole。为确保 Lambda 能正确采用您的执行角色,角色的信任策略必须指定 Lambda 服务主体lambdaamazonawscom作为受信任的服务。请完成以下步骤以创建您的策略和角色:
创建一个 IAM 角色,并使用以下信任策略 (lambdatrustRDSnotificationjson) 以允许 Lambda 执行角色:json{ Version 20121017 Statement [ { Effect Allow Action [ stsAssumeRole ] Principal { Service [ lambdaamazonawscom ] } } ]}
创建角色:bashaws iam createrole rolename lambdaroleRDSnotification assumerolepolicy file//lambdatrustRDSnotificationjson
添加以下内联策略 (lambdapolicyRDSnotificationjson),以允许 Lambda 访问所需资源:json{ Version 20121017 Statement [ { Effect Allow Action [ logsCreateLogGroup snsPublish ] Resource [ arnawslogs[awsregion][youraccountnumber]loggroup[AuditLogGroup] arnawssns[awsregion][youraccountnumber][SNSTOPIC] arnawslambda[awsregion][youraccountnumber]function ] } { Effect Allow Action [ logsCreateLogStream logsPutLogEvents ] Resource [ arnawslogs[awsregion][youraccountnumber]loggroup/aws/lambda/ ] } { Effect
发表评论