【AWS系列】boto3入门-上篇

简介: 官方介绍:官方文档Boto 是AWS的基于python的SDK(当然还支持其他语言的SDK,例如Ruby, Java等),Boto允许开发人员编写软件时使用亚马逊等服务像S3和EC2等,Boto提供了简单,面向对象的API,也提供了低等级的服务接入。这里需要区分,Boto有两个版本,其中旧的版本boto2已经不推荐使用了,在一些亚马逊新建的region已经不支持旧的Boto2了(貌似中国就是这样的),所以如果开发Python代码的话建议使用Boto3。为什么不推荐Boto2?



awsAmazon 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
image.gif

2,配置aws:

aws configure
image.gif

image.png

image.gif编辑

根据提示输入:

    • 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)
    image.gif

    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')
        image.gif

        创建一个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
        image.gif

        访问一个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
        image.gif

        列出所有的bucket

        s3 = boto3.client('s3')
        response = s3.list_buckets()
        print('Existing buckets:')
        for bucket in response['Buckets']:
            print(f'{bucket["Name"]}')
        image.gif

        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
          image.gif

          upload_fileobj()示例:

          s3 = boto3.client('s3')
          with open("FILE_NAME", "rb") as f:
              s3.upload_fileobj(f, "BUCKET_NAME", "OBJECT_NAME")
          image.gif

          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"',
              }
          )
          image.gif

          上传回调函数

          一边上传一边打印上传进度可以通过实现Callback回调来实现。

          s3.upload_file(
              'FILE_NAME', 'BUCKET_NAME', 'OBJECT_NAME',
              Callback=ProgressPercentage('FILE_NAME')
          )
          image.gif
          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()
          image.gif


          相关文章
          |
          7月前
          |
          数据采集 人工智能 搜索推荐
          快速入门:利用Go语言下载Amazon商品信息的步骤详解
          本文探讨了使用Go语言和代理IP技术构建高效Amazon商品信息爬虫的方法。Go语言因其简洁语法、快速编译、并发支持和丰富标准库成为理想的爬虫开发语言。文章介绍了电商网站的发展趋势,如个性化推荐、移动端优化和跨境电商。步骤包括设置代理IP、编写爬虫代码和实现多线程采集。提供的Go代码示例展示了如何配置代理、发送请求及使用goroutine进行多线程采集。注意需根据实际情况调整代理服务和商品URL。
          快速入门:利用Go语言下载Amazon商品信息的步骤详解
          |
          Kubernetes Java API
          Kubernetes官方java客户端之六:OpenAPI基本操作
          kubernetes官方java客户端的第二个基本能力:基于OpenAPI的功能接口
          760 0
          Kubernetes官方java客户端之六:OpenAPI基本操作
          |
          Linux iOS开发 MacOS
          如何使用微软免费提供的应用服务搭建Python网站?
          如何使用微软免费提供的应用服务搭建Python网站?
          122 0
          |
          开发工具
          【AWS系列】boto3入门-下篇
          下载文件和上传文件是对称的Client、Bucket、Object三个对象提供了、。是并行的,是串行的,这两个函数同样提供了ExtraArgs和Callback参数。描述了下载过程的ExtraArgs的可用参数。
          1055 0
          【AWS系列】boto3入门-下篇
          |
          Java Go API
          Grpc初体验
          Grpc初体验
          126 0
          gRPC 官方文档中文版 V1.0
          http://doc.oschina.net/grpc?t=57966
          2326 0
          |
          Cloud Native 前端开发 Go
          探索 Golang 云原生游戏服务器开发,根据官方示例实战 Gorilla WebSocket 的用法
          探索 Golang 云原生游戏服务器开发,根据官方示例实战 Gorilla WebSocket 的用法
          696 0
          |
          存储 Cloud Native 应用服务中间件
          Golang 云原生分布式社交游戏服务器,Nakama Server 简介
          Golang 云原生分布式社交游戏服务器,Nakama Server 简介
          1331 0
          |
          Web App开发 Java 数据安全/隐私保护
          |
          存储 网络协议

          热门文章

          最新文章