2017-03-15 52 views

回答

1

要添加到其他答案,特别是在比较客户端和资源时。

客户:

  • 低级别的服务访问从服务描述
  • 产生
  • 暴露botocore客户端向显影剂
  • 通常1映射:1与服务API
  • 蛇形的方法名称(例如ListBuckets API => list_buckets方法)

这里的客户机级访问到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 ,或实现自己的循环中,调用list_objects()反复延续标记,如果有超过1000

资源:

  • 更高级别,从资源描述
  • 使用标识符和属性
  • 有动作(对资源的操作)
  • 暴露子资源和集合

下面是一个生成面向对象的API

  • 资源级访问S3存储桶对象(全部)的示例:

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

    请注意,在这种情况下,您不必进行第二次API调用即可获取对象;他们可以作为一个收集桶。这些子资源的集合是延迟加载的。

    会议:

    • 存储配置信息(主要是证书和选定区域)
    • 允许您创建服务客户端和资源

    一个有用的资源,以了解更多有关这些boto3概念是introductory re:Invent video

  • 25

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

    Session是启动到AWS服务的连接的地方。例如。下面是使用默认的凭据配置文件默认会话(如〜/ .aws /凭证,或使用IAM实例简介假设你的EC2)

    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资源并将其传递,因此您只需使用此抽象,而不用担心目标服务指向的是什么。正如你从会话部分注意到的那样,如果你有一个自定义会话,你只需传递这个抽象对象,而不用担心所有自定义区域等等。以下是一个复杂的例子 E.g.

    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): 
        for object in s3session.list_objects_v2(Bucket=bucket_name) : 
         print(object.key) 
    
    list_bucket_contents(backup_s3, 'backupbucket') 
    list_bucket_contents(video_s3 , 'videobucket') 
    
    相关问题