监控和警报 Amazon RDS for

监控和警报 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 上找到 - 。

Aurora MySQL 兼容版利用先进的审计功能,使用自定义数据库集群参数组来捕获数据库活动。存储在日志文件中的记录会发布到 CloudWatch日志以供处理,并通过 Lambda 解析发布的数据库审计日志,以发送通知至 Amazon SNS。

以下是我们解决方案架构的示意图:

删除)

要部署此解决方案,请按照以下步骤操作:

  1. 为 Amazon RDS 的 MySQL 或 MariaDB,使用选项组启用审计插件;对于 Aurora MySQL 兼容版,使用参数组启用高级审计。
  2. 配置和启用审计以捕获 DDL 和 DCL 数据库活动。
  3. 将 MySQL 审计日志发布到 CloudWatch 日志。 ,以定义日志数据在日志组中存储的时间。
  4. 创建一个 SNS 主题和订阅。
  5. 创建一个 Lambda 函数,并添加触发器,通过 Lambda 函数解析数据库日志。

先决条件

请参考以下 AWS 管理控制台的数据库创建说明:

  • 对于 Amazon RDS 的 MySQL,请参见
  • 对于 Amazon RDS 的 MariaDB,请参见
  • 对于 Aurora MySQL 兼容版,请参见

请按照以下说明启用 (AWSCLI)以便通过命令行与 AWS 服务进行交互:

  • 安装,请参考
  • 配置,请参考

启用 Amazon RDS for MySQL 的审计插件

默认的 Amazon RDS for MySQL 选项组未启用审计插件。由于默认选项组无法修改,需创建一个 ,并 ,将其应用于 RDS 实例。启用审计插件,请完成以下步骤:

  1. 在 Amazon RDS 控制台中,选择左侧导航栏中的 选项组
  2. 选择 创建组
  3. 输入组名称,例如:custom-option-grp-mysql-5-7
  4. 输入描述信息。
  5. 选择 引擎mysql
  6. 选择 主要引擎版本 为您使用的引擎版本(5.7)。
  7. 选择 创建
  8. 选项组 页面,选择您的选项组,然后选择 添加选项
  9. 选项名称 中,选择 MARIADB_AUDIT_PLUGIN
  10. 选项设置 部分,根据需要修改所需的参数值: 1. 在 选项设置 中,使用 SERVER_AUDIT_EVENTS。 2. 在 中,使用 QUERY_DDL, QUERY_DCL
  11. 选择 立即应用
  12. 选择 添加选项

以下是使用 AWS CLI 在 Amazon Linux 2 EC2 实例的终端窗口中创建选项组的命令:

bash aws rds create-option-group \ --option-group-name custom-option-grp- mysql-5-7 \ --engine-name mysql \ --major-engine-version 5.7 \ --option-group- description "MySQL 5.7 审计日志已启用"

添加选项至选项组的命令:

`bash aws rds add-option-to-option-group \ --option-group-name custom-option- grp-mysql-5-7 \ --options ',并启用高级审计。请按照以下步骤进行:

  1. 在 Amazon RDS 控制台中,选择 参数组
  2. 选择 创建参数组
  3. 参数组系列 中,选择 aurora-mysql5.7
  4. 类型 中,选择 DB 集群参数组
  5. 输入组名,例如:custom-aurora-mysql-cluster-5-7
  6. 输入描述信息。
  7. 选择 创建
  8. 参数组 页面中,选择参数组并从操作菜单中选择 编辑
  9. 参数 部分,按照需要修改参数值: 1. 将服务器审计日志设置值修改为 1。 2. 将服务器审计事件的值设置为 QUERY_DDL, QUERY_DCL
  10. 选择 保存更改

以下是使用 AWS CLI 在 Amazon Linux 2 EC2 实例中的命令,用于创建参数组:

bash aws rds create-db-cluster-parameter-group \ --db-cluster-parameter- group-name custom-aurora-mysql-cluster-5-7 \ --db-parameter-group-familyaurora-mysql5.7 \ --description "启用审计的 Aurora MySQL 集群参数组"

实现参数组中的审计启用:

bash aws rds modify-db-cluster-parameter-group \ --db-cluster-parameter- group-name custom-aurora-mysql-cluster-5-7 \ --parameters "ParameterName=server_audit_logging,ParameterValue=1,ApplyMethod=immediate" \ "ParameterName=server_audit_events,ParameterValue='QUERY_DDL,QUERY_DCL',ApplyMethod=immediate"

修改 Amazon RDS for MySQL(或 MariaDB)或 Aurora MySQL 兼容版

现在,需将自定义选项组分配给 Amazon RDS for MySQL DB 实例,或将集群参数组分配给 Aurora MySQL 兼容版 DB实例。按照以下步骤操作:

  1. 在 Amazon RDS 控制台中,选择左侧导航栏中的 数据库
  2. 选择你的 DB 实例,并选择 修改
  3. 其他配置 下,在 数据库选项 部分,修改以下内容: 1. 对于 Amazon RDS for MySQL 或 MariaDB,选择您创建的自定义选项组。 2. 对于 Aurora MySQL 兼容版,选择您创建的自定义参数组。

请注意,将此新参数组附加到 DB 实例需要重新启动该个 DB 实例。对于 Aurora MySQL 兼容版,修改集群后需要重启集群成员 DB 实例。

  1. 选择 继续
  2. 计划修改 下,选择 立即应用
  3. 选择 修改 DB 实例修改集群
  4. 为验证更改,请在 Amazon Linux 2 EC2 实例的终端窗口中运行以下命令:

MySQL [(none)]> SHOW VARIABLES LIKE '%server_audit_logging%'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | server_audit_logging | ON | +----------------------+-------+ 1 row in set (0.00 sec)

MySQL [(none)]> SHOW VARIABLES LIKE '%server_audit_events%'; +---------------------+---------------------+ | Variable_name | Value | +---------------------+---------------------+ | server_audit_events | QUERY_DDL,QUERY_DCL | +---------------------+---------------------+ 1 row in set (0.00 sec) ```

