DynamoDBのLAG Vaultへのクロスアカウントバックアップを暗号化キータイプ別(AWS-owned / AWS-managed / CMK)に検証してみた
こんにちは、クラウド事業本部 コンサルティング部の荒平(@eiraces)です。
AWSのリソースをクロスアカウントでバックアップする際には、暗号化キーの種類によって挙動が変わることがあります。
今回はDynamoDBについて、AWS-owned key で作ったテーブルはクロスアカウントコピーできるのか、AWS-managed key(aws/dynamodb)はどうなのか。この辺りの疑問を解消したく、パターンごとに検証してみました。
なお、今回はコピー先には通常の Backup Vault ではなく Logically Air-Gapped(LAG)Vault を使います。
前提知識
DynamoDB の暗号化キータイプ
DynamoDB テーブルの保管時暗号化(Encryption at Rest)には 3 種類のキータイプがあります。
| キータイプ | 概要 | KMS 料金 | キーポリシー変更 |
|---|---|---|---|
| AWS-owned key | DynamoDB が所有・管理している。KMS コンソールに表示されない | 無料 | 不可(見えない) |
AWS-managed key (aws/dynamodb) |
ユーザーアカウントの KMS に存在するが、 AWS が管理している | 有料 | 不可(immutable) |
| Customer-managed key(CMK) | ユーザーが作成・完全管理 | 有料 | 可能 |
Advanced DynamoDB backup
DynamoDB のクロスアカウントバックアップを行うには、Advanced DynamoDB backup を有効化する必要があります。(2021 年 11 月 21 日以降にBackup Vaultを有効化した場合はデフォルトで有効)
有効化すると DynamoDB は AWS Backup の Fully Managed 対象になり、バックアップは vault の KMS キーで暗号化 されます。ソーステーブルの暗号化キーとは切り離されるようです。
なお、この機能を有効にしていない状態だと、バックアップはソーステーブルと同じキーで暗号化され、クロスアカウントコピーやクロスリージョンコピーは使えません。
Logically Air-Gapped(LAG)Vault
LAG Vault(論理エアギャップボールト)はランサムウェア対策の一環で検討されることが多くなっているバックアップボールトの一種です。
イメージとしては、自分の家(ユーザーアカウント)の金庫ではなく、銀行(AWS)の貸金庫にデータを預けるような感じです。仮にユーザーアカウントが侵害されても、バックアップデータには直接アクセスできない「論理的なエアギャップ」を実現します。
Standard Vault との主な違い
| 特徴 | Standard Backup Vault | LAG Vault |
|---|---|---|
| Vault Lock | オプション | コンプライアンスモード自動付与(WORM) |
| 暗号化キー | AWS-managed or CMK | AWS-owned or CMK |
| 共有方法 | Vault access policy | AWS RAM |
| 保持期間 | 任意 | 最小 7 日以上(必須) |
Standard Vault だと vault access policy でクロスアカウントアクセスを制御しますが、LAG Vault では AWS RAM(Resource Access Manager) を使って共有する点が大きな違いです。
構成図
本エントリの構成図です。DynamoDBを3つの暗号化方式で用意します。

やってみた
LAG Vaultの作成に関しては以下の記事をご参考ください。
前提として、LAG Vaultがソースアカウント・バックアップアカウント間でRAM共有されている状態で検証します。

