我在Ubuntu 16.04 LTS中使用Python 2.7.12。我正在学习如何使用以下链接中的boto3:https://boto3.readthedocs.io/en/latest/guide/quickstart.html#using-boto-3。我怀疑的是何时使用资源,客户端或会话以及它们各自的功能。
答案 0 :(得分:111)
以下是有关Client,Resource和Session的详细信息。
<强>客户端:强>
以下是客户级访问S3存储桶对象的示例(最多1000个**):
import boto3
client = boto3.client('s3')
response = client.list_objects(Bucket='mybucket')
for content in response['Contents']:
obj_dict = client.get_object(Bucket='mybucket', Key=content['Key'])
print(content['Key'], obj_dict['LastModified'])
**你必须使用paginator,或者实现你自己的循环,如果超过1000,则用连续标记重复调用list_objects()。
<强>资源:强>
以下是使用对S3存储桶对象(全部)的资源级访问的等效示例:
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
for obj in bucket.objects.all():
print(obj.key, obj.last_modified)
请注意,在这种情况下,您不必进行第二次API调用即可获取对象;它们可以作为桶上的集合使用。这些子资源集合是延迟加载的。
你可以看到代码的Resource
版本更简单,更紧凑,并且具有更多功能(它为你做分页)。如果您想要包含分页,Client
版本的代码实际上会比上面显示的更复杂。
<强>会话强>
有关这些boto3概念的更多信息的有用资源是introductory re:Invent video。
答案 1 :(得分:67)
我会尝试尽可能简单地解释它。因此无法保证实际条款的准确性。
Session 是启动与AWS服务的连接的地方。例如。以下是使用默认凭据配置文件的默认会话(例如〜/ .aws / credentials,或假设您的EC2使用IAM实例配置文件)
sqs = boto3.client('sqs')
s3 = boto3.resource('s3')
由于默认会话是对使用的配置文件或实例配置文件的限制,因此有时您需要使用自定义会话来覆盖默认会话配置(例如region_name,endpoint_url等),例如:
# custom resource session must use boto3.Session to do the override
my_west_session = boto3.Session(region_name = 'us-west-2')
my_east_sesison = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource('s3')
video_s3 = my_east_sesison.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')
Resource :这是建议使用的高级服务类。这允许您绑定特定的AWS资源并将其传递,因此您只需使用此抽象而不是担心指向哪个目标服务。正如您从会话部分注意到的那样,如果您有自定义会话,则只需传递此抽象对象,而不是担心所有自定义区域等都要传递。以下是一个复杂的例子 例如。
import boto3
my_west_session = boto3.Session(region_name = 'us-west-2')
my_east_sesison = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource("s3")
video_s3 = my_east_sesison.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)
Client 是一个低级别的对象。对于每个客户端调用,您需要明确指定目标资源,指定的服务目标名称必须传递长。你将失去抽象能力。
例如,如果您只处理默认会话,这看起来类似于boto3.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_sesison.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')