AWS Backupで間引きながらバックアップする

2019.07.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

バックアップ運用において、時間の経過したバックアップを間引きくことが求められることがあります。 AWS Backupを使い、このようなバックアップポリシーを実現する方法を紹介します。

説明

AWS Backupではバックアッププランは複数のバックアップルールを設定でき、バックアップルールはそれぞれ異なるスケジュール・ライフサイクルを設定できます。 間引きパターンごとにルールを用意することで、バックアップの間引き運用が可能になります。

AWS Backup で間引く設定例

過去1週間は毎日バックアップを取り、週1のバックアップを4週間分残し、月1のバックアップを3ヶ月分残したい場合、次の様にルール設定すれば実現できます(※ニュアンスを優先しているため、一部厳密さが欠けています)。

ルール名 頻度 バックアップウィンドウ 有効期限切れ
DailyBackup 毎日 揃える 作成後の週数:1
WeeklyBackup 毎週(曜日を一つチェック) 揃える 作成後の週数:4
MonthlyBackup 毎日(1日を選択) 揃える 作成後の月数:3

複数のルールでバックアップスケジュールが重なると、保持期間が一番長いルールのジョブだけが実行されます。 同じリカバリポイントのバックアップが重複して作成されることはありません。

例えば、DailyBackup/Weekly/Monthly の3つのルールがかぶると、MonthlyBackup ルールのジョブだけが実行され、作成されたバックアップの有効期限は3ヶ月後です。

間引きイメージ

7/1 から上記設定で間引きバックアップ運用を行い、初日の7/1は3つのルールのバックアップスケジュールが被ったとします。

その前提で、どのルールを元にして日々バックアップジョブが実行されるのかをまとめたのが次の表です。

縦がジョブ実行日、横がルールです。 ジョブ実行された組み合わせのセルは背景色をつけ、セル内の日付は、作成されたバックアップが expire する日です。

間引きバックアップする CloudFormation テンプレート

サンプルと同じルールを作成する CloudFormation テンプレートです。

スケジュール( ScheduleExpression)は cron 表記で指定し、保持期間(Lifecycle::DeleteAfterDays)は日数で指定します。

このテンプレートは下記 AWS Backup リソースを作成します。

  • Vault : BackupVaultWithThinBackups
  • Plan : BackupPlanWithThinBackups
  • Rule :
  • RuleForDailyBackups
  • RuleForWeeklyBackups
  • RuleForMonthlyBackups

作成されたリソースを AWS CLI から確認します。

$ aws backup get-backup-plan \
  --backup-plan-id XXX
{
    "BackupPlan": {
        "BackupPlanName": "BackupPlanWithThinBackups",
        "Rules": [
            {
                "RuleName": "RuleForDailyBackups",
                "TargetBackupVaultName": "BackupVaultWithThinBackups",
                "ScheduleExpression": "cron(0 5 ? * * *)",
                "StartWindowMinutes": 480,
                "CompletionWindowMinutes": 10080,
                "Lifecycle": {
                    "DeleteAfterDays": 7
                },
                "RuleId": "31b4bbaf-db07-4ec8-a066-a412f8645f76"
            },
            {
                "RuleName": "RuleForWeeklyBackups",
                "TargetBackupVaultName": "BackupVaultWithThinBackups",
                "ScheduleExpression": "cron(0 5 ? * 1 *)",
                "StartWindowMinutes": 480,
                "CompletionWindowMinutes": 10080,
                "Lifecycle": {
                    "DeleteAfterDays": 28
                },
                "RuleId": "b2fa2c23-d602-4084-bcab-8fcb8fca6d1e"
            },
            {
                "RuleName": "RuleForMonthlyBackups",
                "TargetBackupVaultName": "BackupVaultWithThinBackups",
                "ScheduleExpression": "cron(0 5 1 * ? *)",
                "StartWindowMinutes": 480,
                "CompletionWindowMinutes": 10080,
                "Lifecycle": {
                    "DeleteAfterDays": 90
                },
                "RuleId": "9b05e54e-e3b9-4804-89c1-0ec9009b362d"
            }
        ]
    },
    "BackupPlanId": "XXX",
    "BackupPlanArn": "arn:aws:backup:eu-central-1:123456789012:backup-plan:XXX",
    "VersionId": "...",
    "CreatorRequestId": "...",
    "CreationDate": 1563641883.655
}

まとめ

複雑なバックアップスケジュール設定を実現したい場合、これまではCloudWatch EventsとLambda の合わせ技で頑張ることが多かったかと思います。 AWS Backup を使うことで、複雑なスケジュール・ライフサイクル管理をコーディングなしに実現できます。

この柔軟さは、RDS/EBS といったサービス固有のバックアップ機能にはないメリットかと思います。