当前位置: 首页 > 知识库问答 >
问题:

资源、客户端和会话之间的boto3差异?

松刚豪
2023-03-14

我正在Ubuntu 16.04 LTS中使用Python 2.7.12。我正在通过以下链接学习如何使用boto3:https://boto3.readthedocs.io/en/latest/guide/quickstart.html#using-博托-3。我的疑问是何时使用资源、客户端或会话,以及它们各自的功能。

共有2个答案

孙凌龙
2023-03-14

我会尽量简单地解释。所以不能保证实际条款的准确性。

会话是启动与AWS服务连接的位置。以下是使用默认凭据配置文件的默认会话。~/. aws/凭据,或假设您的EC2使用IAM实例配置文件)

sqs = boto3.client('sqs')
s3 = boto3.resource('s3')

由于默认会话仅限于使用的配置文件或实例配置文件,因此有时您需要使用自定义会话来覆盖默认会话配置(例如,区域名称、endpointurl等),例如。

# custom resource session must use boto3.Session to do the override
my_west_session = boto3.Session(region_name = 'us-west-2')
my_east_session = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource('s3')
video_s3 = my_east_session.resource('s3')

# you have two choices of create custom client session. 
backup_s3c = my_west_session.client('s3')
video_s3c = boto3.client("s3", region_name = 'us-east-1')

资源:这是建议使用的高级服务类。这允许您绑定特定的AWS资源并将其传递出去,因此您只需使用这个抽象,而不用担心指向哪个目标服务。正如您从会话部分注意到的,如果您有一个自定义会话,您只需传递这个抽象对象,而不用担心所有自定义区域等要传递。下面是一个复杂的例子。

import boto3 
my_west_session = boto3.Session(region_name = 'us-west-2')
my_east_session = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource("s3")
video_s3 = my_east_session.resource("s3")
backup_bucket = backup_s3.Bucket('backupbucket') 
video_bucket = video_s3.Bucket('videobucket')

# just pass the instantiated bucket object
def list_bucket_contents(bucket):
   for object in bucket.objects.all():
      print(object.key)

list_bucket_contents(backup_bucket)
list_bucket_contents(video_bucket)

客户端是一个低级类对象。对于每个客户端调用,需要显式指定目标资源,指定的服务目标名称必须为pass long。您将失去抽象能力。

例如,如果您只处理默认会话,则这与bot3.resource类似。

import boto3 
s3 = boto3.client('s3')

def list_bucket_contents(bucket_name):
   for object in s3.list_objects_v2(Bucket=bucket_name) :
      print(object.key)

list_bucket_contents('Mybucket') 

但是,如果要从不同区域的桶中列出对象,则需要指定客户端所需的显式桶参数。

import boto3 
backup_s3 = my_west_session.client('s3',region_name = 'us-west-2')
video_s3 = my_east_session.client('s3',region_name = 'us-east-1')

# you must pass boto3.Session.client and the bucket name 
def list_bucket_contents(s3session, bucket_name):
   response = s3session.list_objects_v2(Bucket=bucket_name)
   if 'Contents' in response:
     for obj in response['Contents']:
        print(obj['key'])

list_bucket_contents(backup_s3, 'backupbucket')
list_bucket_contents(video_s3 , 'videobucket') 
薄哲
2023-03-14

客户端和资源是boto3 SDK中用于发出AWS服务请求的两种不同抽象。如果您想使用boto3对AWS服务进行API调用,那么可以通过客户端或资源进行调用。

您通常会选择使用客户机抽象或资源抽象,但应用程序可以根据需要同时使用两者。我在下面概述了客户机和资源之间的区别,以帮助读者决定使用哪个。

会话在很大程度上与客户端和资源的概念正交(但两者都使用)。

这里有一些关于客户端、资源和会话的更详细的信息。

客户:

  • 这是原始的boto3 API抽象
  • 它提供低级AWS服务访问
  • 所有AWS服务操作都由客户端支持
  • 它向开发者公开botocore客户端
  • 它通常将1:1映射到AWS服务API
  • 蛇形大小写的方法名称(例如。列表桶API=

下面是客户端级访问S3桶对象的示例:

import boto3

client = boto3.client('s3')
response = client.list_objects_v2(Bucket='mybucket')
for content in response['Contents']:
    obj_dict = client.get_object(Bucket='mybucket', Key=content['Key'])
    print(content['Key'], obj_dict['LastModified'])

注意:此客户端级代码最多只能列出1000个对象。如果有超过1000个对象,您将不得不使用分页器,或者实现自己的循环,用延续标记重复调用list_objects_v2()。

好的,这就是底层客户端接口。现在进入更高级别(更抽象)的资源接口。

资源:

  • 这是更新的boto3 API抽象
  • 它提供高级、面向对象的API
  • 它不提供AWS服务的100%API覆盖率
  • 它使用标识符和属性
  • 它有操作(对资源的操作)
  • 它公开了AWS资源的子资源和集合
  • 它是根据AWS资源描述生成的

下面是使用资源级别访问S3 bucket对象(全部)的等效示例:

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
for obj in bucket.objects.all():
    print(obj.key, obj.last_modified)

注意:在这种情况下,您不必进行第二次API调用来获取对象;它们可以作为桶上的集合提供给您。这些子资源集合是懒惰加载的。

您可以看到Resource版本的代码更简单、更紧凑,并且具有更大的功能(例如,它为您进行分页,并公开属性而不是原始字典)。如果您希望包含分页,那么客户端版本的代码实际上比上面显示的更复杂。

最后,讨论对客户端和资源都至关重要的会话,以及如何访问AWS凭据。

会议:

  • 存储配置信息(主要是凭据和所选区域)
  • 允许您创建服务客户端和资源
  • boto3在需要时为您创建默认会话

了解更多关于这两个概念的有用资源是介绍性的re:Invent视频。

 类似资料:
  • 我正在使用ActiveMQ客户端库将我的服务器应用程序连接到ActiveMQ。几个不同的消费者和生产者在单个线程中运行。、和之间的关系应该如何? 每个JVM一个连接工厂 每个JVM一个到代理的连接或n个连接,每个使用者一个 n个会话,每个消费者一个(Javadoc似乎强烈建议这样做)

  • 我有以下奇怪的行为。 我有一些testcases在开始之前会创建TestValues。首先,创建主实体,并将其与测试值ID一起保存。为此,我使用Springs HibernateTemplate中的saveOrUpdate。 然后创建一些子对象并将其附加到子集合中的此对象。(在hbm.xml中具有cascade=“save-update”)这些子对象在该点没有分配ID。 则调用一个附加的saveO

  • TL;DR:在Spark独立集群中,客户端和集群部署模式之间有什么区别?如何设置应用程序运行的模式? 我们有一个带有三台机器的Spark独立集群,它们都带有Spark 1.6.1: 主机,也是使用运行应用程序的地方 2台相同的工作机 2)如何使用选择应用程序将运行在哪个上?

  • 在过去,我使用Apache的http客户端。我有以下设置: 连接请求超时 连接超时 读取/套接字超时 连接池大小 null

  • 我对RxJava非常陌生,我仍在尝试理解数据流,但我想知道这是否可能,然后再深入兔子洞。 目标:解耦API资源并允许其分布,同时为客户端(web/移动)提供灵活性,以便根据仅提供给少数“已知”APIendpoint的href链接获取数据。 我从一个API中收集了JSON对象,其中每个json都有一个“href”字段,该字段提供指向API资源的链接,可以在其中检索数据的全部详细信息。例如: 检索此集

  • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。