【发布时间】: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