【问题标题】:Copy file between S3 buckets cross-account在 S3 存储桶跨账户之间复制文件
【发布时间】:2019-02-27 21:39:54
【问题描述】:

我有 AWS 账户 (account_a),它的 S3 存储桶 (bkt_a) 包含文件:file1

该帐户具有 access_key (access_key_A) 和 secret_key (secret_key_a)。

我还有 AWS 账户 (account_b),它有存储桶 (bkt_b)。

帐户有 access_key (access_key_b) 和 secret_key (secret_key_b)。

我想将file1bkt_a 复制到bkt_b 中的file1_processed

我想使用 python boto3 only 因为我不想使用 shell 命令(带有 CLI 副本的 OS 命令)。

我该怎么做?调用boto3 S3客户端/资源时如何使用两个访问密钥和密钥?

我很乐意得到一些代码行。

【问题讨论】:

    标签: amazon-web-services amazon-s3


    【解决方案1】:

    我会创建两个单独的 s3 客户端,每个帐户一个,并根据您的要求与它们交互。

    import boto3
    
    client_a = boto3.client(
      's3',
      aws_access_key_id='<access_key_A>',
      aws_secret_access_key='<secret_key_a>'
    )
    client_b = boto3.client(
      's3',
      aws_access_key_id='<access_key_b>',
      aws_secret_access_key='<secret_key_b>'
    )
    
    // client_a read from bkt_a
    // client_b write to bkt_b
    

    当然,请务必记住,您使用的凭证适用于附加了适当 S3 策略的 IAM 用户/角色。

    注意 -- 将凭据直接放在代码中通常是一个糟糕的决定,尤其是当您将代码放入共享源代码存储库时。我建议将值传递给您的 python 脚本,或者从安全位置读取。

    【讨论】:

    • 也许值得注意的是,这个解决方案是用于下载 + 上传,而不是“复制”(发生在 S3 中)——但复制是不可能的,除非 one 组凭据拥有访问两个存储桶的必要权限。
    【解决方案2】:

    复制这些对象的最佳方法是使用一组有权从bkt_a 读取和写入bkt_b 的凭据。这将启用copy_object(),它将直接在两个存储桶之间复制文件,而无需下载和上传。

    最简单的实现是:

    • 使用来自account_b 的一组凭证(例如,IAM 角色),它有权写入bkt_b
    • bkt_a 添加存储桶策略,允许从bkt_a 读取这些凭据(这可以是临时策略,可以在复制后删除)。
    • 遍历对象并将它们从bkt_a复制到bkt_b
      • 指定ACL='bucket-owner-full-control' 将新对象的所有权授予bkt_b(如果使用account_b 凭据,则可能不需要,但如果使用account_a 凭据,则肯定有必要)

    如果您无法安排一组凭据同时具有 A-Read 和 B-Write 权限,那么您将需要下载和上传每个对象,这是次优的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      • 2021-08-02
      • 1970-01-01
      • 2018-11-26
      • 2021-07-03
      • 1970-01-01
      • 2019-04-23
      相关资源
      最近更新 更多