暗号化されたAuroraのスナップショットをAWS Backupで他リージョンにコピーする

    暗号化されたAuroraのスナップショットをAWS Backupで他リージョンにコピーする

     

    本記事はAsiaQuest Advent Calendarの3日目です。

    目次

      当記事の対象者

      • 暗号化されたAuroraのスナップショットをDR環境にコピーしたい人
      • 上記のアーキテクチャをCloudFormationで構築したい人
      • AWS BackupにアタッチするIAMロールの権限をある程度絞りたい人

      当記事の執筆理由

      暗号化されたAuroraのスナップショットをAWS Backupで他リージョンにコピーする機会がありました。
      その際、権限周りで躓く事がありましたので備忘録として残しておこうと思い、当記事を執筆しました。

      補足:RDSにはクロスリージョン自動バックアップ機能があります。
      しかし、当記事執筆時点(2023年2月)では、Auroraは非対応です。
      クロスリージョン自動バックアップ

      アーキテクチャ図

      architecture

      今回の構成のポイントは以下の通りです。

      • 東京リージョンのAWS BackupでAuroraのスナップショットを取得し、大阪リージョンのAWS Backup Vaultに向けてクロスリージョンコピー
      • 東京リージョンでCMKを作成し、東京リージョンのCMKをプライマリーキーとしたレプリカキーを大阪リージョンに作成(リージョン間コピーのため)
      • 東京リージョンのAWS Backup Vaultは東京リージョンのプライマリーキーを利用し、大阪リージョンのAWS Backup Vaultは大阪リージョンのレプリカキーを利用する

      留意事項

      • 「Auroraのスナップショット」と文中で表現していますが、厳密には「AWS Backup Vaultの復旧ポイント」です。
      • 東京リージョン大規模障害から復旧した後のリストアを想定して、大阪リージョンから東京リージョンにスナップショットをコピーできるように権限を設定しています。
        その際のコピー作業は手動作業となります。

      CloudFormationテンプレート例

      次にCloudFormationのテンプレート例です。
      AWS Backup、KMS以外のリソースに関しては割愛させていただきます。ご了承ください。

      東京リージョンでデプロイするCloudFormationテンプレート 

      source-backup.yml
      AWSTemplateFormatVersion: '2010-09-09'
      Description: Ap-northeast-1 Source AWS Backup
      
      Resources:
        BackupVault:
          Type: AWS::Backup::BackupVault
          Properties:
            BackupVaultName: source-backup-vault
            EncryptionKeyArn:
              Fn::ImportValue: primary-kms
        BackupPlan:
          Type: AWS::Backup::BackupPlan
          Properties:
            BackupPlan:
              BackupPlanName: source-backup-plan
              BackupPlanRule: 
                - RuleName: source-backup-rule
                  TargetBackupVault: !Ref BackupVault
                  ScheduleExpression: cron(0 16 * * ? *) # JST 1:00
                  StartWindowMinutes: 60
                  CompletionWindowMinutes: 720
                  Lifecycle:
                    DeleteAfterDays: 1
                  CopyActions:
                    - DestinationBackupVaultArn: !Sub arn:aws:backup:ap-northeast-3:${AWS::AccountId}:backup-vault:destination-backup-vault
                      Lifecycle:
                        DeleteAfterDays: 1
        BackupSelection:
          Type: AWS::Backup::BackupSelection
          Properties:
            BackupPlanId: !Ref BackupPlan
            BackupSelection:
              SelectionName: source-backup-selection
              IamRoleArn: !GetAtt BackupIamRole.Arn
              Resources:
                - !Sub arn:aws:rds:ap-northeast-1:${AWS::AccountId}:cluster:クラスター名
        BackupIamRole:
          Type: AWS::IAM::Role
          Properties:
            RoleName: source-backup-role
            AssumeRolePolicyDocument:
              Statement:
              - Effect: Allow
                Action: sts:AssumeRole
                Principal:
                  Service: backup.amazonaws.com
        BackupIamPolicy:
          Type: AWS::IAM::Policy
          Properties:
            PolicyName: source-backup-policy
            PolicyDocument:
              Statement:
              - Effect: Allow
                Action:
                  - rds:CreateDBClusterSnapshot
                  - rds:DescribeDBClusters
                  - rds:DescribeDBClusterSnapshots
                  - rds:AddTagsToResource
                  - rds:ListTagsForResource
                  - rds:CopyDBClusterSnapshot
                  - rds:ModifyDBClusterSnapshotAttribute
                  - rds:RestoreDBClusterFromSnapshot
                Resource:
                  - !Sub arn:aws:rds:ap-northeast-1:${AWS::AccountId}:cluster:クラスター名*
                  - !Sub arn:aws:rds:ap-northeast-1:${AWS::AccountId}:subgrp:サブネットグループ名
                  - !Sub arn:aws:rds:ap-northeast-1:${AWS::AccountId}:cluster-pg:クラスターパラメータグループ名
                  - !Sub arn:aws:rds:ap-northeast-1:${AWS::AccountId}:cluster-snapshot:awsbackup:*
                  - !Sub arn:aws:rds:ap-northeast-3:${AWS::AccountId}:cluster-snapshot:awsbackup:*
              - Effect: Allow
                Action:
                  - rds:DeleteDBClusterSnapshot
                Resource:
                  - !Sub arn:aws:rds:ap-northeast-1:${AWS::AccountId}:cluster-snapshot:awsbackup:*
                  - !Sub arn:aws:rds:ap-northeast-3:${AWS::AccountId}:cluster-snapshot:awsbackup:*
              - Effect: Allow
                Action:
                  - backup:DescribeBackupVault
                  - backup:CopyIntoBackupVault
                Resource:
                  - !Sub arn:aws:backup:ap-northeast-1:${AWS::AccountId}:backup-vault:source-backup-vault
                  - !Sub arn:aws:backup:ap-northeast-3:${AWS::AccountId}:backup-vault:destination-backup-vault
              - Effect: Allow
                Action:
                  - kms:Decrypt
                  - kms:Encrypt
                  - kms:GenerateDataKey
                  - kms:ReEncrypt*
                  - kms:CreateGrant
                  - kms:DescribeKey
                Resource:
                  - Fn::ImportValue: primary-kms
                  - 大阪リージョンのレプリカキーのArn
              - Effect: Allow
                Action:
                  - kms:DescribeKey
                Resource:
                  - !Sub arn:aws:kms:ap-northeast-1:${AWS::AccountId}:key/*
                  - !Sub arn:aws:kms:ap-northeast-3:${AWS::AccountId}:key/*
                Condition:
                  ForAnyValue:StringEquals:
                    kms:ResourceAliases:
                      - alias/aws/rds
                      - alias/aws/backup
            Roles:
              - !Ref BackupIamRole
      primary-kms.yml
      AWSTemplateFormatVersion: '2010-09-09'
      Description: Ap-northeast-1 Primary Kms
      
      Resources:
        KmsKey:
          Type: AWS::KMS::Key
          Properties:
            MultiRegion: true
            KeyPolicy:
              Version: 2012-10-17
              Id: key-policy
              Statement:
                - Sid: Enable IAM User Permissions
                  Effect: Allow
                  Principal:
                    AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
                  Action: "*"
                  Resource: "*"
                - Sid: Allow administration of the key # 適宜ユーザかロールに権限を付与してください
                  Effect: Allow
                  Principal:
                    AWS: !Sub arn:aws:iam::${AWS::AccountId}:role/xxxxx 
                  Action:
                    - kms:Create*
                    - kms:Describe*
                    - kms:Enable*
                    - kms:List*
                    - kms:Put*
                    - kms:Update*
                    - kms:Revoke*
                    - kms:Disable*
                    - kms:Get*
                    - kms:Delete*
                    - kms:ScheduleKeyDeletion
                    - kms:CancelKeyDeletion
                  Resource: "*"
        KmsKeyAlias:
          Type: AWS::KMS::Alias
          Properties:
            AliasName: alias/primary-kms
            TargetKeyId: !Ref KmsKey
      Outputs:
        KmsKey:
          Value: !GetAtt KmsKey.Arn
          Export:
            Name: primary-kms
       

      大阪リージョンでデプロイするCloudFormationテンプレート

      destination-backup.yml
      AWSTemplateFormatVersion: '2010-09-09'
      Description: Ap-northeast-3 Destination AWS Backup
      
      Resources:
        BackupVault:
          Type: AWS::Backup::BackupVault
          Properties:
            BackupVaultName: destination-backup-vault
            EncryptionKeyArn:
              Fn::ImportValue: replica-kms
      replica-kms.yml
      AWSTemplateFormatVersion: '2010-09-09'
      Description: Ap-northeast-3 Replica Kms
      
      Resources:
        KmsKey:
          Type: AWS::KMS::ReplicaKey
          Properties:
            PrimaryKeyArn: 東京リージョンのプライマリキーのArn
            KeyPolicy:
              Version: 2012-10-17
              Id: key-policy
              Statement:
                - Sid: Enable IAM User Permissions
                  Effect: Allow
                  Principal:
                    AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
                  Action: "*"
                  Resource: "*"
                - Sid: Allow administration of the key # 適宜ユーザかロールに権限を付与してください
                  Effect: Allow
                  Principal:
                    AWS: !Sub arn:aws:iam::${AWS::AccountId}:role/xxxxx 
                  Action:
                    - kms:Create*
                    - kms:Describe*
                    - kms:Enable*
                    - kms:List*
                    - kms:Put*
                    - kms:Update*
                    - kms:Revoke*
                    - kms:Disable*
                    - kms:Get*
                    - kms:Delete*
                    - kms:ScheduleKeyDeletion
                    - kms:CancelKeyDeletion
                  Resource: "*"
        KmsKeyAlias:
          Type: AWS::KMS::Alias
          Properties:
            AliasName: alias/replica-kms
            TargetKeyId: !Ref KmsKey
      Outputs:
        KmsKey:
          Value: !GetAtt KmsKey.Arn
          Export:
            Name: replica-kms

      上記のCloudFormationのテンプレートを元に、設定値をParametersで指定するようにしたり、Mappingsで設定値をまとめたりしてアレンジしてください。
      以下の手順でデプロイしてください。

      1. 東京リージョンでKMS(プライマリーキー)作成
      2. 大阪リージョンでKMS(レプリカキー)作成
      3. 大阪リージョンでAWS Backup(送信先Backup Vault)作成
      4. 東京リージョンでAWS Backup(送信元Backup Vault、IAMロールなど)作成

      CloudFormationテンプレート解説

      上記のCloudFormationのテンプレートからいくつかのポイントをピックアップして解説します。
      まずはKMSから解説します。

      primary-kms.yml

      Resources:
        KmsKey:
          Type: AWS::KMS::Key
          Properties:
            MultiRegion: true

      今回、大阪リージョンにレプリカキーを作成するため、「MultiRegion」を「true」にします。
      この設定は鍵作成時にしか設定できないため、要注意です。

      キーポリシーは公式ドキュメントのポリシーをほぼそのまま利用しています。
      適宜アクションやリソースを変更してください。
      Create a symmetric encryption KMS key

      Outputs:
        KmsKey:
          Value: !GetAtt KmsKey.Arn
          Export:
            Name: primary-kms

      東京リージョンのAWS Backupデプロイ時にプライマリーキーのArnが必要なため、Outputsを利用しエクスポートします。

      replica-kms.yml

      Resources:
        KmsKey:
          Type: AWS::KMS::ReplicaKey
          Properties:
            PrimaryKeyArn: 東京リージョンのプライマリキーのArn

      レプリカキーを作成するには「AWS::KMS::ReplicaKey」Typeを利用します。
      その際、「PrimaryKeyArn」で東京リージョンのプライマリキーを指定するのですが、
      基本的にリージョン間でクロススタック参照を行うことが出来ないためArnを直接入力しています。
      しかし、SSMパラメータストアを利用したり、AWS CDKを利用することでリージョン間でクロススタック参照する方法があります。
      その方法を解説した記事を紹介しておきます。
      リージョン間のCloudFormationクロススタック参照を実現する
      AWS CDKでリージョン間のクロススタック参照を簡単に実現!cdk-remote-stackを試してみた

      Outputs:
        KmsKey:
          Value: !GetAtt KmsKey.Arn
          Export:
            Name: replica-kms

      プライマリキー同様にレプリカキーのArnを、Outputsを利用してエクスポートしております。

      次にAWS Backupを解説します。大阪リージョンのAWS Backupから解説します。

      destination-backup.yml

      Resources:
        BackupVault:
          Type: AWS::Backup::BackupVault
          Properties:
            BackupVaultName: destination-backup-vault
            EncryptionKeyArn:
              Fn::ImportValue: replica-kms

      スナップショットのコピー先としてBackup Vaultを利用しますので、
      東京リージョンより先に大阪リージョンにBackup Vaultを作成します。
      「EncryptionKeyArn」では、Fn::ImportValueを利用してレプリカキーのArnを参照しています。

      source-backup.yml

      Resources:
        BackupVault:
          Type: AWS::Backup::BackupVault
          Properties:
            BackupVaultName: source-backup-vault
            EncryptionKeyArn:
              Fn::ImportValue: primary-kms

      大阪リージョンのBackup Vault同様に、
      「EncryptionKeyArn」において、Fn::ImportValueを利用してプライマリーキーのArnを参照しています。

        BackupPlan:
          Type: AWS::Backup::BackupPlan
          Properties:
            BackupPlan:
              BackupPlanName: source-backup-plan
              BackupPlanRule: 
                - RuleName: source-backup-rule
                  TargetBackupVault: !Ref BackupVault
                  ScheduleExpression: cron(0 16 * * ? *) # JST 1:00
                  StartWindowMinutes: 60
                  CompletionWindowMinutes: 720
                  Lifecycle:
                    DeleteAfterDays: 1
                  CopyActions:
                    - DestinationBackupVaultArn: !Sub arn:aws:backup:ap-northeast-3:${AWS::AccountId}:backup-vault:destination-backup-vault
                      Lifecycle:
                        DeleteAfterDays: 1

      次にBackup Planです。
      「BackupPlanRule」で、詳細なBackup Planのルールを定義します。

      「TargetBackupVault」では、このBackup Planのルールを適用するBackup Vaultを指定します。
      つまり、東京リージョンに作成する送信元Backup Vaultを指定することになります。

      「ScheduleExpression」、「StartWindowMinutes」、「CompletionWindowMinutes」は、AWS Backupのジョブのスケジュールに関するプロパティです。
      「ScheduleExpression」はcron式でジョブ開始のスケジュールを指定します。
      今回の例では毎日午前1時(JST)にジョブを開始するように指定しています。(UTCで指定する点、ご注意ください。)
      「ScheduleExpression」で指定したジョブ開始時刻ちょうどにジョブは開始されません。
      ジョブ開始時刻をコントロールしたい場合、「StartWindowMinutes」で何分以内にジョブを開始させるか指定する必要があります。(デフォルトは8時間です。)
      この「StartWindowMinutes」は、最低60分以上である必要があります。
      また、指定した期間内にジョブが開始されなかった場合、ジョブはエラーとなります。
      ジョブの完了時刻もコントロールしたい場合、「CompletionWindowMinutes」で何分以内にジョブを完了させるか指定する必要があります。(デフォルトは7日です。)
      指定した期間内にジョブが完了されなかった場合、ジョブはエラーとなります。
      AWS::Backup::BackupPlan BackupRuleResourceType

      「Lifecycle」では、AWS Backupによって取得されたスナップショットをいつコールドストレージに移行するか、いつ削除するか指定する事が出来ます。
      今回の例では、1日後に削除するように指定しています。
      AWS::Backup::BackupPlan LifecycleResourceType

      「CopyActions」で、AWS Backupによって取得されたスナップショットを他のBackup Vaultにコピーすることが出来ます。
      「DestinationBackupVaultArn」では、送信先Backup VaultのArnを指定します。
      つまり、大阪リージョンに作成する送信先Backup Vaultを指定することになります。
      また、「Lifecycle」でコピーされたスナップショットのライフサイクルも指定する事が出来ます。
      東京リージョンのスナップショット同様に、1日後に削除するように指定しています。
      AWS::Backup::BackupPlan CopyActionResourceType

        BackupSelection:
          Type: AWS::Backup::BackupSelection
          Properties:
            BackupPlanId: !Ref BackupPlan
            BackupSelection:
              SelectionName: source-backup-selection
              IamRoleArn: !GetAtt BackupIamRole.Arn
              Resources:
                - !Sub arn:aws:rds:ap-northeast-1:${AWS::AccountId}:cluster:クラスター名

      次にBackupSelectionです。
      Backup Planを元にバックアップを取得するリソースを指定します。

      リソースにアタッチされているタグを元にバックアップを取得するリソースを指定する方法もありますが、
      今回の例では「BackupSelection」の「Resources」で直接AuroraのクラスターのArnを指定しています。
      また「IamRoleArn」で、バックアップ取得の際に利用するIAMロールを指定します。
      AWS::Backup::BackupSelection BackupSelectionResourceType

        BackupIamRole:
          Type: AWS::IAM::Role
          Properties:
            RoleName: source-backup-role
            AssumeRolePolicyDocument:
              Statement:
              - Effect: Allow
                Action: sts:AssumeRole
                Principal:
                  Service: backup.amazonaws.com

      AssumeRolePolicyDocumentに関しては、 AWS BackupのデフォルトロールであるAWSBackupDefaultServiceRoleを元にしています。

        BackupIamPolicy:
          Type: AWS::IAM::Policy
          Properties:
            PolicyName: source-backup-policy
            PolicyDocument:
              Statement:
              - Effect: Allow
                Action:
                  - rds:CreateDBClusterSnapshot
                  - rds:DescribeDBClusters
                  - rds:DescribeDBClusterSnapshots
                  - rds:AddTagsToResource
                  - rds:ListTagsForResource
                  - rds:CopyDBClusterSnapshot
                  - rds:ModifyDBClusterSnapshotAttribute
                  - rds:RestoreDBClusterFromSnapshot
                Resource:
                  - !Sub arn:aws:rds:ap-northeast-1:${AWS::AccountId}:cluster:クラスター名*
                  - !Sub arn:aws:rds:ap-northeast-1:${AWS::AccountId}:subgrp:サブネットグループ名
                  - !Sub arn:aws:rds:ap-northeast-1:${AWS::AccountId}:cluster-pg:クラスターパラメータグループ名
                  - !Sub arn:aws:rds:ap-northeast-1:${AWS::AccountId}:cluster-snapshot:awsbackup:*
                  - !Sub arn:aws:rds:ap-northeast-3:${AWS::AccountId}:cluster-snapshot:awsbackup:*
              - Effect: Allow
                Action:
                  - rds:DeleteDBClusterSnapshot
                Resource:
                  - !Sub arn:aws:rds:ap-northeast-1:${AWS::AccountId}:cluster-snapshot:awsbackup:*
                  - !Sub arn:aws:rds:ap-northeast-3:${AWS::AccountId}:cluster-snapshot:awsbackup:*

      最後にIAMポリシーです。
      大きく分けて「Aurora」、「AWS Backup」、「KMS」でステートメントを分けています。
      それぞれの一部アクションに関してはステートメントをさらに分割しております。

      まず、Auroraに関するステートメントを解説します。
      大元は下記公式ドキュメントの「カスタマー管理ポリシー」(「Amazon Aurora バックアップポリシー」、「Amazon Aurora のリストアポリシー」)を参考にしております。
      「AWS Backup」、「KMS」のステートメントも同じく下記公式ドキュメントを参考にしております。
      AWS Backup 用の管理ポリシー
      しかし、この公式ドキュメントのポリシーでは、Resourceに「"*"」を利用しております。
      セキュリティ要件でResourceに「"*"」が利用出来ない場合、Resourceは具体的に指定する必要があります。
      その際、参考になるのがサービス認証リファレンスです。RDSのドキュメントは下記の通りです。
      Amazon RDS のアクション、リソース、および条件キー

      いくつかポイントをピックアップします。

                Resource:
                  - !Sub arn:aws:rds:ap-northeast-1:${AWS::AccountId}:cluster:クラスター名*

      Auroraのクラスターを指定しているのは、もちろんAuroraからスナップショットを取得するためです。
      しかし、なぜクラスター名の最後に*をつけているかと言いますと、リストアを考慮したためです。
      リストアの際に元のクラスターが残っていた場合、別名でクラスターをリストアする必要があります。
      例えば、{元のクラスター名}-backupといった具合です。
      ここはリストアの際の運用方針にもよりますので、方針に合わせて変更してください。

                  - !Sub arn:aws:rds:ap-northeast-1:${AWS::AccountId}:subgrp:サブネットグループ名
                  - !Sub arn:aws:rds:ap-northeast-1:${AWS::AccountId}:cluster-pg:クラスターパラメータグループ名

      サブネットグループ、クラスターパラメーターグループを指定しているのも、リストアのためです。

      ここでリストアについて補足しますと、RDSコンソールからリストアする時とAWS Backupからリストアする時の挙動が異なります。
      簡単にまとめますと、以下の点が異なります。

      • AWS Backupからのリストアはクラスターのみの作成となる。リストアの際、クラスターの名前を指定できる。インスタンスを作成するにはCLIでコマンド実行する必要がある。
      • RDSコンソールからのリストアはクラスター、インスタンス共に作成される。リストアの際、インスタンス名は指定できるが、クラスター名は「インスタンス名-cluster」となる。

      解説した記事を紹介しますので、どちらの方法でリストアするか検討してください。
      RDSコンソールからとAWS backupからのAuroraクラスターリストア時の挙動の違い

                  - !Sub arn:aws:rds:ap-northeast-1:${AWS::AccountId}:cluster-snapshot:awsbackup:*
                  - !Sub arn:aws:rds:ap-northeast-3:${AWS::AccountId}:cluster-snapshot:awsbackup:*

      スナップショット取得、コピーのためにスナップショットを指定します。
      今回はAWS Backupによって取得されるスナップショットのため、普通のAuroraのスナップショットのArnにawsbackupが追加されています。
      また最後のIDはランダム値(job-ランダム値)となるため、*で指定する必要があります。

      arn:aws:rds:region:account-id:cluster-snapshot:awsbackup:*

      アクセスコントロール
      今回は、大阪リージョンにスナップショットをコピーしますので、大阪リージョンのスナップショットも指定しています。

              - Effect: Allow
                Action:
                  - rds:DeleteDBClusterSnapshot
                Resource:
                  - !Sub arn:aws:rds:ap-northeast-1:${AWS::AccountId}:cluster-snapshot:awsbackup:*
                  - !Sub arn:aws:rds:ap-northeast-3:${AWS::AccountId}:cluster-snapshot:awsbackup:*

      事故防止のため「rds:DeleteDBClusterSnapshot」アクションに関しては別ステートメントに分けています。

              - Effect: Allow
                Action:
                  - backup:DescribeBackupVault
                  - backup:CopyIntoBackupVault
                Resource:
                  - !Sub arn:aws:backup:ap-northeast-1:${AWS::AccountId}:backup-vault:source-backup-vault
                  - !Sub arn:aws:backup:ap-northeast-3:${AWS::AccountId}:backup-vault:destination-backup-vault

      AWS Backupに関するステートメントです。
      大阪リージョンの送信先Backup Vaultに対して「backup:CopyIntoBackupVault」アクションを許可しています。
      「災害復旧後、大阪リージョンにコピーされたスナップショットを再度東京リージョンにコピーし、東京リージョンでリストアする」という想定のため、東京リージョンの送信元Backup Vaultも指定しています。 下記のサービス認証リファレンスによると、「backup:CopyIntoBackupVault」はリソースレベルのアクセス制御が出来ません。
      AWS Backup のアクション、リソース、および条件キー
      しかし、「backup:DescribeBackupVault」が許可されていないBackup Vaultに対してスナップショットをコピーすることは出来ませんので、アクセス制御としては上記のステートメントでも問題ないと考えております。
      厳密な制御をしたい場合は、ドキュメント通り、条件キー「aws:RequestTag/${TagKey}」で制御するようにしてください。

              - Effect: Allow
                Action:
                  - kms:Decrypt
                  - kms:Encrypt
                  - kms:GenerateDataKey
                  - kms:ReEncrypt*
                  - kms:CreateGrant
                  - kms:DescribeKey
                Resource:
                  - Fn::ImportValue: primary-kms
                  - 大阪リージョンのレプリカキーのArn
              - Effect: Allow
                Action:
                  - kms:DescribeKey
                Resource:
                  - !Sub arn:aws:kms:ap-northeast-1:${AWS::AccountId}:key/*
                  - !Sub arn:aws:kms:ap-northeast-3:${AWS::AccountId}:key/*
                Condition:
                  ForAnyValue:StringEquals:
                    kms:ResourceAliases:
                      - alias/aws/rds
                      - alias/aws/backup

      KMSに関するステートメントです。
      AWS Backup 用のカスタマー管理ポリシーを参考にしております。
      「kms:DescribeKey」に関しては、更に別ステートメントに分けています。
      スナップショットを別リージョンにコピーする際、コピー先リージョンのAWSマネージド型キーである「aws/rds」「aws/backup」を参照する必要があります。
      「alias/aws/rds」「alias/aws/backup」が既にコピー先リージョンにある場合、そのArnを直接指定しても問題ありません。
      ただ、AWSマネージド型キーは必要となった時点でAWSが自動作成されますので、必要最低限のリソースしかないDR環境では「aws/rds」「aws/backup」が存在せず、Arnを事前に知ることが出来ない可能性もあります。
      そのため、今回の例では、ResourceではKeyIDを*で指定するが、条件キー「kms:ResourceAliases」を利用することで、「aws/rds」「aws/backup」を指定するようにしています。
      もし、「aws/rds」「aws/backup」が存在しない、かつ、Arnを直接指定したい場合は、CLIでdescribe-keyコマンドを実行し、「aws/rds」「aws/backup」を作成してください。
      KMS AWSマネージド型キーを作成する方法を教えてください

      実行結果

      上手くいくとバックアップジョブが成功しています。

      1

       

      コピージョブも同じく成功しております。

      2

       

      大阪リージョンの送信先Backup Vaultを確認すると、スナップショットがコピーされている事が分かります。

      3

       

      大阪リージョンにコピーされたスナップショットを、東京リージョンにコピーしてみようと思います。

      4

      5

      6

       

      コピージョブが成功しました。 

      7

       

      東京リージョンの送信元Backup Vaultを確認すると、スナップショットがコピーされている事が分かります。
      (コピーされたスナップショットのIDは(copyjob-ランダム値)となります。) 

      8

       

      このスナップショットからリストアしてみようと思います。 

      9

      10

      11
      12
      13
      14

       

      復元ジョブが成功しました。 

      15

       

      RDSのコンソールを確認しますと、リストアによって新規作成されたクラスターがあります。
      繰り返しとなりますが、AWS Backupからのリストアではクラスターのみの作成となる点、ご注意ください。 

      16

      最後に

      暗号化されたAuroraのスナップショットをAWS Backupで他リージョンにコピーするCloudFormationについて解説しました。
      細かい部分は、運用方針によって変わると思いますので、運用方針に合わせて設計してください。
      その際、当記事が参考になりましたら幸いです。