加密EBS快照跨账号复制
基于AWS官方文档整理并实际验证的完整操作指南
概述
本教程介绍如何将使用客户托管KMS密钥加密的EBS快照安全地复制到另一个AWS账号。
前提条件
- 源账号:拥有加密EBS快照的账号
- 目标账号:接收快照副本的账号
- 快照必须使用客户托管KMS密钥加密(不能是AWS托管密钥)
⚠️ 根据AWS官方文档明确说明:
You can't share snapshots that are encrypted with the default AWS managed key. You can only share snapshots that are encrypted with a customer managed key.
Link: Share an Amazon EBS snapshot with other AWS accounts - Amazon EBS
如采用AWS托管密钥,请参考这篇blog 为加密EBS卷更换客户托管密钥 将AWS托管密钥加密的EBS卷转换为客户托管密钥加密。
操作环境信息
- 源账号:
<SOURCE-ACCOUNT-ID>
- 目标账号:
<TARGET-ACCOUNT-ID>
- 测试区域:
<AWS-REGION>
- 源KMS密钥:
<SOURCE-KMS-KEY-ID>
- 目标KMS密钥:
<TARGET-KMS-KEY-ID>
- 测试快照:
<SOURCE-SNAPSHOT-ID>
步骤1:准备源账号的KMS密钥
1.1 创建客户托管KMS密钥(如果没有)
aws kms create-key \
--description "Key for cross-account EBS snapshot testing" \
--region <AWS-REGION>
1.2 修改KMS密钥策略
在源账号中,需要给目标账号授予KMS密钥使用权限:
# 获取当前密钥策略
aws kms get-key-policy \
--key-id <SOURCE-KMS-KEY-ID> \
--policy-name default \
--region <AWS-REGION>
1.3 更新密钥策略
创建包含目标账号权限的策略文件:
{
"Version": "2012-10-17",
"Id": "key-default-1",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<SOURCE-ACCOUNT-ID>:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "Allow use of the key for cross-account snapshot",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<TARGET-ACCOUNT-ID>:root"
},
"Action": [
"kms:Decrypt",
"kms:DescribeKey",
"kms:CreateGrant",
"kms:GenerateDataKey",
"kms:GenerateDataKeyWithoutPlaintext",
"kms:ReEncrypt*"
],
"Resource": "*"
},
{
"Sid": "Allow attachment of persistent resources",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<TARGET-ACCOUNT-ID>:root"
},
"Action": [
"kms:CreateGrant",
"kms:ListGrants",
"kms:RevokeGrant"
],
"Resource": "*",
"Condition": {
"Bool": {
"kms:GrantIsForAWSResource": true
}
}
}
]
}
应用策略:
aws kms put-key-policy \
--key-id <SOURCE-KMS-KEY-ID> \
--policy-name default \
--policy file://kms-policy.json \
--region <AWS-REGION>
步骤2:在目标账号创建KMS密钥(可选)
如果要在目标账号使用不同的KMS密钥重新加密,则执行本步骤:
# 在目标账号创建新的KMS密钥
aws kms create-key \
--description "Key for receiving cross-account snapshot copy" \
--region <AWS-REGION>
步骤3:为加密EBS卷创建快照
实际场景中直接对需要复制的 EBS 卷进行快照操作。
# 创建加密EBS卷 (可选)
aws ec2 create-volume \
--volume-type gp3 \
--size 8 \
--availability-zone <AWS-REGION>a \
--kms-key-id <SOURCE-KMS-KEY-ID> \
--tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=test-encrypted-volume}]'
# 创建快照
aws ec2 create-snapshot \
--volume-id <VOLUME-ID> \
--description "Test encrypted snapshot for cross-account copy" \
--tag-specifications 'ResourceType=snapshot,Tags=[{Key=Name,Value=test-encrypted-snapshot}]'
步骤4:跨账号复制快照
⚠️ 注意:必须先在源账号分享快照给目标账号。直接跨账号复制会失败,错误信息为"Source snapshot is not found"。
4.1 在源账号分享快照
# 分享快照给目标账号
aws ec2 modify-snapshot-attribute \
--snapshot-id <SOURCE-SNAPSHOT-ID> \
--attribute createVolumePermission \
--operation-type add \
--user-ids <TARGET-ACCOUNT-ID> \
--region <AWS-REGION>
4.2 在目标账号复制共享快照
# 在目标账号复制共享的快照
aws ec2 copy-snapshot \
--source-region <AWS-REGION> \
--source-snapshot-id <SOURCE-SNAPSHOT-ID> \
--description "Cross-account copy of shared encrypted snapshot" \
--kms-key-id <TARGET-KMS-KEY-ID> \
--region <AWS-REGION>
注意:对于加密快照,不需要显式添加--encrypted
参数,AWS会自动处理。
步骤5:验证复制结果
# 检查复制状态
aws ec2 describe-snapshots \
--snapshot-ids <COPIED-SNAPSHOT-ID> \
--region <AWS-REGION>
# 验证快照可以创建卷
aws ec2 create-volume \
--snapshot-id <COPIED-SNAPSHOT-ID> \
--availability-zone <AWS-REGION>a \
--volume-type gp3 \
--region <AWS-REGION>
✅ 成功情况:
- 源快照:
<SOURCE-SNAPSHOT-ID>
(源账号) - 复制快照:
<COPIED-SNAPSHOT-ID>
(目标账号) - 复制状态:completed (100%)
- 卷创建:成功
步骤6:清理(可选)
# 取消快照分享
aws ec2 modify-snapshot-attribute \
--snapshot-id <SOURCE-SNAPSHOT-ID> \
--attribute createVolumePermission \
--operation-type remove \
--user-ids <TARGET-ACCOUNT-ID> \
--region <AWS-REGION>
# 删除测试资源
aws ec2 delete-volume --volume-id <VOLUME-ID>
aws ec2 delete-snapshot --snapshot-id <SNAPSHOT-ID>
aws kms schedule-key-deletion --key-id <KMS-KEY-ID> --pending-window-in-days 7
注意事项
- KMS密钥类型限制:根据AWS官方文档,只能分享使用客户托管密钥加密的快照,不能分享使用AWS托管密钥加密的快照
- 必须先分享:不能直接跨账号复制,必须先分享快照
- 权限要求:目标账号需要源KMS密钥的使用权限
- 成本考虑:跨账号复制会产生完整副本,不是增量复制
- 区域限制:快照复制受区域限制,跨区域需要额外步骤
- 安全考虑:分享快照等于分享所有数据,谨慎操作
- 自动加密:复制加密快照时会自动使用目标KMS密钥重新加密
故障排除
常见错误
"Source snapshot is not found"
- 解决方案:必须先在源账号分享快照给目标账号
- 使用
modify-snapshot-attribute
命令分享
"You can't share snapshots that are encrypted with the default AWS managed key"
- 原因:快照使用了AWS托管密钥 (
aws/ebs
) 加密 - 解决方案:重新创建使用客户托管密钥加密的快照
- 原因:快照使用了AWS托管密钥 (
"Given key ID is not accessible"
- 检查KMS密钥策略是否正确配置
- 确认目标账号有密钥使用权限
"You are not authorized to perform this operation"
- 检查IAM权限
- 确认快照分享权限
"The parameter KmsKeyId requires the parameter Encrypted to be set"
- 对于加密快照复制,通常不需要显式设置encrypted参数
- AWS会自动处理加密快照的复制