【问题标题】:How to transfer a file from one S3 bucket to other with two different users如何使用两个不同的用户将文件从一个 S3 存储桶传输到另一个存储桶
【发布时间】:2019-07-09 07:54:00
【问题描述】:

我需要编写代码 (python) 将 S3 文件从一个 S3 存储桶复制到另一个存储桶。源存储桶位于不同的 AWS 账户中,我们使用 IAM 用户凭证从该存储桶中读取数据。该代码在与目标存储桶相同的账户中运行,因此它具有 IAM 角色的写入权限。我能想到的一种方法是创建与源帐户的 s3 客户端连接,将整个文件读入内存(getObject-?),然后使用目标存储桶创建另一个 s3 客户端并写入内容(putObject-?)之前已经读入内存。但是如果文件大小增加,它会变得非常低效,所以想知道是否有更好的方法,最好是 boto3 提供一种 AWS 托管的方式来传输文件而不将内容读入内存。

PS:我无法在源帐户中添加或修改角色或策略以授予对目标帐户的直接读取权限。源帐户归其他人所有,他们只提供可以读取存储桶的用户。

【问题讨论】:

    标签: python python-3.x amazon-web-services amazon-s3 boto3


    【解决方案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)
    

    【讨论】:

    • 哦,我明白了。那是我最初计划做的,但我认为src_response 会将整个文件内容保存在内存中。不是这样吗? “流式传输”是指 src_response['Body'] 以块的形式读取并以块的形式传递给 upload_fileobj
    • 不,src_response 在内存中没有完整的文件内容,至少在一般情况下是这样。是的,文件以块的形式从源流向目标。
    猜你喜欢
    • 2018-06-02
    • 1970-01-01
    • 2020-07-05
    • 2020-05-29
    • 2018-11-22
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多