[英]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
)。
我想将file1
从bkt_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权限,那么您将需要下载和上载每个对象,这是次优的。
{
"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/*"
]
}
]
}
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.