从AWS S3恢复SQL Server .bak到RDS时CMK不存在或无权限求助
解决AWS RDS恢复SQL Server备份时的CMK相关错误
可能的原因及解决方法
1. S3存储桶/对象自动加密导致权限问题
你提到新生成的bak未加密,但如果S3存储桶默认开启了服务器端加密(SSE-KMS),上传的文件会被自动加密,RDS无权限访问对应的KMS密钥就会触发该错误。
- 先检查存储桶加密设置:进入S3存储桶的「属性」→「服务器端加密」,确认是否启用了SSE-KMS。如果是,需确保RDS关联的服务角色能访问这个CMK。
- 临时测试方案:上传时强制关闭加密,使用以下命令:
上传完成后再尝试恢复操作。aws s3 cp local/myDBName.bak s3://s3-my-temp-folder/myDBName.bak --sse none
2. RDS服务角色缺少KMS解密权限
若S3对象确实采用了KMS加密(无论桶默认配置还是上传时指定),RDS的IAM角色必须拥有kms:Decrypt权限:
- 找到RDS关联的IAM角色(比如自定义的
rds-s3-integration-role),进入IAM控制台为该角色添加权限策略,允许对目标CMK执行解密操作。 - 参考权限策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:你的区域:你的账号ID:key/密钥ID" } ] }
3. 备份文件残留加密元数据
部分场景下,原始加密备份恢复后,即使采用默认参数备份,SQL Server仍可能保留加密标记。可以用以下命令检查新生成bak的状态:
- 本地SQL Server执行查询:
查看RESTORE HEADERONLY FROM DISK = 'D:\你的备份路径\myDBName.bak'IsEncrypted字段,若值为1说明备份仍处于加密状态。此时需重新备份并明确指定无加密:
上传该无加密备份后再尝试恢复。BACKUP DATABASE [myDBName] TO DISK = 'D:\新备份路径\myDBName_unencrypted.bak' WITH NO_ENCRYPTION
4. 资源区域不匹配
确认RDS实例、S3存储桶、KMS密钥的区域完全一致——CMK是区域级资源,跨区域无法访问。
额外验证建议
- 对比可成功恢复的文件B的S3加密状态:查看它的「属性」→「服务器端加密」配置,照着调整失败文件的对应设置。
- 使用完全相同的
aws s3 cp命令参数上传两个文件,排除上传过程中的加密配置差异。
内容的提问来源于stack exchange,提问作者Shijie Zheng
相关产品推荐
相关产品推荐

