Amazon DynamoDB のバックアップを AWS Backup で定義する [AWS CloudFormation テンプレート付き]

こんにちは、広野です。

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 のバックアップを取っておこう、という状況でしたら本記事を参考に実装できると思います。

みなさまのお役に立てれば幸いです。

著者について
広野 祐司

AWS サーバーレスアーキテクチャを駆使して社内クラウド人材育成アプリとコンテンツづくりに勤しんでいます。React で SPA を書き始めたら快適すぎて、他の言語には戻れなくなりました。サーバーレス & React 仲間を増やしたいです。AWSは好きですが、それよりもAWSすげー!って気持ちの方が強いです。
取得資格:AWS 認定は12資格、ITサービスマネージャ、ITIL v3 Expert 等
2020 - 2023 Japan AWS Top Engineer 受賞
2022 - 2023 Japan AWS Ambassador 受賞
2023 当社初代フルスタックエンジニア認定
好きなAWSサービス:AWS Amplify / AWS AppSync / Amazon Cognito / AWS Step Functions / AWS CloudFormation

広野 祐司をフォローする
クラウドに強いによるエンジニアブログです。
SCSKは専門性と豊富な実績を活かしたクラウドサービス USiZE(ユーサイズ)を提供しています。
USiZEサービスサイトでは、お客様のDX推進をワンストップで支援するサービスの詳細や導入事例を紹介しています。
AWSクラウドソリューションデータベース運用・監視
シェアする
タイトルとURLをコピーしました