python-3.x - 需要将目录内容上传到 S3 存储桶
问题描述
我的场景是我目前正在使用 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)
随后调用和使用它们来获取凭据。
解决方案
AWS CLI 实际上是用 Python 编写的,并使用您可以使用的相同 API 调用。
要意识到的重要一点是,Amazon S3 一次只有一个 API 调用来上传/下载一个对象。
因此,您的 Python 代码需要:
- 获取要复制的文件列表
- 遍历每个文件并将其上传到 Amazon S3
当然,如果您想要sync
功能(仅复制新/修改的文件),那么您的程序将需要更多智能来确定要复制哪些文件。
Boto3 有两种通用类型的方法:
client
与 API 调用 1:1 映射的方法,以及resource
更 Pythonic 但可能在后台进行多个 API 调用的方法
您使用哪种类型是您自己的选择。就个人而言,我发现client
上传/下载对象的方法更容易,并且在resource
必须循环资源时这些方法很好(例如,“对于每个 EC2 实例,对于每个 EBS 卷,检查每个标签”)。
推荐阅读
- android - 如何将图像放在文本中间的文本下方?
- environment-variables - 如何在 Atom 中运行 python 文件?康达环境?
- javascript - 无法设置未定义的属性“selectedIndex”
- python - 我想通过python从文本文件中提取特定数据
- laravel - How to set custom header in elibyy/tcpdf-laravel
- javascript - JavaScript 和 JQuery 代码如何从 MVC 视图移动到 Visual Studio 2017 的外部 .js 文件?
- javascript - jQuery(文档).ready(函数(){}); 不能正常工作
- react-native - 如何在自定义 cra 中为 babel loader 添加选项?
- r - 在 r 中更新 dplyr 包时遇到问题
- rust - 指定特征边界时如何指定临时生命周期?