プライベート共有された暗号化済みスナップショットからNeptune DBクラスターを復元してみた

2024.01.26

こんにちは、岩城です。

Neptuneのスナップショットを別アカウントに共有し、Neptune DBクラスター(以降、クラスター)を復元する機会がありました。

スナップショットのタイプによって共有できないものや、共有したスナップショットから直接クラスターを復元できないといった学びを得たので共有します。

忙しい人向けまとめ

  • 自動作成されたスナップショットは共有できず、手動作成されたスナップショットが共有可能
  • スナップショットの暗号化および暗号化時に利用したKMSのキータイプに応じた共有可否は下表のとおり
    スナップショットの暗号化有無 KMSタイプ スナップショットの共有可否
    AWSマネージド型 不可
    カスタマー管理型 パブリック共有不可 / プライベート共有可
    - パブリック共有可 / プライベート共有可
  • 共有されたスナップショットからは直接クラスターを復元できず、スナップショットを共有先アカウントにコピーした後、コピーしたスナップショットから復元する

  • コピーの際共有元のカスタマー管理型キーのキーポリシーに共有先アカウントからのアクセス許可の定義が必要

やってみた

プライベート共有された暗号化済みスナップショットからクラスターを復元してみます。

図にまとめると以下のような感じです。

カスタマー管理型のキー(以降、CMK)で暗号化されたクラスターが既に起動している前提で進めます。

共有できるスナップショットは手動作成のみ

プライベート共有可能なスナップショットは手動作成したものみです。バックアップウィンドウ内で自動作成されたスナップショットは共有できません。

まずは、スナップショットを手動作成します。

共有先AWSアカウントIDを指定したプライベート共有

スナップショットが作成されたら以下の設定で共有します。

  • DBクラスタースナップショットの可視性をプライベートとする
  • AWSアカウントIDに共有先となるAWSアカウントIDを指定する

共有先アカウントから共有元アカウント上のCMKにアクセスを許可

CMKで暗号化されたスナップショットを共有する際、共有元アカウント上のCMKのキーポリシーに共有先アカウントからのアクセスを許可する必要があります。

CMKに設定するキーポリシーは公式ドキュメントが参考になります。

ただし、ドキュメントのままコピペするとMalformedPolicyDocumentException - The new key policy will not allow you to update the key policy in the future.というエラーが出力して登録できません。

これはドキュメントのサンプルポリシーではキーポリシーを更新できなくなるためです。ということで、少しカスタマイズして最終的に以下のようなポリシーとしました。

{
  "Version": "2012-10-17",
  "Id": "key-policy-1",
  "Statement": [
    {
      "Sid": "Allow Full Access",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111111111111:root"
      },
      "Action": "kms:*",
      "Resource": "*"
    },
    {
      "Sid": "Allow use of the key",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::22222222222:root"
      },
      "Action": [
        "kms:CreateGrant",
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": "*"
    },
    {
      "Sid": "Allow attachment of persistent resources",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::22222222222:root"
      },
      "Action": [
        "kms:CreateGrant",
        "kms:ListGrants",
        "kms:RevokeGrant"
      ],
      "Resource": "*",
      "Condition": {
        "Bool": {
          "kms:GrantIsForAWSResource": "true"
        }
      }
    }
  ]
}

共有されたスナップショットから直接クラスターを復元できない

ここからは、共有先アカウントでの作業になります。

スナップショットが共有されていることを確認します。

共有されたスナップショットから復元しようにもグレーアウトされていることが分かるとおり、このスナップショットからクラスターを直接復元することはできません。

そこで、共有されたスナップショットから共有先アカウントにスナップショットをコピーします。

共有されたスナップショットをコピーする場合、以下エラーが出力しタグをスナップショットにコピーすることはできませんので無効にします。

Cannot copy tags for shared or public snapshots.

デフォルトでAWSマネージドのKMSキーで暗号化されます。共有先アカウント上のCMKで暗号化したい場合はカスタマイズします。

あとは、コピーされたスナップショットからクラスターを復元して完了です。

おわりに

スナップショットを別アカウントに共有してクラスターを復元できることは頭では分かっていましたが、実際に手を動かしてみるとスムーズにはいきませんでした。

特に共有したスナップショットから直接クラスターを復元できない点や、共有されたスナップショットをコピーする際にタグコピーを無効化する点は学びでした。

本エントリがどなたかのお役に立てれば幸いです。