我需要编写代码(python),将一个S3文件从一个S3存储桶复制到另一个。源存储桶位于另一个AWS账户中,我们正在使用IAM用户凭据从该存储桶中进行读取。该代码与目标存储区使用同一帐户运行,因此具有IAM角色的写访问权限。我能想到的一种方法是使用源帐户创建s3客户端连接,将整个文件读入内存(getObject-?),然后使用目标存储桶创建另一个s3客户端,然后将内容写入(putObject-?)之前已被读入内存。但是,如果文件大小增加,它可能会变得非常低效,因此想知道是否有更好的方法,最好是boto3是否提供一种AWS托管的方式来传输文件而不将内容读入内存。
PS:我无法在源帐户中添加或修改角色或策略以提供对目标帐户的直接读取访问权限。源帐户由其他人拥有,并且仅提供可以从存储桶读取的用户。
答案 0 :(得分:1)
流是解决此类问题的标准解决方案。建立源和目的地,然后从一个流向另一个。
实际上,boto3 get_object()
和upload_fileobj()
方法都支持流。
您的代码将如下所示:
import boto3
src = boto3.client('s3', src_access_key, src_secret_key)
dst = boto3.client('s3') # creds implicit through IAM role
src_response = src.get_object(src_bucket, src_key)
dst.upload_fileobj(src_response['Body'], dst_bucket, dst_key)