1. はじめに

AWSでAuorora, S3, EFSのバックアップ方法について検討していると、AWS Bacupというサービスがあることがわかりました。

RDSなどのサービスにはAWS Backupを利用せずに個別でバックアップ機能が備えられていますが、

AWS Backupを利用するメリット等、調べていました。

2. AWS Backupとは

AWS Backupとは、AWSのさまざまなサービスにわたるバックアップを一元的に管理し、自動化するためのバックアップサービスです。AWS Backupを利用することで、複数のサービス(Amazon Aurora, Amazon S3, Amazon EFS, Amazon EC2, Amazon RDSなど)のバックアップを一元的に定義・実行できます。 ※この記事では、Amazon Aurora のバックアップについて取り扱います。

3. 構成要素

AWS Backupは、主に以下の3つの要素で構成されています。これらが連携することで、バックアップの**「どこに」「何を」「いつ・どのように」**実行するかを定義し、管理します。

3.1. バックアップボールト (Backup Vault)

これは、作成されたバックアップデータが安全に保存される保管場所です。

保存場所: バックアップボールトは、バックアップされたリソースのデータが保管される場所です。

暗号化: バックアップデータは、KMSキーを使用して暗号化され、安全性が確保されます。

アクセス制御: IAMポリシーを使用して、誰が、いつ、どのようにボールト内のデータにアクセスできるかを厳密に制御できます。

ロック機能: ボールト内のバックアップを一定期間変更・削除できないようにロックする機能(Vault Lock)があり、コンプライアンス要件への対応に役立ちます。

3.2. バックアッププラン (Backup Plan)

これは、**「いつ、どのように」**バックアップを作成するかを定義する要素です。

スケジュール設定: バックアップを作成する頻度(日次、週次、月次など)と時刻を定義します。

頻度とウィンドウ: バックアップジョブを実行する時間帯(バックアップウィンドウ)や、許容される完了時間を設定できます。

ライフサイクル設定: バックアップの保持期間を定義します。また、コールドストレージへの階層化(例:30日後に低コストのストレージに移行)のポリシーを設定し、コスト効率を高めることができます。

コピー設定: 異なるAWSリージョンや、別のAWSアカウントのバックアップボールトへ、自動的にバックアップをコピーする設定(クロスリージョン/クロスアカウントコピー)を含めることができます。

3.3. バックアップセレクション (Backup Selection)

これは、**「どのAWSリソース」**をバックアッププランの対象とするかを定義するものです。

対象リソースの特定: 特定のAWSリソースタイプ(Aurora DBクラスタ、S3バケット、EFSファイルシステムなど)の中から、実際にバックアップを取得するインスタンスやボリューム、ファイルシステムを指定します。

4. メリット

4.1 一元管理

AWS Backupを利用することで、バックアップの一元管理を行うことが可能です。 Amazon Aurora のクラスターを複数管理しているアカウントがあるとします。 これらのクラスターごとでバックアップ設定を行うことは、手間がかかります。

しかし、AWS Backup のバックプランを一つ設定し、複数のAmazon Aurora クラスターと紐付けることで パックアッププランを一元管理することができ、運用負荷を下げることが可能です。

4.2 バックアップライフサイクル管理

自動保持と削除の設定を行うことができ、不要なバックアップを削除管理を設定することができ削除漏れによる意図しないコスト発生を防ぐことが可能です。

5 . AWS Backup設定

AWS Backupの検証時に作成した CloudFormationテンプレートを共有します。 ※ VPCは事前に作成ください。

5.1 Amazon Auroraの設定

AWSTemplateFormatVersion: 2010-09-09
Description: ECS Cluster

Parameters:
  ProjectName:
    Description: Project Name
    Type: String

