【问题标题】:Move all files in s3 bucket from s3 account to another using boto3使用 boto3 将 s3 存储桶中的所有文件从 s3 帐户移动到另一个帐户
【发布时间】:2020-03-12 15:54:12
【问题描述】:

我正在尝试将存储桶的内容从 account-a 移动到 account-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 文件夹的内容,因为这很费时间/金钱,因为我可能要移动数千个文件。

【问题讨论】:

  • aws s3 sync s3://source_bucket/ s3://dest_bucket/。无需自定义代码。
  • 此外,s3 在技术上确实有文件夹或目录。这是一个平面对象存储。 “前缀”只是对象名称的一部分。
  • 如何在 python 中运行它(我必须使用 python)?并设置源和目标的凭据?
  • awscli 是用 python 编写的

标签: python amazon-web-services amazon-s3 boto3


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-27
    • 2020-05-29
    • 2017-05-22
    • 2018-06-02
    • 2022-11-15
    • 2020-07-05
    • 2020-11-05
    • 1970-01-01
    相关资源
    最近更新 更多