我正在Ubuntu 16.04 LTS中使用Python 2.7.12。我正在通过以下链接学习如何使用boto3:https://boto3.readthedocs.io/en/latest/guide/quickstart.html#using-博托-3。我的疑问是何时使用资源、客户端或会话,以及它们各自的功能。
我会尽量简单地解释。所以不能保证实际条款的准确性。
会话是启动与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')
客户端和资源是boto3 SDK中用于发出AWS服务请求的两种不同抽象。如果您想使用boto3对AWS服务进行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()。
好的,这就是底层客户端接口。现在进入更高级别(更抽象)的资源接口。
资源:
下面是使用资源级别访问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凭据。
会议:
了解更多关于这两个概念的有用资源是介绍性的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)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。