繁体   English   中英

使用 boto3 将 s3 存储桶中的所有文件从 s3 帐户移动到另一个帐户

[英]Move all files in s3 bucket from s3 account to another using boto3

我正在尝试将存储桶的内容从账户-a 移动到账户-b 中的存储桶,我已经拥有他们两个的凭据。

这是我目前使用的代码:

import boto3

SRC_AWS_KEY = 'src-key'
SRC_AWS_SECRET = 'src-secret'

DST_AWS_KEY = 'dst-key'
DST_AWS_SECRET = 'dst-secret'
srcSession = boto3.session.Session(
        aws_access_key_id=SRC_AWS_KEY,
        aws_secret_access_key=SRC_AWS_SECRET
)
dstSession = boto3.session.Session(
        aws_access_key_id=DST_AWS_KEY,
        aws_secret_access_key=DST_AWS_SECRET
)
copySource = {
    'Bucket': 'src-bucket',
    'Key': 'test-bulk-src'
}
srcS3 = srcSession.resource('s3')
dstS3 = dstSession.resource('s3')
dstS3.meta.client.copy(CopySource=copySource, Bucket='dst-bucket', Key='test-bulk-dst', SourceClient=srcS3.meta.client)
print('success')

问题是,当我在Key后跟/file.csv字段中指定文件名时,它工作得很好,但是当我将其设置为复制整个文件夹时,如代码所示,它失败并抛出此异常:

botocore.exceptions.ClientError: 调用 HeadObject 操作时发生错误 (404):未找到

我需要做的是在一次调用中移动内容,而不是通过遍历 src 文件夹的内容,因为这是耗时/金钱的,因为我可能有数千个文件要移动。

Amazon S3 中没有 API 调用来复制文件夹。 (文件夹实际上并不存在——每个对象的 Key 包括其完整路径。)

您将需要遍历每个对象并复制它。

AWS CLI(用 Python 编写)提供了一些更高级别的命令,这些命令将为您执行此迭代:

aws s3 cp --recursive s3://source-bucket/folder/ s3://destination-bucket/folder/

如果存储桶位于不同的帐户中,我会建议:

  • 目标帐户使用一组凭据(避免对象所有权问题)
  • 修改源存储桶上的存储桶策略以允许来自目标帐户的凭据访问(避免使用两组凭据的需要)

暂无
暂无

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

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