繁体   English   中英

在 S3 存储桶跨账户之间复制文件

[英]Copy file between S3 buckets cross-account

我有 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复制到file1_processed中的bkt_b

我只想使用python boto3来执行此操作,因为我不想使用 shell 命令(带有 CLI 副本的操作系统命令)。

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

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

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

复制这些对象的最佳方法是使用一组凭据,这些凭据具有从bkt_a读取和向bkt_b写入的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权限,那么您将需要下载和上载每个对象,这是次优的。

  1. 在源 AWS 账户上,将此策略添加到源 S3 存储桶:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::SOURCE_BUCKET_NAME",
                "arn:aws:s3:::SOURCE_BUCKET_NAME/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::DESTINATION_BUCKET_NAME",
                "arn:aws:s3:::DESTINATION_BUCKET_NAME/*"
            ]
        }
    ]
}
  1. 使用目标帐户的凭据:
boto3_session = boto3.Session(aws_access_key_id=<your access key>,
                              aws_secret_access_key=<your secret_access_key>)
s3_resource = boto3_session.resource('s3')
bucket = s3_resource.Bucket("<source bucket name>")

for obj in bucket.objects.all():
    obj_path = str(obj.key)

    copy_source = {
        'Bucket': "<source bucket name>",
        'Key': obj_path
    }
    s3_resource.meta.client.copy(copy_source, "<destination bucket name>", obj_path)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM