0


【AWS系列】boto3入门-上篇

aws是Amazon Web Service的简写,它包括众多服务,其中最有名的两个是EC2和S3。
S3是Simple Storage Service的简写,它是一种对象存储的实现。

官方文档:

​​​​​​​​​​​​​​Boto3 documentation

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
  • region

其中

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()
标签: aws 云计算

本文转载自: https://blog.csdn.net/weixin_36755535/article/details/127422302
版权归原作者 颜淡慕潇 所有, 如有侵权,请联系我们删除。

“【AWS系列】boto3入门-上篇”的评论:

还没有评论