使用 AWS CLI 进行 Amazon RDS for MySQL 或 MariaDB 的修改与新选项组关联的命令如下:

`bash aws rds modify-db-instance \ --db-instance-identifier rds-mysql-01 \
--option-group-name custom-option-grp-mysql-5-7 \ --apply-immediately`

验证的命令:

`bash aws rds describe-db-instances \ --db-instance-identifier rds-mysql-01`

要修改 Aurora MySQL 兼容版以关联新参数组,使用以下代码:

`bash aws rds modify-db-cluster \ --db-cluster-identifier aurora-mysql-01 \
--db-cluster-parameter-group-name custom-aurora-mysql-cluster-5-7 \ --apply-
immediately`

验证的命令:

`bash aws rds describe-db-clusters \ --db-cluster-identifier aurora-mysql-01`

得到的示例输出:

`bash DBCLUSTERMEMBERS pending-reboot aurora-mysql-01-instance-1 True`

若要使更改生效,请重启 DB 集群成员,使用以下命令:

`bash aws rds reboot-db-instance \ --db-instance-identifier aurora-
mysql-01-instance-1`

## 将 MySQL 审计日志发布到 CloudWatch 日志

启用审计选项后,需要将数据库日志发布到 CloudWatch 日志组。为此,请完成以下步骤:

  1. 在 Amazon RDS 控制台中,选择 **数据库** 。
  2. 选择您的 DB 实例并选择 **修改** 。
  3. 在 **其他配置** 下,在 **日志导出** 部分,选择 **审计日志** (可选择性地,选择 **错误日志** 、**一般日志** 和 **慢查询日志** )。
  4. 选择 **继续** 。
  5. 在 **计划修改** 下,选择 **立即应用** 。
  6. 选择 **修改 DB 实例** 或 **修改集群** 。

使用 AWS CLI,对于 Amazon RDS for MySQL,运行以下命令:

`bash aws rds modify-db-instance \ --db-instance-identifier rds-mysql-01 \
--cloudwatch-logs-export-configuration
'{"EnableLogTypes":;若要与外部服务和产品集成,请使用 HTTPS 协议及集成
URL。为此示例,我们使用电子邮件作为协议及邮箱作为端点。要创建订阅,请完成以下步骤:

  1. 在 Amazon SNS 控制台中,选择左侧导航栏中的 **订阅** 。
  2. 选择 **创建订阅** 。
  3. 在 **主题 ARN** 中,选择之前创建的 SNS 主题。
  4. 在 **协议** 中,选择 **电子邮件** 。
  5. 在 **端点** 中,输入接收事件通知的电子邮件地址。
  6. 根据企业标准提供任何可选详细信息。
  7. 选择 **创建订阅** 。

使用 AWS CLI,在 Amazon Linux 2 EC2 实例的终端窗口中运行以下命令:

`bash aws sns subscribe \ --topic-arn arn:aws:sns:us-east-1:00000:lambda-rds-
notification \ --protocol email \ [email protected]`

您应该会收到一封确认订阅的电子邮件。

  1. 选择 **确认订阅** 。

## 创建 Lambda 函数并添加触发器

Lambda 函数的执行角色是允许该函数访问 AWS 服务和资源的 
(IAM) 角色。在这里创建一个具有访问 CloudWatch 和 Amazon SNS的权限的执行角色。创建函数时提供执行角色。当调用函数时,Lambda 会通过采用此角色自动为您的函数提供临时凭证。您无需在函数代码中调用
`sts:AssumeRole`。为确保 Lambda 能正确采用您的执行角色,角色的信任策略必须指定 Lambda服务主体(lambda.amazonaws.com)作为受信任的服务。请完成以下步骤以创建您的策略和角色:

  1. 创建一个 IAM 角色,并使用以下信任策略 (`lambda_trust_RDS_notification.json`) 以允许 Lambda 执行角色:

`json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action":
[ "sts:AssumeRole" ], "Principal": { "Service": [ "lambda.amazonaws.com" ] } }
] }`

  1. 创建角色:

`bash aws iam create-role \ --role-name lambdarole_RDS_notification \
--assume-role-policy file://lambda_trust_RDS_notification.json`

  1. 添加以下内联策略 (`lambda_policy_RDS_notification.json`),以允许 Lambda 访问所需资源:

```json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow",
"Action": [ "logs:CreateLogGroup", "sns:Publish" ], "Resource": [
"arn:aws:logs:[aws-region]:[your-account-number]:log-group:[AuditLogGroup]:_",
"arn:aws:sns:[aws-region]:[your-account-number]:[SNS-TOPIC]",
"arn:aws:lambda:[aws-region]:[your-account-number]:function:_ " ] }, {
"Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ],
"Resource": [ "arn:aws:logs:[aws-region]:[your-account-number]:log-
group:/aws/lambda/*" ] }, { "Effect":

Leave a Reply

Required fields are marked *