Resources:
  # Clusterとパラメーターグループとサブネットグループ
  RdsDbCluster:
    Type: 'AWS::RDS::DBCluster'
    Properties:
      AvailabilityZones:
        - !Select [0, !GetAZs '']
        - !Select [2, !GetAZs '']
      BackupRetentionPeriod: 7
      DBClusterIdentifier: !Sub '${ProjectName}-database'
      DBClusterParameterGroupName: !Sub '${ProjectName}-aurora-parameter-group'
      # Subnet group 作成する
      DatabaseName: gym_db
      DBSubnetGroupName: !Sub '${ProjectName}-aurora-subnet-group'
      Engine: 'aurora-mysql'
      Port: 3306
      MasterUsername: 'admin_user'
      MasterUserPassword: "{{resolve:ssm-secure:/database_pw}}"
      PreferredBackupWindow: '17:20-17:50'
      PreferredMaintenanceWindow: 'sun:15:00-sun:16:00'
      VpcSecurityGroupIds:
        - !ImportValue 'SgDbSecurityGroup'
      StorageEncrypted: true
      EnableIAMDatabaseAuthentication: false
      # 通常のAuroraかAurora Serverlessか選択可能
      EngineMode: 'provisioned'
      DeletionProtection: false
      EnableHttpEndpoint: false

  AuroraSubnetGroup:
    Type: AWS::RDS::DBSubnetGroup
    Properties:
      DBSubnetGroupDescription: 'subnet group'
      DBSubnetGroupName: !Sub '${ProjectName}-aurora-subnet-group'
      SubnetIds:
        - !ImportValue DbPrivateSubnetAZ1
        - !ImportValue DbPrivateSubnetAZ2

  AuroraClusterParameterGroup:
    Type: AWS::RDS::DBClusterParameterGroup
    Properties:
      Description: Aurora MySQL 8.0 cluster parameter group
      DBClusterParameterGroupName: !Sub '${ProjectName}-aurora-parameter-group'
      Family: aurora-mysql8.0
      Parameters:
        time_zone: Asia/Tokyo
        character_set_database: utf8mb4
      Tags:
        - Key: Name
          Value: !Sub '${ProjectName}-aurora-cluster-param-group'

  DbInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      AllowMajorVersionUpgrade: false
      # DBインスタンスの変更を即時反映させるかメンテナンスウィンドウ時に反映させるか
      ApplyImmediately: true
      AutoMinorVersionUpgrade: false
      # 自動バックアップの保持期間
      BackupRetentionPeriod: 0
      DBClusterIdentifier: !Ref RdsDbCluster
      DBInstanceClass: db.t3.medium
      DBInstanceIdentifier: !Sub '${ProjectName}-db-instance'
      DBSubnetGroupName: !Sub '${ProjectName}-aurora-subnet-group'
      DeleteAutomatedBackups: true
      Engine: aurora-mysql
      PreferredMaintenanceWindow: 'sun:17:00-sun:17:30'
      PubliclyAccessible: false

Outputs:
  AuroraClusterArn:
    Value: !Sub "arn:aws:rds:${AWS::Region}:${AWS::AccountId}:cluster:${RdsDbCluster}"
    Export:
      Name: !Sub "${ProjectName}-rds-db-cluster-arn"

5.2 AWS Backupの設定

AWSTemplateFormatVersion: 2010-09-09
Description: AWS Backup for Aurora

Parameters:
  ProjectName:
    Description: Project Name
    Type: String

Resources:
  # バックアップボールト
  AuroraBackupVault:
    Type: AWS::Backup::BackupVault
    Properties:
      BackupVaultName: !Sub "${ProjectName}-aurora-backup-vault"

  # バックアッププラン
  AuroraBackupPlan:
    Type: AWS::Backup::BackupPlan
    DependsOn: AuroraBackupVault
    Properties:
      BackupPlan: 
        BackupPlanName: !Sub "${ProjectName}-aurora-backup-plan"
        BackupPlanRule: 
          - EnableContinuousBackup: true
            RuleName: !Sub "${ProjectName}-aurora-backup-rule"
            ScheduleExpression: "cron(0 2 * * ? *)"
            ScheduleExpressionTimezone: "Asia/Tokyo"
            StartWindowMinutes: 60
            TargetBackupVault: !Ref AuroraBackupVault
            Lifecycle: 
              DeleteAfterDays: 35

  AuroraBackuoSelection:
    Type: AWS::Backup::BackupSelection
    Properties:
      BackupPlanId: !Ref AuroraBackupPlan
      BackupSelection:
        SelectionName: !Sub "${ProjectName}-aurora-selection"
        IamRoleArn: !Sub "arn:aws:iam::${AWS::AccountId}:role/service-role/AWSBackupDefaultServiceRole"
        Resources:
          - !ImportValue "project-rds-db-cluster-arn"

1. おわりに

今回は、AWS Backup について調べてみました。AWS Backupを利用することで、バックアップの設定を一元的に設定・管理できる点が便利だとおもいました。実運用ではAmazon Auroraのクラスターが数十台稼働していることが多く設定漏れ等が起こりうるので運用視点で見ると便利なサービスだと感じました。

また、ボールトロック機能があるため、バックアップの削除保護も行うことができるとともにバックアップ保護の観点での社内のコンプライアンスを満たすことができます。

AWS サービスのバックアップを検討する際はAWS Backupを候補に入れていきたいと思います・

1. 参考ページ

バックアップボールト