AWS DMS エラーログの削除プロセスを自動化してレプリケーションインスタンスのストレージが満杯にならないようにするにはどうすればよいですか?

最終更新日: 2021 年 6 月 4 日

AWS Database Migration Service (AWS DMS) エラーログの削除プロセスを自動化して削除をより頻繁に実行したいと考えています。これを行うにはどうすればよいですか?

簡単な説明

AWS DMS エラーログが DMS レプリケーションインスタンスで多くの容量を消費する場合、レプリケーションインスタンスの状態が storage-full になる可能性があります。この問題を解決するには、DMS タスクの DMS タスクエラーログを削除します。

AWS DMS タスクのエラーログは、次のいずれかの方法を使用して削除できます。

  • AWS DMS コンソールを使用する
  • AWS コマンドラインインターフェイス (AWS CLI) を使用する
  • API を使用する (この例では Python で実装)

注意: ストレージが満杯になる原因は他にも多数存在します。AWS DMS のストレージが満杯になる問題の解決方法に関する詳細については、「AWS DMS レプリケーション DB インスタンスがストレージ不足のステータスなのはなぜですか?」を参照してください。

解決方法

注意: AWS コマンドラインインターフェイス (AWS CLI) コマンド実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

AWS DMS コンソールを使用したエラーログの削除

DMS タスクのエラーログを手動で削除するには、「AWS DMS の Amazon CloudWatch Logs を有効化、アクセス、削除する方法を教えてください」を参照してください。

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 パラメータを使用してタスク設定を毎回変更します。この AWS CLI コマンドは、cronjob を使用して定期的に実行されるようにスケジュールできます。タスク設定の変更に関する詳細については、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.    [Function name] (関数名) に名前を入力します。

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.    [Create function] を選択します。

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 コンソールを開き、先ほど作成した 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.    [Test] (テスト) をクリックします。デフォルトテンプレートを使用して、[Event name] (イベント名) を入力します。

13.    [Create] (作成) をクリックします。

14.    もう一度 [Test] (テスト) を選択すると、コードがエラーを生じることなく実行されます。

これらの手順を実行すると、DMS タスクのステータスが変更中に変わります。それと同時に、レプリケーションインスタンス下の DMS タスクのエラーログが削除されていることがわかります。

Lambda スケジューラを使用した自動化

Lambda スケジューラを使用して DMS タスクエラーログの削除を自動化するには、次の手順に従います。

1.    Lambda コンソールを開き、先ほど作成した Lambda 関数を選択します。

2.    [Designer] (デザイナー) で [Add trigger] (トリガーを追加) をクリックします。

3.    ドロップダウンリストから [EventBridge (Cloudwatch Events)] を選択します。

4.    [Rule] (ルール) には、[Create a new rule] (新規ルールの作成) を選択します。

5.    [Rule name] (ルール名) と [Rule description] (ルールの説明) に入力します。

6.    コードを 7 日ごとに実行するには、[schedule expression] (スケジュール式) に rate (7 days) を入力します。より柔軟な式については、「Rate または Cron を使用したスケジュール式」を参照してください。

7.    [Add] を選択します。

これらの手順を完了すると、指定された DMS ログが 7 日間に 1 回削除されるようにオートメーションがセットアップされます。

注意: このコードは、ビジネス要件に応じて変更し、最適化することができます。cronjob または Lambda スケジューラを使用して、このスクリプトが定期的に実行されるようにスケジュールすることも可能です。