Aurora Serverless v1 のデフォルトKMSキーで暗号化したスナップショットを他アカウントへ共有するために必要なこと

2021.11.26

Aurora Serverless v1のデータベースを他アカウントに移行する機会がありました。移行方法はスナップショット(バックアップ)を共有して共有先アカウントで復元するシンプルな方法です。

今回対象のAurora Serverlss v1はデフォルトKMSキーで暗号化されています。作業の様子を通して必要な作業を紹介します。

必要作業まとめ

前提としてデフォルトKMSキーで暗号化されたスナップショットは他アカウントに共有できません。

  1. KMSでカスタマー管理型のキー(CMK)を作成する
  2. 作成したCMKを共有先アカウントに共有する
    1. KMSのキーポリシー編集(マネコンからなら簡単)
  3. スナップショットをコピーしCMKで暗号化し直す
  4. CMKで暗号化し直したスナップショットを共有先アカウントへ共有する(やっとできる)

最終的に以下の流れでスナップショットを他アカウントへコピーしました。

とりあえず共有してみる

スナップショットを共有したくても以下のエラーにより設定できません。

エラーメッセージ

RDS のデフォルトサービスキーで暗号化されたスナップショットの共有は、現在サポートされていません。

ドキュメントを確認するとAurora Serverless v1特有の制限というわけではなく、デフォルトのKMSキーで暗号化したスナップショットは共有できないのですね。

You can't share a snapshot that has been encrypted using the default KMS key of the AWS account that shared the snapshot.

引用: Sharing a DB snapshot - Amazon Relational Database Service

共有元アカウント上の作業

デフォルトKMSキーでなければ共有できることがわかりました。暗号化し直してからスナップショットの共有までやってみます。

KMSでCMKを作成

スナップショットを共有するためにカスタマー管理型のキーを作成します。

  • キータイプ: 対称を指定
  • キー管理者: 作業する方のIAMユーザーまたは、IAMロールを指定
  • キーの使用アクセス許可を定義: 未指定
  • 別のAWSアカウント: 共有先のAWSアカウントIDを入力

ポイント

暗号鍵(CMK)も共有先アカウントに共有する必要があります。

キー作成例

キーポリシー参考例

  • 共有元アカウントID: 111111111111
  • 共有先アカウントID: 999999999999
{
    "Id": "key-consolepolicy-3",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111111111111:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow access for Key Administrators",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111111111111:role/cm-ohmura.yasutaka",
                    "arn:aws:iam::111111111111:role/hogehoge",
                ]
            },
            "Action": [
                "kms:Create*",
                "kms:Describe*",
                "kms:Enable*",
                "kms:List*",
                "kms:Put*",
                "kms:Update*",
                "kms:Revoke*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Delete*",
                "kms:TagResource",
                "kms:UntagResource",
                "kms:ScheduleKeyDeletion",
                "kms:CancelKeyDeletion"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::999999999999:root"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow attachment of persistent resources",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::999999999999:root"
            },
            "Action": [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }
    ]
}

スナップショットをCMKで暗号化

既存のスナップショットをコピーします。コピー時にCMKで暗号化し共有可能なスナップショットを作ります。

さきほど作成したCMKを指定します。

コピーが始まります。

コピー時間と進捗状況について

私の環境では1GB未満の容量のスナップショットを同リージョンに暗号化する鍵を変更してコピーするのに1時間以上かかりました。気長に待ちましょう。

そして進捗状況の表示は0%から急に完了になりました。1時間経過しても進捗状況が0%で「Serverless v1特有の何か知らない要素あったのか?」とアレコレ確認していたのですが別に間違ってはいませんでした。無駄な時間を過ごさなくて良いようにと後世に伝えたたいのでここに書き残します。

スナップショットの共有

改めてスナップショットを共有します

共有先のアカウントIDを入力し保存します。

共有先アカウント上の作業

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

共有元アカウントとの関係を断ち切りたいので共有先アカウントのKMSキーで暗号化し直します。またスナップショットをコピーします。

AWS KMSキーは(default) aws/rdsを指定します。共有先アカウントで作成したCMKでもOKです。

コピー時間と進捗状況について

私の環境ではスナップショットのコピー時間は30分もかかりませんでした。進捗状況の表示は同じく0%か、完了かのどちらかの表示しか確認できませんでした。

共有先アカウントのKMSキーで暗号化されたスナップショットを作成できました。

共有元アカウントでの作業

スナップショット移行作業に必要だったリソースを削除します。共有するために作成したCMKの削除と、共有したスナップショットを削除していきます。

スナップショットの共有から共有を解除します。

共有先のアカウントIDを確認できます。削除にチェックを入れて保存すれば完了です。

共有先アカウントから確認してみました。スナップショットの表示がなくなりました。

不要になったスナップショット削除します。

最後に移行作業用に作成したCMKを削除します。

日数は任意です。誤って他のCMKを削除するとデータを複合できなくなるので注意してください。

ステータスが削除保留中になりました。保留期間終了後に削除されます。

まとめ

デフォルトKMSキーで暗号化されたスナップショットは他アカウントに共有できない。一度CMKで暗号化して共有する必要があります。

共有後に共有先のデフォルトKMSキーで暗号化し直さなくてもAurora Serveless v1として直接リストアしてもOKです。私の場合は後日リストアしたかったので、ひとまずスナップショットにして置いておきました。

おわりに

Aurora Serveless v1なので大変な手順になるかと思ったのですが、EC2のAMIをCMKで暗号化したときの他アカウントへの共有と必要な作業は同じでした。

Aurora Serveless v1は滅多に移行する機会がなさそうなので作業ログとして残しました。

参考