こんにちは、広野です。
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) を有効にする。
Amazon 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 のバックアップを取っておこう、という状況でしたら本記事を参考に実装できると思います。
みなさまのお役に立てれば幸いです。