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 のポイントインタイムリカバリ - Amazon DynamoDB
ポイントインタイムリカバリにより、オペレーションによって 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を書き始めたら、快適すぎて他の開発言語には戻れなくなりました。AWSサーバーレスやReactの仲間を増やしたいです。
取得資格:AWS認定は7つ、ITサービスマネージャ、ITIL v3 Expert、等
2020, 2021 APN AWS Top Engineers 受賞
2022 AWS Partner Ambassador 受賞
好きなAWSサービス:AWS Amplify / Amazon Cognito / AWS Step Functions / AWS CloudFormation

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