【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


          相关文章
          |
          Linux 数据安全/隐私保护 Windows
          更换(Pypi)pip源到国内镜像
          pip国内的一些镜像 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.
          249389 2
          |
          6月前
          |
          安全 Linux Shell
          Codex CLI 速查表
          本文详解 OpenAI Codex CLI(cx)的安装、配置与实战技巧:涵盖 WSL2/Windows 双环境部署、沙盒安全机制、TOML 配置、AGENTS.md 项目约定、快捷键及斜杠命令,对比 cc 差异,附避坑指南与自动化最佳实践。
          |
          计算机视觉
          Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
          这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
          4714 0
          Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
          |
          XML Java 数据库连接
          解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题
          解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题
          15416 2
          解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题
          |
          供应链 JavaScript 前端开发
          TreeSize:免费的磁盘清理与管理神器,解决C盘爆满的燃眉之急
          博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
          |
          存储 JSON 数据格式
          解密 parquet 文件,以及如何用 Python 去处理它(一)
          解密 parquet 文件,以及如何用 Python 去处理它
          3587 1
          |
          Ubuntu Linux Docker
          弃用Docker Desktop:在WSL2中玩转Docker之Docker Engine 部署与WSL入门
          弃用Docker Desktop:在WSL2中玩转Docker之Docker Engine 部署与WSL入门
          27632 4
          |
          存储 Linux Docker
          在Docker中,本地的镜像文件都存放在哪里?
          在Docker中,本地的镜像文件都存放在哪里?