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を候補に入れていきたいと思います・