Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 资源、客户端和会话之间的boto3差异?_Python_Boto3 - Fatal编程技术网

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

Python 资源、客户端和会话之间的boto3差异?,python,boto3,Python,Boto3,我正在Ubuntu 16.04 LTS中使用Python 2.7.12。我正在通过以下链接学习如何使用boto3:。我的疑问是什么时候使用资源、客户端或会话,以及它们各自的功能。我会尽量简单地解释。因此,无法保证实际术语的准确性 是启动AWS服务连接的地方。例如,以下是使用默认凭据配置文件的默认会话(例如~/.aws/凭据,或假设您的EC2使用IAM实例配置文件) 由于默认会话仅限于使用的配置文件或实例配置文件,因此有时您需要使用自定义会话来覆盖默认会话配置(例如,区域名称、端点url等),例如

我正在Ubuntu 16.04 LTS中使用Python 2.7.12。我正在通过以下链接学习如何使用boto3:。我的疑问是什么时候使用资源、客户端或会话,以及它们各自的功能。

我会尽量简单地解释。因此,无法保证实际术语的准确性

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

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

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

是低级类对象。对于每个客户端调用,需要显式指定目标资源,指定的服务目标名称必须为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') 
但是,如果要列出不同区域中某个bucket中的对象,则需要指定客户端所需的显式bucket参数

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') 

客户端资源是boto3 SDK中用于发出AWS服务请求的两种不同抽象。您通常会选择使用客户机抽象或资源抽象。我在下面概述了客户机和资源之间的区别,以帮助读者决定使用哪个

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

这里有一些更详细的信息,这些信息都是关于什么的

客户端:

  • 这是原始的boto3 API抽象
  • 提供低级AWS服务访问
  • 客户端支持所有AWS服务操作
  • 向开发人员公开botocore客户端
  • 通常使用AWS服务API映射1:1
  • 蛇壳方法名称(例如API=>method)
  • 根据AWS服务生成
下面是对S3 bucket对象的客户端级访问的示例:

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资源的子资源和集合
  • 根据资源说明生成
下面是使用资源级别访问S3 bucket对象(全部)的等效示例:

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

您可以看到
资源
版本的代码更简单、更紧凑,并且具有更大的功能(它为您进行分页)。如果您希望包含分页,那么
客户端
版本的代码实际上比上面显示的更复杂

会话:

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

有关这两个概念的更多信息,一个有用的资源是。

minor。“object”不是一个关键字吗?我们应该避免在一个函数或模块中同时使用“resource”和“client”吗?@JohnOveriron并非所有AWS服务都有“resource”对应项,因此您仍然需要低级“client”。如果您打算用于部署,建议使用cloudformation(这很难学习,但从长远来看会节省您的时间),而不是使用API来自动部署。@MootBoot但查询/操作aws服务/资源可以通过这些API轻松完成,而不是通过cloudformation获取输出或更新堆栈。我说的对吗?@S.K.Venkat如果您开始构建多服务器部署,使用持续集成等,那么cloudformation/terraform/heat比使用boto3代码更易于维护。客户端和资源之间是否存在性能差异?我遇到这样一个问题,即使用客户端从sqs队列中删除消息的速度更快,而使用资源的速度较慢。@Vaulstein我没有任何特定的比较可供共享,但我通常认为客户端接口比资源轻,因此在运行时可能更快(尽管编码速度较慢)@SaravananG如果您
s3.set_stream_logger('botocore')
,您可以看到boto3(调用botocore)在引擎盖下执行的元编程日志。它确实有效,所以你不必这么做。它有一个用于定制/可插入性的完整事件系统和一个3(+?)深度的事件分类法,用于处理请求准备、响应解析和链接依赖调用。参数构建、请求签名、区域检测值得注意。仅供参考修改是一种神奇的痛苦@ETL_Devs Broadl
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') 
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'])
import boto3

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