Python使用boto3操作AWS S3中踩过的坑

最近在AWS上开发部署应用。

看了这篇关于AWS中国区填坑的文章,结合自己使用AWS的经历,补充两个我自己填的坑。

http://www.jianshu.com/p/0d0fd39a40c9?utm_source=tuicool&utm_medium=referral

1. V4 签名认证

官方文档中给出的例子:

import boto3
s3 = boto3.resource(‘s3‘)
s3.meta.client.upload_file(‘/tmp/hello.txt‘, ‘mybucket‘, ‘hello.txt‘)

运行之后会出现如下错误:

An error occurred (InvalidRequest) when calling the GetBucketLifecycle operation: Missing required header for this request: x-amz-content-sha256

在文档中找到如下的解释。概括讲就是以后AWS S3 要使用第四版的签名认证了。尤其是亚太地区新建的服务器。

========================

Protect against reuse of the signed portions of the request – The signed portions (using AWS
Signatures) of requests are valid within 15 minutes of the timestamp in the request. An unauthorized
party who has access to a signed request can modify the unsigned portions of the request without
affecting the request‘s validity in the 15 minute window. Because of this, we recommend that you
maximize protection by signing request headers and body, making HTTPS requests to Amazon S3,
and by using the s3:x-amz-content-sha256 condition key (see Amazon S3 Signature Version 4
Authentication Specific Policy Keys (p. 50)) in AWS policies to require users to sign S3 request bodies.
Note
Amazon S3 supports Signature Version 4, a protocol for authenticating inbound API requests
to AWS services, in all AWS regions. At this time, AWS regions created before January 30, 2014
will continue to support the previous protocol, Signature Version 2. Any new regions after January
30, 2014 will support only Signature Version 4 and therefore all requests to those regions must
be made with Signature Version 4. For more information about AWS Signature Version 2, see
Signing and Authenticating REST Requests in the Amazon Simple Storage Service Developer
Guide.

======================

但是坑爹的是,他没有告诉怎么添加这个header。

好在boto3是Python API,直接去源码中找答案。

import boto3
from botocore.client import Config

s3 = boto3.resource(‘s3‘, config=Config(signature_version=‘s3v4‘))
s3.meta.client.upload_file(‘/tmp/hello.txt‘, ‘mybucket‘, ‘hello.txt‘)

2. 区域命名

使用过AWS的都应该知道,需要选择服务器所在区域,即region。

但是在boto所提供的文档中,却没有提供区域与region的对照。

例如:你选择亚太地区(首尔)-- Asia Pacific (Seoul), 但如果你设置region为‘Seoul’,就会有‘’access abort‘’的错误。

如果要设置region,请参考下表

AWS区域设置对照表

us-east-1 美国东部(弗吉尼亚北部) US East (N. Virginia)
us-west-1 美国西部(加利福尼亚北部) US West (N. California)
us-west-2 美国西部(俄勒冈) US West (Oregon)
ap-northeast-1 亚太地区(东京) Asia Pacific (Tokyo)
ap-southeast-1 亚太地区(新加坡) Asia Pacific (Singapore)
ap-southeast-2 亚太地区(悉尼) Asia Pacific (Sydney)
ap-northeast-2 亚太地区(首尔) Asia Pacific (Seoul)
eu-west-1 欧洲(爱尔兰) EU (Ireland)
eu-central-1 欧洲(法兰克福) EU (Frankfurt)
sa-east-1 南美洲(圣保罗) South America (Sao Paulo)
cn-north-1 中国(北京) cn-north-1
时间: 2024-11-18 08:33:28

Python使用boto3操作AWS S3中踩过的坑的相关文章

ng-zorro-antd中踩过的坑

ng-zorro-antd中踩过的坑 前端项目中,我们经常会使用阿里开源的组件库:ant-design,其提供的组件已经足以满足多数的需求,拿来就能直接用,十分方便,当然了,有些公司会对组件库进行二次封装,改造成极具自家风格的产品. 在本系列的文章中,不谈高大上的东西,不深究底层源码,只分享一些项目中遇到的小问题. 表格(table) --师傅以为是组件库的bug,没想到-- 不知道正在阅读本文的读者有没有经历过: 在使用 <nz-table></nz-table> 的时候,删除表

