如何自动执行 AWS DMS 错误日志删除过程,以避免复制实例上存储被占满?

上次更新时间:2021 年 6 月 4 日

我想自动执行 AWS Database Migration Service (AWS DMS) 错误日志删除过程,以便更频繁地删除。我该如何操作?

简短描述

如果您的 AWS DMS 错误日志占用 DMS 复制实例中的大量空间,则复制实例可能会进入存储已满状态。要解决此问题,请删除 DMS 任务的 DMS 任务错误日志。

您可以使用以下方法之一删除 AWS DMS 任务的错误日志:

  • 使用 AWS DMS 控制台
  • 使用 AWS 命令行界面 (AWS CLI)
  • 使用 API(在本例中使用 Python 实现)

注意:导致出现存储被占满的情况还有许多其他原因。有关解决 AWS DMS 存储被占满问题的更多信息,请参阅为什么我的 AWS DMS 复制数据库实例状态为存储已满?

解决方法

注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您运行的是最新版本的 AWS CLI

使用 AWS DMS 控制台删除错误日志

要手动删除 DMS 任务的错误日志,请参阅如何启用、访问和删除 AWS DMS 的 Amazon CloudWatch 日志?

使用 AWS CLI 删除错误日志

您可以使用以下 AWS CLI 命令修改任务设置来删除 DMS 任务日志:

aws dms modify-replication-task --replication-task-arn <DMS task ARN> --replication-task-settings '{"Logging": { "DeleteTaskLogs": true}}'

此命令通过更改 "DeleteTaskLogs": true 参数修改任务。添加具有此参数和值的任务设置后,此任务的所有日志都将从复制实例中删除。删除日志后,"DeleteTaskLogs": true 参数将从任务设置中删除。运行此命令后,确认已从复制实例中删除日志。

要定期删除日志,请每次都使用 "DeleteTaskLogs": true 参数来修改任务设置。您可以使用 cronjob 安排此 AWS CLI 命令定期运行。有关修改任务设置的更多信息,请参阅 AWS CLI 参考中的 modify-replication-task

使用 API (Lambda) 自动执行任务日志删除过程

对于所有复制实例,AWS DMS 任务日志将每 7 天删除一次。要提升日志的删除频率,您可以创建脚本来自动执行删除过程,每天运行或按照所需频率运行。此示例使用简单的 Python 代码通过 AWS Lambda 自动删除提供的任务 ARN 的任务错误日志。

设置 Lambda 函数

要设置 Lambda 函数,请执行以下步骤:

1.    打开 Lambda 控制台,然后选择包含 DMS 资源的 AWS 区域。

2.    从 Functions(函数)面板中,选择 Create function(创建函数)。

3.    输入函数名称

4.    对于 Runtime(运行时),选择 python 3.8

5.    对于 Change default execution role(更改默认执行角色),选择 Create a new role with basic Lambda permissions(创建具有基本 Lambda 权限的新角色)。记下 Lambda 创建的 AWS Identity and Access Management (IAM) 角色名称。

6.    选择创建函数

7.    打开 AWS IAM 控制台,然后打开 Lambda 函数创建的 IAM 角色。

8.    使用以下 JSON 创建 IAM 策略。确保替换资源的任务 ARN:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "dms:ModifyReplicationTask"
            ],
            "Resource": "arn:aws:dms:us-east-1:1234567890:task:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
        }
    ]
}

9.    将新创建的策略附加到 Lambda 函数创建的角色。

10.    打开 Lambda 控制台,然后选择您创建的函数。

11.    对于 Function code(函数代码),输入以下代码,然后单击 Deploy(部署):

import boto3
import json
client = boto3.client('dms')
def lambda_handler(event, context):
    # specific task ARN
    taskarn = 'arn:aws:dms:us-east-1:1234567890:task:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
    # modify the DMS task
    response = client.modify_replication_task(
        ReplicationTaskArn=taskarn,
        ReplicationTaskSettings='{"Logging": { "DeleteTaskLogs": true}}'
    )

12.    选择测试,然后使用默认模板输入事件名称

13.    选择创建

14.    再次选择测试,代码运行且没有错误。

执行这些步骤后,DMS 任务状态将更改为正在修改。同时,您会看到复制实例下的 DMS 任务错误日志已删除。

使用 Lambda 计划程序自动执行

要使用 Lambda 计划程序自动删除 DMS 任务错误日志,请执行以下步骤:

1.    打开 Lambda 控制台,然后选择您创建的 Lambda 函数。

2.    对于 Designer(设计程序),选择 Add trigger(添加触发器)。

3.    从下拉列表中,选择 EventBridge (Cloudwatch Events)

4.    对于 Rule(规则),选择 Create a new rule(创建新规则)。

5.    输入规则名称规则描述

6.    要每七天运行一次代码,对于 schedule expression(计划表达式),请输入 rate (7 days)。有关更灵活的表达式,请参阅使用 rate 或 cron 的计划表达式

7.    选择 Add(添加)。

完成这些步骤后,自动化过程将设置为每七天删除一次指定的 DMS 日志。

注意:您可以根据业务要求更改和优化此代码。您还可以使用 cronjob 或 Lambda 计划程序来计划此脚本,使其定期运行。