Python 资源、客户端和会话之间的boto3差异?
我正在Ubuntu 16.04 LTS中使用Python 2.7.12。我正在通过以下链接学习如何使用boto3:。我的疑问是什么时候使用资源、客户端或会话,以及它们各自的功能。我会尽量简单地解释。因此,无法保证实际术语的准确性 是启动AWS服务连接的地方。例如,以下是使用默认凭据配置文件的默认会话(例如~/.aws/凭据,或假设您的EC2使用IAM实例配置文件) 由于默认会话仅限于使用的配置文件或实例配置文件,因此有时您需要使用自定义会话来覆盖默认会话配置(例如,区域名称、端点url等),例如 :这是建议使用的高级服务级别。这允许您绑定特定的AWS资源并将其传递,因此您只需使用此抽象,而不用担心指向哪个目标服务。正如您从会话部分注意到的,如果您有一个自定义会话,您只需传递这个抽象对象,而不必担心要传递的所有自定义区域等。下面是一个复杂的例子 例如 是低级类对象。对于每个客户端调用,需要显式指定目标资源,指定的服务目标名称必须为pass long。您将失去抽象能力 例如,如果您只处理默认会话,则这与bot3.resource类似Python 资源、客户端和会话之间的boto3差异?,python,boto3,Python,Boto3,我正在Ubuntu 16.04 LTS中使用Python 2.7.12。我正在通过以下链接学习如何使用boto3:。我的疑问是什么时候使用资源、客户端或会话,以及它们各自的功能。我会尽量简单地解释。因此,无法保证实际术语的准确性 是启动AWS服务连接的地方。例如,以下是使用默认凭据配置文件的默认会话(例如~/.aws/凭据,或假设您的EC2使用IAM实例配置文件) 由于默认会话仅限于使用的配置文件或实例配置文件,因此有时您需要使用自定义会话来覆盖默认会话配置(例如,区域名称、端点url等),例如
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服务生成
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资源的子资源和集合
- 根据资源说明生成
资源
版本的代码更简单、更紧凑,并且具有更大的功能(它为您进行分页)。如果您希望包含分页,那么客户端
版本的代码实际上比上面显示的更复杂
会话:
- 存储配置信息(主要是凭据和选定区域)
- 允许您创建服务客户端和资源
- 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)