2019爬虫项目总结——我在项目中踩的那些坑

2019刚出校门,初到公司,最大的成就是完成了一个全球抓取数据的系统!简单介绍一下这个项目的实现思路以及在项目中踩过的坑,随时告诫自己以后尽量避免! 历时一个半月还多几天,终于通过交付测试了!项目是从全球范围内,通过Google,Bing,雅虎来抓取数据,由于服务器不是特别的好,并且考虑到会有很多的脏数据,我们在实现的时候并没有将数据入库,想要将数据进行持久化的保存,可以使用导出的方式将数据以电子表格的方式导出来! 难点一: 项目经历了一次大的改版,将整个的抓取流程做了一次很大的改动.我们在抓取

使用ffmpeg视频编码过程中踩的一个坑

今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,很多时候一旦思维定势真的挺难突破的.下面是不正确的编码结果: 使用ffmpeg做视频编码过程中,首先要新建数据帧,并为数据帧分配相应内存,以便于保存图像数据,为数据帧分配内存需要用到av_image_alloc()这个函数,该函数将根据传入的图像宽.高.图像格式.数据对齐基数等参数进行内存分配. 这其中有一个参数可能会让人迷惑,那就是数据对齐基数这个参数该设置多少?顺便说说为什么要数据对齐,之所以要对齐,主要

Android 开发中踩过的坑之十一: 团队协作的坑

工作中,android的坑很多,一部分是android源码自身的逻辑陷阱, 但跟多的是自己和同事们由于种种原因埋下的坑. 提高面向对象的能力,并恰当的实现在代码中,能够极大的减少坑人和被坑几率. 面向对象的最大特征是复用, 复用的目的是减少工作量,减少错误几率,提高工作效率. 总结几个自己的体会,以自勉: 1 在编码前明确代码的模块框架, 定义最简单的接口. 有人也许说, 书生造反,十年不成, 在工期紧张或者其他类似敏捷编程的大背景下, 先干起来才是硬道理. 事实上, 工期紧张也许正是因为之前的

~~在python中踩过的坑~~(不断更新)

python说简单也不难,但是在这其中大大小小的点 真的是有够折磨人欸! 1.   input 输入的时候,即使输入的是数字,数据类型也是字符串  2.   字符串本质上来看可以看作有序数组 原文地址:https://www.cnblogs.com/jevious/p/11116180.html

Android 开发中踩过的坑之六:几个关于View的tips

这几个点, 不算是坑, 但是也确实浪费了我一些时间 1.ScrollView的高设置成"wrap_content"会缩的很小,  ScrollView内只允许嵌套一个View, 并且不要将他的高度设置为"wrap_content", 否则它会缩小到很短的样子. ListView也是一样. 2.ListView中的Item如果有不同的样式,最好使用getItemViewType()来区别 事实上, 在ListView的Item完全可以用一种View布局来控制Visia

spring-data-redis 使用过程中踩过的坑

spring-data-redis简介 Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作.异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现. spring-data-redis针对jedis提供了如下功能: 连接池自动管理,提供了一个高度封装的“RedisT

host不能访问虚拟机内web service中踩到的坑--2017年5月3日

host访问vm中的web service,一直显示不能连接 关闭host和vm中的防火墙,查看host中端口占用情况,都无果 最后发现启动服务的方式错了: python manage.py runserver 0.0.0.0:port 监听所有ip python manage.py runserver 只能在本地访问

那些年,我们在Django web开发中踩过的坑(一)——神奇的‘/’与ajax+iframe上传

一.上传图片并在前端展示 为了避免前端整体刷新,我们采用ajax+iframe(兼容所有浏览器)上传,这样用户上传之后就可以立即看到图片: 上传前: 上传后: 前端部分html: <form style="display: inline-block" id="upload_img_form" name="form" action="/upload/" method="POST" enctype=&qu