はじめに
「アカウント間でデータを移行したい」という場面は、組織の再編やシステムのリプレイス、環境の切り出しなど、インフラ運用をしているとちょくちょく発生します。RDS のデータ移行ではスナップショットを共有する方法が手軽でよく使われますが、暗号化の設定によっては素直にはいきません。
今回まさにその罠にはまったので、原因と解決策をまとめます。
アカウント間でRDSスナップショットが共有できなかった
移行元アカウントの RDS インスタンスのスナップショットを、移行先アカウントと共有しようとしたところ、以下のエラーが発生しました。
An error occurred (InvalidParameterCombination) when calling the ModifyDBSnapshotAttribute operation: Cannot share encrypted snapshots using the default AWS managed key.
マネジメントコンソールからスナップショットの共有設定を開いても、移行先のアカウント ID を入力しようとした時点でエラーになります。
「スナップショットを共有するだけなのになぜ?」と思いましたが、原因はスナップショットの暗号化設定にありました。
原因:デフォルトのマネージドキーで暗号化されているから
RDS インスタンスを作成する際、暗号化を有効にすると AWS マネージドキー(aws/rds) がデフォルトで使用されます。このキーは AWS が管理するもので、作成したアカウント内でのみ使用できるという制約があります。
キーエイリアス : aws/rds
キータイプ : AWS マネージドキー
使用可能範囲 : 作成アカウント内のみ
AWS マネージドキーは他のアカウントへの共有ができない仕様になっているため、このキーで暗号化されたスナップショットはどう頑張っても別アカウントに直接共有することができません。
つまり、デフォルトのままで RDS を暗号化すると、後からアカウント間移行しようとした際に詰まります。
これは RDS に限らず、EBS スナップショットや他の暗号化リソースでも同様の制約があります。複数アカウント構成を前提にする場合は、最初からカスタムキーを使う設計にしておくのが無難です。
解決策:カスタムキーを作成してスナップショットを再暗号化する
AWS マネージドキーの制約を回避するには、カスタムの KMS キー(Customer Managed Key)を作成し、そのキーでスナップショットを再暗号化する必要があります。手順は大きく4ステップです。
① カスタム KMS キーを作成(移行元アカウント)
② スナップショットをカスタムキーで再暗号化(コピーして作り直す)
③ カスタムキーを移行先アカウントに共有
④ 再暗号化したスナップショットを移行先アカウントにコピー
以下で各ステップを詳しく説明します。
ステップ1:移行元アカウントでカスタム KMS キーを作成する
# カスタム KMS キーを作成
aws kms create-key \
--description "RDS snapshot cross-account migration key" \
--key-usage ENCRYPT_DECRYPT \
--region ap-northeast-1
# 出力例
{
"KeyMetadata": {
"KeyId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"Arn": "arn:aws:kms:ap-northeast-1:111111111111:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
...
}
}
# 分かりやすいエイリアスを付けておく
aws kms create-alias \
--alias-name alias/rds-migration-key \
--target-key-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--region ap-northeast-1
ステップ2:スナップショットをカスタムキーで再暗号化する
既存のスナップショット(AWS マネージドキーで暗号化済み)を、カスタムキーで暗号化した新しいスナップショットとしてコピーします。スナップショットのコピー時に KMS キーを指定するだけで再暗号化が行われます。
# AWS マネージドキーで暗号化されたスナップショットを # カスタムキーで再暗号化してコピー aws rds copy-db-snapshot \ --source-db-snapshot-identifier arn:aws:rds:ap-northeast-1:111111111111:snapshot:rds:mydb-2026-06-01 \ --target-db-snapshot-identifier mydb-snapshot-for-migration \ --kms-key-id arn:aws:kms:ap-northeast-1:111111111111:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \ --region ap-northeast-1
コピーが完了するまでしばらく時間がかかります。コンソールや CLI でステータスを確認しましょう。
# スナップショットのステータス確認 aws rds describe-db-snapshots \ --db-snapshot-identifier mydb-snapshot-for-migration \ --query 'DBSnapshots[0].Status' # "available" になれば完了
ステップ3:カスタムキーを移行先アカウントに共有する
カスタムキーのキーポリシーを編集して、移行先アカウント(アカウント ID: 222222222222)に使用権限を付与します。
# 現在のキーポリシーを取得 aws kms get-key-policy \ --key-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \ --policy-name default \ --output text > key-policy.json
key-policy.json を編集して、以下のステートメントを Statement 配列に追加します。
{
"Sid": "Allow use from migration destination account",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::222222222222:root"
},
"Action": [
"kms:Decrypt",
"kms:DescribeKey",
"kms:CreateGrant",
"kms:ReEncrypt*"
],
"Resource": "*"
}
編集したポリシーを適用します。
aws kms put-key-policy \ --key-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \ --policy-name default \ --policy file://key-policy.json
kms:CreateGrant の権限が重要です。これがないと移行先アカウントでスナップショットを復元する際にエラーになります。
ステップ4:再暗号化したスナップショットを移行先アカウントに共有する
カスタムキーで再暗号化したスナップショットに、移行先アカウントを共有先として追加します。
# スナップショットを移行先アカウントに共有 aws rds modify-db-snapshot-attribute \ --db-snapshot-identifier mydb-snapshot-for-migration \ --attribute-name restore \ --values-to-add "222222222222" \ --region ap-northeast-1
今度はエラーなく共有できるはずです。
ステップ5:移行先アカウントでスナップショットをコピーして復元する
移行先アカウントに切り替えて、共有されたスナップショットを自アカウントにコピーします。この際、移行先アカウント自身の KMS キー(カスタムキーでも AWS マネージドキーでも可)を指定します。
# 移行先アカウント(222222222222)で実行 # 共有スナップショットを移行先アカウントのキーで再暗号化しながらコピー aws rds copy-db-snapshot \ --source-db-snapshot-identifier arn:aws:rds:ap-northeast-1:111111111111:snapshot:mydb-snapshot-for-migration \ --target-db-snapshot-identifier mydb-snapshot-imported \ --kms-key-id alias/aws/rds \ --source-region ap-northeast-1 \ --region ap-northeast-1
コピーが完了したら、そのスナップショットから RDS インスタンスを復元して移行完了です。
# スナップショットから RDS インスタンスを復元 aws rds restore-db-instance-from-db-snapshot \ --db-instance-identifier mydb-migrated \ --db-snapshot-identifier mydb-snapshot-imported \ --db-instance-class db.t3.medium \ --region ap-northeast-1
全体の流れまとめ
■移行元アカウント: 111111111111
RDS スナップショット
(aws/rds で暗号化)
↓
copy-db-snapshot ← カスタム KMS キー(alias/rds-migration-key)で再暗号化
↓
再暗号化済みスナップショット
↓
modify-db-snapshot-attribute ← 移行先アカウントに共有
↓
KMS キーポリシー ← 移行先アカウントに使用権限を付与↓↓ アカウントをまたぐ ↓↓
■移行先アカウント: 222222222222
copy-db-snapshot ← 移行先アカウント自身の KMS キーで再暗号化してコピー
↓
restore-db-instance-from-db-snapshot
↓
移行完了
移行時には注意が必要
実際に手を動かしてみると、いくつか詰まりやすいポイントがありました。参考までにまとめておきます。
- 暗号化されていないスナップショットの共有は別の話
今回のケースは「暗号化あり」の前提です。暗号化なしのスナップショットはアカウント間共有がシンプルに行えますが、本番データのスナップショットが暗号化なしというのはセキュリティ上避けるべきです。 - スナップショットのコピーには時間がかかる
DBのサイズによっては再暗号化コピーに数十分〜数時間かかります。移行のタイムラインに余裕を持たせておきましょう。 - KMS キーのリージョンに注意
KMS キーはリージョン単位で管理されます。移行元と移行先で異なるリージョンを使う場合、スナップショットのクロスリージョンコピー時にも対応したリージョンのキーを指定する必要があります。 - 移行先アカウントでの KMS 権限は IAM でも確認
キーポリシーで権限を付与しても、移行先アカウントの IAM ポリシーで KMS の操作が制限されている場合はエラーになることがあります。キーポリシーと IAM ポリシーの両方で権限が通っている必要があります。 - 最初からカスタムキーを使う設計にしておく
今回の一番の教訓はここです。将来的にアカウント間移行の可能性があるなら、RDS を作る段階からカスタム KMS キーを使った暗号化にしておくと、いざというときの移行コストが大幅に下がります。
まとめ
| 項目 | AWS マネージドキー(aws/rds) | カスタム KMS キー |
|---|---|---|
| デフォルト設定 | デフォルト |
別途作成が必要 |
| アカウント間共有 | 不可 |
可能 |
| キーポリシーの編集 | 不可 |
可能 |
| クロスアカウント移行 | 再暗号化が必要 |
そのまま共有可能 |
| コスト | 無料 | 月額 $1/キー + API 呼び出し料金 |
RDS の暗号化はデフォルトで有効化されていることが多く、デフォルトのままでは後々クロスアカウント移行が必要になった際に手間が増えます。カスタム KMS キーは月額 $1 程度のコストで運用の柔軟性が大きく上がるので、本番環境では最初からカスタムキーを使うことを検討してみてください。


