こんにちは、広野です。
AWS Backup を使うと、リソースのタグベースで簡単にバックアップが取れるので使わない手はないです。
手動で定義をするのが面倒だったので、AWS CloudFormation で Amazon DynamoDB 用の AWS Backup 定義を実装した例を紹介します。
やりたいこと
- Amazon DynamoDB テーブルのバックアップを、AWS Backup で取得する。
- Amazon DynamoDB、AWS Backup の実装は AWS CloudFormation で行う。
実装方法
- Amazon DynamoDB テーブルに対して、AWS Backup でバックアップを取得する。
- Amazon DynamoDB テーブルと AWS Backup は AWS CloudFormation でプロビジョニングする。
- バックアッププランは以下の通り。
- 毎日 19:00 UTC / 4:00 JST より 8 時間以内に開始、7日間保存
- 毎週月曜日 19:30 UTC / 4:30 JST より 8 時間以内に開始、28日間保存
- 毎月 1 日 20:00 UTC/ 5:00 JST より 8 時間以内に開始、90日間保存
- バックアップ対象リソースは以下のタグを持つリソースとする。
キー: Backup
バリュー: Backup-example - Amazon DynamoDB テーブルのバックアップを AWS Backup で取得できるようにするため、Amazon DynamoDB の PITR (Point In Time Recovery) を有効にする。
DynamoDB の P oint-in-time 復旧 - Amazon DynamoDB
point-in-time DynamoDB テーブルを、リカバリによる誤った書き込みまたは削除オペレーションから保護します。
AWS CloudFormation テンプレート
Amazon DynamoDB
AWSTemplateFormatVersion: 2010-09-09 Description: CloudFormation template that creates a sample DynamoDB table. # ------------------------------------------------------------# # Input Parameters # ------------------------------------------------------------# Parameters: SystemName: Type: String Description: The system name. Default: example MaxLength: 10 MinLength: 1 Resources: # ------------------------------------------------------------# # DynamoDB # ------------------------------------------------------------# DynamoExample: Type: AWS::DynamoDB::Table Properties: TableName: !Sub example-${SystemName} AttributeDefinitions: - AttributeName: pkey AttributeType: S - AttributeName: skey AttributeType: S BillingMode: PAY_PER_REQUEST KeySchema: - AttributeName: pkey KeyType: HASH - AttributeName: skey KeyType: RANGE PointInTimeRecoverySpecification: PointInTimeRecoveryEnabled: true Tags: - Key: Cost Value: !Ref SystemName - Key: Backup Value: !Sub Backup-${SystemName}
タグの名称はパラメータで可変としています。
PITR 有効化が必須になります。
AWS Backup
AWSTemplateFormatVersion: 2010-09-09 Description: CloudFormation template that creates a sample tag-based backup plan and a relevant IAM role. # ------------------------------------------------------------# # Input Parameters # ------------------------------------------------------------# Parameters: SystemName: Type: String Description: The system name. Default: example MaxLength: 10 MinLength: 1 Resources: # ------------------------------------------------------------# # Backup Execution Role (IAM) # ------------------------------------------------------------# BackupExecutionRole: Type: AWS::IAM::Role Properties: RoleName: !Sub AWSBackupDefaultServiceRole-${SystemName} AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: sts:AssumeRole Principal: Service: backup.amazonaws.com ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForBackup - arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForRestores Path: "/service-role/" # ------------------------------------------------------------# # Backup # ------------------------------------------------------------# BackupVault: Type: AWS::Backup::BackupVault Properties: BackupVaultName: !Sub BackupVault-${SystemName} BackupVaultTags: Cost: !Ref SystemName BackupPlan: Type: AWS::Backup::BackupPlan Properties: BackupPlan: BackupPlanName: !Sub BackupPlan-${SystemName} BackupPlanRule: - RuleName: RuleForDailyBackups TargetBackupVault: !Ref BackupVault ScheduleExpression: "cron(0 19 ? * * *)" Lifecycle: DeleteAfterDays: 7 - RuleName: RuleForWeeklyBackups TargetBackupVault: !Ref BackupVault ScheduleExpression: "cron(30 19 ? * 2 *)" Lifecycle: DeleteAfterDays: 28 - RuleName: RuleForMonthlyBackups TargetBackupVault: !Ref BackupVault ScheduleExpression: "cron(0 20 1 * ? *)" Lifecycle: DeleteAfterDays: 90 BackupPlanTags: Cost: !Ref SystemName TagBasedBackupSelection: Type: AWS::Backup::BackupSelection Properties: BackupPlanId: !Ref BackupPlan BackupSelection: SelectionName: !Sub TagBasedBackupSelection-${SystemName} IamRoleArn: !GetAtt BackupExecutionRole.Arn ListOfTags: - ConditionType: STRINGEQUALS ConditionKey: Backup ConditionValue: !Sub Backup-${SystemName}
タグの名称はパラメータで可変としています。
スケジュール設定は cron ライクに書きますが、時刻は UTC になります。
取得したバックアップ
取得したバックアップは、AWS マネジメントコンソールの Amazon DynamoDB または AWS Backup の画面から確認できます。
Amazon DynamoDB
AWS Backup
リストアについて
取得したバックアップからのリストアは、上記 AWS マネジメントコンソールや AWS CLI から実行することができます。
バックアップからの DynamoDB テーブルの復元 - Amazon DynamoDB
このチュートリアルでは、DynamoDB コンソールまたは AWS CLI を使用してバックアップからテーブルを復元する方法について説明します。
Amazon DynamoDB に限らず AWS リソース全般のバックアップ・リストアに言えることですが、データは元のリソースにリストアされず、新規に別のリソースが自動作成されて、そこにリストアされます。従って、リストア時には例えば Amazon DynamoDB テーブルであれば AWS Lambda 関数など、Amazon DynamoDB テーブルにアクセスするリソース内のアクセス先設定を変更するなどの運用が必要になります。
まとめ
いかがでしたでしょうか?
とりあえず Amazon DynamoDB のバックアップを取っておこう、という状況でしたら本記事を参考に実装できると思います。
みなさまのお役に立てれば幸いです。