在S3存储桶交叉帐户之间复制文件

时间:2019-02-27 21:39:54

标签: amazon-web-services amazon-s3

我有一个AWS帐户(account_a),该帐户的S3存储桶(bkt_a)包含文件:file1

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

我也有一个带有存储桶(account_b)的AWS账户(bkt_b)。

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

我想将file1中的bkt_a复制到file1_processed中的bkt_b

我只想使用 python boto3 来做到这一点,因为我不想使用shell命令(带有CLI复制的OS命令)。

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

我很高兴获得一些代码行。

2 个答案:

答案 0 :(得分:0)

我将创建两个单独的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脚本,或者从安全的位置读取。

答案 1 :(得分:0)

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

最简单的实现是:

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

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