aws是Amazon Web Service的简写,它包括众多服务,其中最有名的两个是EC2和S3。
S3是Simple Storage Service的简写,它是一种对象存储的实现。
官方文档:
1、概念介绍
官方介绍:
Boto is the Amazon Web Services (AWS) SDK for Python, which allows Python developers to write software that makes use of Amazon services like S3 and EC2. Boto provides an easy to use, object-oriented API as well as low-level direct service access.
Boto 是AWS的基于python的SDK(当然还支持其他语言的SDK,例如Ruby, Java等),
Boto允许开发人员编写软件时使用亚马逊等服务像S3和EC2等,Boto提供了简单,面向对象的API,也提供了低等级的服务接入。
这里需要区分,Boto有两个版本,其中旧的版本boto2已经不推荐使用了,在一些亚马逊新建的region已经不支持旧的Boto2了(貌似中国就是这样的),
所以如果开发Python代码的话建议使用Boto3。
为什么不推荐Boto2?因为Boto2大概是2006年开发的,设计时没有考虑后续的很多新增多服务,所以aws重新开发了Boto3.
2、安装&关键字介绍
1,安装boto3和awscli:
note: 先安装boto3,再安装awscli
pip install boto3 awscli
2,配置aws:
aws configure
编辑
根据提示输入:
access_key_id
secret_access_key
- r
egion
其中
access_key_id
,secret_access_key
的默认存储位置为:~/.aws/credentials
:根据提示输入access_key_id, secret_access_key,and region name
除了在终端输入
aws configure
也可以在~/.aws/
下的config 和Credentials 进行配置boto3 session
class boto3.session.Session (aws_access_key_id=None, aws_secret_access_key=None, aws_session_token=None,region_name=None,botocore_session=None, profile_name=None)
ssession
存储配置状态并允许你创建服务客户端和资源
参数说明:
- aws_access_key_id(字符串) -- AWS access key ID
- aws_secret_access_key(字符串) -- AWS secret access key
- aws_session_token(字符串) -- AWS 临时session token
- region_name(字符串) -- 当创建新的连接时的默认区域
- botocore_session(botocore.session_Session) -- 使用这个Botocore session 而不是创建一个 new dafault one
- profile_name(字符串) -- 配置文件的名字去使用,如果没有给出,就用默认的profile
available_profiles
session 证书可用的配置文件
client(
service_name,
region_name=None,
api_version=None,
use_ssl=True,
verify=None,
endpoint=None,
aws_acess_key_id=None,
aws_secret_key=None,
aws_session_token=None config=None
)
通过名字去创建一个低等级的服务客户端。
参数说明:
- service_name(字符串) -- 服务器的名字,例如 's3' 或者 'ec2',可以通过
get_available_services()
去获得有效的一串服务器- region_name(字符串) -- 与客户端相关联的区域名字,一个客户端关联单个区域
- api_version(字符串) -- 要用的API版本,默认的,当创建一个新的client,botocore将使用最新的API version.如果想用客户端的之前的API 版本,你只需要指明这个参数。
- use_ssl(boolean) -- 是否使用SSL,默认是使用SSL,注意:不是所有的服务支持no-ssl 连接
- verify(字符串或者布尔值) -- 是否去认证ssl证书,默认SSL证书需要认证,你可以提供以下的值 False -不去认证SSL证书的有效性,SSL仍然被使用,但是SSL 证书不会被认证 path/to/cert/bundle.pem -要使用的CA证书包的文件名
- endpoint_url -为构建的client去用的全的url,正常情况下,botocore会自动构建一个适合的URL去用来和服务器交流。你可以去指定一个全的URL,(including http/https 模型)去重写这个行为,如果这个value提供了,那
use_ssl
将被忽略- aws_access_key_id(字符串) - 完全的可选项,如果不提供, 将用session的配置,
- aws_secret_access_key(字符串) - 与上面参数类似,可由session自动提供
- aws_session_token(字符串) - 与上面类似
- config(boto.client.Config) 高级的客户端配置选项
3、使用介绍
3.1 Service Amazon S3
创建一个连接
#boto3 import boto3 s3 = boto3.resource('s3')
创建一个Bucket
在boto3,所有的行为必须通过关键字参数传递进去,并且,一个bucket的配置必须手动配置
import logging import boto3 from botocore.exceptions import ClientError def create_bucket(bucket_name): s3 = boto3.client('s3') try s3.create_bucket(Bucket=bucket_name) except ClientError as e: logging.error(e) return False return True
访问一个bucket
用Boto3的resource 去获得一个bucket是非常方便的,但不会自动验证bucket是否真的存在
# Boto 3 import botocore bucket = s3.Bucket('mybucket') exists = True try: s3.meta.client.head_bucket(Bucket='mybucket') except botocore.exceptions.ClientError as e: # If a client error is thrown, then check that it was a 404 error. # If it was a 404 error, then the bucket does not exist. error_code = int(e.response['Error']['Code']) if error_code == 404: exists = False
列出所有的bucket
s3 = boto3.client('s3') response = s3.list_buckets() print('Existing buckets:') for bucket in response['Buckets']: print(f'{bucket["Name"]}')
3.2 上传文件
s3提供了两种文件上传方式:
upload_file()
upload_fileobj()
upload_file()
会把一个大文件拆分成若干个chunk并行上传,因此upload_file()
传输速率较快,它适用于上传内容已经确定的文件。
upload_fileobj()
可用于单线程上传一个二进制流。
upload_file()
示例:
import logging import boto3 from botocore.exceptions import ClientError def upload_file(file_name, bucket, object_name=None): """Upload a file to an S3 bucket :param file_name: File to upload :param bucket: Bucket to upload to :param object_name: S3 object name. If not specified then file_name is used :return: True if file was uploaded, else False """ # If S3 object_name was not specified, use file_name if object_name is None: object_name = file_name # Upload the file s3_client = boto3.client('s3') try: response = s3_client.upload_file(file_name, bucket, object_name) except ClientError as e: logging.error(e) return False return True
upload_fileobj()
示例:
s3 = boto3.client('s3') with open("FILE_NAME", "rb") as f: s3.upload_fileobj(f, "BUCKET_NAME", "OBJECT_NAME")
upload_fileobj()
的文件参数只能是rb模式打开的文件。Client、Bucket、Object三个类型都提供了
upload_file()
和upload_fileobj()
两个函数每个类型提供的同一函数功能都是等价的,并无优劣之分,可以随意调用三个对象的上传文件函数。
ExtraArgs
ExtraArgs提供了上传文件的其它参数,这些参数可用于控制上传文件的读写权限、meta信息等。S3Transfer是一个非常重要的对象,它定义了传输过程中的许多参数,在
boto3.s3.transfer.S3Transfer.ALLOWED_UPLOAD_ARGS中,定义了ExtraArgs可用的参数列表。
示例:
s3.upload_file( 'FILE_NAME', 'BUCKET_NAME', 'OBJECT_NAME', ExtraArgs={'Metadata': {'mykey': 'myvalue'}} ) s3.upload_file( 'FILE_NAME', 'BUCKET_NAME', 'OBJECT_NAME', ExtraArgs={'ACL': 'public-read'} ) s3.upload_file( 'FILE_NAME', 'BUCKET_NAME', 'OBJECT_NAME', ExtraArgs={ 'GrantRead': 'uri="http://acs.amazonaws.com/groups/global/AllUsers"', 'GrantFullControl': 'id="01234567890abcdefg"', } )
上传回调函数
一边上传一边打印上传进度可以通过实现Callback回调来实现。
s3.upload_file( 'FILE_NAME', 'BUCKET_NAME', 'OBJECT_NAME', Callback=ProgressPercentage('FILE_NAME') )
import os import sys import threading class ProgressPercentage(object): def __init__(self, filename): self._filename = filename self._size = float(os.path.getsize(filename)) self._seen_so_far = 0 self._lock = threading.Lock() def __call__(self, bytes_amount): # To simplify, assume this is hooked up to a single filename with self._lock: self._seen_so_far += bytes_amount percentage = (self._seen_so_far / self._size) * 100 sys.stdout.write( "\r%s %s / %s (%.2f%%)" % ( self._filename, self._seen_so_far, self._size, percentage)) sys.stdout.flush()