【问题标题】:Need to upload directory content to S3 bucket需要将目录内容上传到 S3 存储桶
【发布时间】:2020-06-16 11:21:49
【问题描述】:

我的场景是我目前正在使用 AWS CLI 使用以下 AWS CLI 命令将我的目录内容上传到 S3 存储桶:

aws s3 sync results/foo s3://bucket/

现在我需要替换它并使用 python 代码来执行此操作。我正在探索boto3 文档以找到正确的方法。我看到一些选项,例如: https://boto3.amazonaws.com/v1/documentation/api/1.9.42/reference/services/s3.html#S3.Client.upload_file https://boto3.amazonaws.com/v1/documentation/api/1.9.42/reference/services/s3.html#S3.ServiceResource.Object

有人可以建议哪种方法是正确的。

我知道我必须通过调用 boto3.client('sts').assume_role(role, session) 获取凭据并随后使用它们。

【问题讨论】:

  • 我发现最简单的方法就是从 python 调用 cli sync 命令,例如使用os.system 因为在 boto3 中没有内置函数。你必须自己实现它。

标签: python-3.x amazon-web-services amazon-s3 boto3 aws-cli


【解决方案1】:

AWS CLI 实际上是用 Python 编写的,并使用您可以使用的相同 API 调用。

需要意识到的重要一点是,Amazon S3 只有一个 API 调用来一次上传/下载一个对象

因此,您的 Python 代码需要:

  • 获取要复制的文件列表
  • 遍历每个文件并将其上传到 Amazon S3

当然,如果您想要 sync 功能(仅复制新的/修改过的文件),那么您的程序将需要更多智能来确定要复制哪些文件。

Boto3 有两种通用类型的方法:

  • client 与 API 调用 1:1 映射的方法,以及
  • resource 更 Pythonic 但可能在后台进行多个 API 调用的方法

您使用哪种类型是您自己的选择。就个人而言,我发现client 方法更容易上传/下载对象,resource 方法在必须循环资源时很好用(例如“对于每个 EC2 实例,对于每个 EBS 卷,检查每个标签”)。

【讨论】:

  • 谢谢约翰,client 你指的是哪个 api 调用?
  • list_objects_v2()upload_file()
猜你喜欢
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多