使用Boto3复制文件到跨账号Amazon S3桶后无法打开或下载如何解决
问题解答
- 你参考的服务端重加密方案是完全正确的,不需要你手动解密源文件再重新加密:S3跨账号复制时会在AWS服务端自动完成「源KMS解密→目标KMS重加密」的全流程,全程不会暴露明文数据,也不需要你在Lambda中做额外的加解密运算,不会额外消耗计算资源。
- 对方账号用户访问被拒绝绝大多数是权限配置遗漏导致,你可以逐项排查以下配置项:
必须检查的配置项
Lambda执行角色权限配置
你使用的Lambda执行角色需要同时配置两类权限:- 源端权限:源S3桶的
s3:GetObject权限、源桶关联KMS密钥的kms:Decrypt权限 - 目标端权限:目标S3桶的
s3:PutObject权限、对方提供的KMS密钥的kms:GenerateDataKey、kms:Encrypt权限
- 源端权限:源S3桶的
复制操作的参数配置
你在调用Boto3的copy_object方法时,必须额外添加以下3个核心参数:s3.copy_object( Bucket=目标桶名, Key=目标对象键, CopySource={'Bucket': 源桶名, 'Key': 源对象键}, # 跨账号复制必填参数 ACL='bucket-owner-full-control', # 给目标桶所有者授予对象完全控制权限,解决跨账号对象所有权问题 ServerSideEncryption='aws:kms', # 指定目标端使用KMS加密 SSEKMSKeyId='对方提供的KMS密钥ARN' # 指定使用对方账号的KMS密钥加密 )对方账号的KMS密钥策略配置
对方账号的KMS密钥的资源策略中,必须显式允许你的Lambda执行角色ARN调用kms:Encrypt、kms:Decrypt、kms:GenerateDataKey、kms:DescribeKey这几个权限,仅你侧配置角色权限不生效,KMS资源策略的优先级更高。目标桶的所有权配置
建议对方账号的目标桶开启「桶所有者强制所有权」设置,开启后所有上传到桶的对象所有权自动归桶所有者所有,可避免ACL配置遗漏导致的访问拒绝问题。
内容的提问来源于stack exchange,提问作者mesaekso
相关产品推荐
相关产品推荐