1. KMSキー作成
ソースアカウント(DynamoDBのオリジナルが所属するアカウント)でKMSキーを作成します。
aws kms create-key で作成できます。
$ aws kms create-key \
--description "DynamoDB CMK for cross-account backup test" \
--region ap-northeast-1
{
"KeyMetadata": {
"AWSAccountId": "000000000000",
"KeyId": "xxxxxxx-961c-4f2c-b126-4c556eb1935c",
"Arn": "arn:aws:kms:ap-northeast-1:000000000000:key/9be72240-961c-4f2c-b126-4c556eb1935c",
"CreationDate": "2026-04-06T14:36:23.701000+00:00",
"Enabled": true,
"Description": "DynamoDB CMK for cross-account backup test",
"KeyUsage": "ENCRYPT_DECRYPT",
"KeyState": "Enabled",
"Origin": "AWS_KMS",
"KeyManager": "CUSTOMER",
"CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
"KeySpec": "SYMMETRIC_DEFAULT",
"EncryptionAlgorithms": [
"SYMMETRIC_DEFAULT"
],
"MultiRegion": false,
"CurrentKeyMaterialId": "b0ed6a385ada4c0a8db9246a37e0dcf2a0155c6c70e788db8f468955cxxxxxxx"
}
}
CMKデータベース用にKeyIDを控えておきます。
2. DynamoDB テーブルの作成(Source Account)
3 種類の暗号化キータイプでテーブルを作成します。
| テーブル名 | 暗号化キータイプ |
|---|---|
test-aws-owned |
AWS-owned key |
test-aws-managed |
AWS-managed key(aws/dynamodb) |
test-cmk |
Customer-managed key |
test-aws-owned(AWS-owned key)
aws dynamodb create-table \
--table-name test-aws-owned \
--attribute-definitions AttributeName=PK,AttributeType=S \
--key-schema AttributeName=PK,KeyType=HASH \
--billing-mode PAY_PER_REQUEST \
--region ap-northeast-1
test-aws-managed(AWS-managed key)
aws dynamodb create-table \
--table-name test-aws-managed \
--attribute-definitions AttributeName=PK,AttributeType=S \
--key-schema AttributeName=PK,KeyType=HASH \
--billing-mode PAY_PER_REQUEST \
--sse-specification Enabled=true,SSEType=KMS \
--region ap-northeast-1
test-cmk(Customer-managed key)
※ 実施する場合は、キーは実際のARNに置き換えてください。
aws dynamodb create-table \
--table-name test-cmk \
--attribute-definitions AttributeName=PK,AttributeType=S \
--key-schema AttributeName=PK,KeyType=HASH \
--billing-mode PAY_PER_REQUEST \
--sse-specification Enabled=true,SSEType=KMS,KMSMasterKeyId=arn:aws:kms:ap-northeast-1:000000000000:key/9be72240-961c-4f2c-b126-4c556eb1935c \
--region ap-northeast-1
最後に、リストア確認用に各テーブル50行ほど入れておきます。
for table in test-aws-owned test-aws-managed test-cmk; do
for i in $(seq 1 50); do
aws dynamodb put-item \
--table-name "$table" \
--item "{\"PK\":{\"S\":\"item-$i\"},\"name\":{\"S\":\"test-record-$i\"},\"value\":{\"N\":\"$i\"}}" \
--region ap-northeast-1
done
echo "$table done"
done
なおAWS-ownedキーを選択している場合は「AWSが所有するキー」と表示され、キーIDが確認できません。
(他のタイプはキーIDが確認できる)

3. DynamoDBのクロスアカウントバックアップ
各DynamoDB テーブルのバックアップを取得し、バックアップアカウントの LAG Vault にコピーします。
バックアッププランの中で「コピー先にコピー」オプションでクロスアカウントを指定することができます。

DynamoDBをバックアッププランに割り当てます。
なお、実行するIAMロールには AWSBackupServiceRolePolicyForBackupのマネージドポリシーが必要です。

バックアップおよびコピーが完了しました。(所要時間:バックアップは36分、コピーは22分)

EBS や RDS など Non-Fully Managed なリソースでは、AWS-managed key のクロスアカウントコピーは不可(キーポリシーが immutable でアカウント間共有できないため)ですが、DynamoDB は Advanced features を有効化すると Fully Managed になるため、AWS-managed key でもクロスアカウントコピーが可能です。
バックアップは vault の KMS キーで再暗号化されるので、ソーステーブルの暗号化キーに依存しないのが良いところですね。CMK のテーブルも問題なくコピーできました。
4. リストア確認
念のため、クロスアカウント先でリストアが可能か確認しておきます。
リストア時には暗号化キーを指定して別の暗号化方式に変えることができます。

復元ジョブは完了まで約2分〜6分(50レコード)でした。

復元直後はテーブルサイズが 0バイト と表示される(更新は6時間間隔)ので、ライブ項目数を取得します。
前手順でインポートした50項目が表示されました。

中身もちゃんと読み取れる状態です。3パターンとも正常にリストアできていました。
事前の想定通り、問題なさそうです。

検証結果
今回の検証結果です。ドキュメントに書いてあることでも、実際に動かしてみることが大事ですね。
| ソーステーブルの暗号化 | クロスアカウントコピー | コピー先の暗号化 | リストア検証 |
|---|---|---|---|
| AWS-owned key | 成功 | LAG Vault の暗号化キー(AWS-owned) | 成功 |
AWS-managed key(aws/dynamodb) |
成功 | LAG Vault の暗号化キー(AWS-owned) | 成功 |
| Customer-managed key(CMK) | 成功 | LAG Vault の暗号化キー(AWS-owned) | 成功 |
おわりに
DynamoDB のクロスアカウントバックアップを暗号化キータイプ別に検証し、3パターンすべてで LAG Vault へのコピーが成功する ことを確認しました。
なお、Vaultの暗号化キータイプは後から変更できないため注意が必要です。
Fully Managedのリソースが現状はそこまで多くないのが悩みどころですが、機能拡張によりサポートリソースが増えることを祈っています。
このエントリが誰かの助けになれば幸いです。
それでは、クラウド事業本部 コンサルティング部の荒平がお送りしました!
参考






