2017-03-15 107 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') 
    
    相關問題