【AWS系列】第一讲:boto3入门-上篇

本文介绍了AWS及Boto3相关概念,推荐使用Boto3版本。详细说明了boto3和awscli的安装与配置,介绍了boto3 session等关键字参数。还阐述了使用Boto3操作Amazon S3的方法,包括创建连接、Bucket,访问Bucket以及上传文件,同时提及上传文件的ExtraArgs和回调函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 目录

1、概念介绍

2、安装&关键字介绍

boto3 session

ssession

参数说明:

available_profiles

参数说明:

3、使用介绍

3.1 Service Amazon S3

创建一个连接

 创建一个Bucket

访问一个bucket

3.2 上传文件

upload_file()示例:

upload_fileobj()示例:

ExtraArgs

上传回调函数


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_idsecret_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()

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颜淡慕潇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值