संसाधन, ग्राहक और सत्र के बीच boto3 में अंतर?


216

मैं Ubuntu 16.04 LTS में पायथन 2.7.12 का उपयोग कर रहा हूं। मैं निम्नलिखित लिंक से boto3 का उपयोग करना सीख रहा हूं: https://boto3.readthedocs.io/en/latest/guide/quickstart.html#use-boto-3 । मेरा संदेह संसाधन, ग्राहक या सत्र और उनकी संबंधित कार्यक्षमता का उपयोग करने के लिए है।

जवाबों:


248

ग्राहक , संसाधन और सत्र के बारे में कुछ और विस्तृत जानकारी यहाँ दी गई है ।

ग्राहक:

  • निम्न-स्तरीय AWS सेवा पहुंच
  • AWS सेवा विवरण से उत्पन्न
  • डेवलपर को बोटोकोर क्लाइंट को उजागर करता है
  • आमतौर पर AWS सेवा एपीआई के साथ 1: 1 के नक्शे
  • सभी AWS सेवा संचालन ग्राहकों द्वारा समर्थित हैं
  • साँप-आवरण विधि नाम (उदाहरण के लिए ListBuckets API => list_buckets विधि)

यहां S3 बाल्टी के ऑब्जेक्ट्स में क्लाइंट-लेवल एक्सेस का एक उदाहरण है (अधिकतम 1000 **):

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'])

** आप एक का उपयोग करना होगा paginator ) बार-बार एक निरंतरता मार्कर के साथ, या अपने स्वयं पाश लागू, बुला list_objects (यदि वहाँ 1000 से अधिक थे।

संसाधन:

  • उच्च-स्तरीय, ऑब्जेक्ट-ओरिएंटेड API
  • संसाधन विवरण से उत्पन्न
  • पहचानकर्ताओं और विशेषताओं का उपयोग करता है
  • कार्यों (संसाधनों पर संचालन)
  • AWS संसाधनों के उप-स्रोत और संग्रह को उजागर करता है
  • AWS सेवाओं का 100% एपीआई कवरेज प्रदान नहीं करता है

यहां S3 बाल्टी की वस्तुओं (सभी) में संसाधन-स्तरीय पहुंच का उपयोग करके समान उदाहरण दिया गया है:

import boto3

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

ध्यान दें कि इस स्थिति में आपको वस्तुओं को प्राप्त करने के लिए दूसरी एपीआई कॉल करने की आवश्यकता नहीं है; वे आपके लिए बाल्टी पर एक संग्रह के रूप में उपलब्ध हैं। उप-स्रोतों के ये संग्रह आलस्य से भरे हुए हैं।

आप देख सकते हैं कि Resourceकोड का संस्करण बहुत सरल है, अधिक कॉम्पैक्ट है, और इसमें अधिक क्षमता है (यह आपके लिए पेजिनेशन करता है)। Clientयदि आप पृष्ठांकन को शामिल करना चाहते हैं तो कोड का संस्करण वास्तव में ऊपर दिखाए गए से अधिक जटिल होगा।

सत्र:

  • कॉन्फ़िगरेशन जानकारी संग्रहीत करता है (मुख्य रूप से क्रेडेंशियल्स और चयनित क्षेत्र)
  • आपको सेवा क्लाइंट और संसाधन बनाने की अनुमति देता है
  • जरूरत पड़ने पर boto3 आपके लिए एक डिफ़ॉल्ट सत्र बनाता है

इन boto3 अवधारणाओं के बारे में अधिक जानने के लिए एक उपयोगी संसाधन परिचयात्मक पुन: आविष्कार वीडियो है


2
क्या ग्राहक और संसाधन के बीच कोई प्रदर्शन अंतर है? मुझे यह समस्या थी कि ग्राहक के उपयोग से वर्ग कतार से संदेश हटाने में तेज़ी थी और संसाधन का उपयोग करने में धीमी थी।
वालस्टीन

3
@Vaulstein मेरे पास साझा करने के लिए कोई विशिष्ट तुलना नहीं है, लेकिन मैं आमतौर पर ग्राहक इंटरफेस को संसाधनों की तुलना में हल्का होने की उम्मीद करूंगा और इसलिए संभवतः रनटाइम के दौरान तेजी से (हालांकि कोड के खिलाफ धीमा)।
जरमोद

@jarmod सीखने के भाग के रूप में, मैंने दोनों विधियों का उपयोग करके S3 बाल्टी बनाने की कोशिश की है। मुझे लगता है कि, "संसाधन" की तुलना में "क्लाइंट" का उपयोग करते समय संसाधन निर्माण तेजी से हो रहा है। क्या यह सही है? यदि ऐसा है, तो क्लाइंट के साथ संसाधन निर्माण क्यों तेज है?
सरवनन जी

1
@SaravananG यदि आप s3.set_stream_logger('botocore'), आप मेटा-प्रोग्रामिंग के लॉग देख सकते हैं जो कि boto3 (botocore को कॉल करना) अंडर-हुड करता है। यह काम करता है ताकि आप के लिए नहीं है। इसमें कस्टमाइज़ेशन / प्लग-इन की पूरी घटना प्रणाली है और अनुरोध तैयार करने, प्रतिक्रिया पार्स करने और आश्रित कॉल का पीछा करने के लिए घटनाओं की गहरी (3)? पैरामीटर बिल्डिंग, रिक्वेस्ट साइनिंग, रीजन डिटेक्शन उल्लेखनीय हैं। FYI करें यह संशोधित करने के लिए एक जादुई दर्द है। आसान परिवर्तन देखें
5

89

मैं कोशिश करूँगा और इसे यथासंभव सरल समझाऊंगा। इसलिए वास्तविक शब्दों की सटीकता की कोई गारंटी नहीं है।

सत्र वह है जहां AWS सेवाओं से कनेक्टिविटी शुरू करने के लिए। उदाहरण के बाद डिफ़ॉल्ट सत्र है जो डिफ़ॉल्ट क्रेडेंशियल प्रोफ़ाइल का उपयोग करता है (जैसे ~ / .aws / क्रेडेंशियल, या IAM उदाहरण प्रोफ़ाइल का उपयोग करके अपने EC2 मान लें)

sqs = boto3.client('sqs')
s3 = boto3.resource('s3')

क्योंकि डिफ़ॉल्ट सत्र प्रोफ़ाइल या इंस्टेंस प्रोफ़ाइल की सीमा होती है, कभी-कभी आपको डिफ़ॉल्ट सत्र कॉन्फ़िगरेशन को ओवरराइड करने के लिए कस्टम सत्र का उपयोग करने की आवश्यकता होती है (जैसे कि area_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_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)

क्लाइंट निम्न स्तर की क्लास ऑब्जेक्ट है। प्रत्येक क्लाइंट कॉल के लिए, आपको लक्ष्यीकरण संसाधनों को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता होती है, नामित सेवा लक्ष्य नाम लंबे पास होना चाहिए। आप अमूर्त क्षमता खो देंगे।

उदाहरण के लिए, यदि आप केवल डिफ़ॉल्ट सत्र से निपटते हैं, तो यह 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_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') 

नाबालिग। क्या कोई कीवर्ड 'ऑब्जेक्ट' नहीं है?
स्वगतिका

क्या हमें समानांतर एक फ़ंक्शन या मॉड्यूल में 'संसाधन' और 'क्लाइंट' दोनों का उपयोग करने से बचना चाहिए?
जॉन ओवरिरॉन

1
@ जॉनोनिरॉन सभी एडब्ल्यूएस सेवा में "संसाधन" समकक्ष नहीं है, इसलिए आपको अभी भी निम्न स्तर "क्लाइंट" की आवश्यकता है। यदि आप परिनियोजन के लिए उपयोग करने का इरादा रखते हैं, तो क्लाउड को उपयोग करने के लिए अनुशंसा की जाती है (यह सीखना मुश्किल है, लेकिन लंबे समय तक आपको समय की बचत करेगा) एपीआई को स्वचालित करने के लिए।
मूटमूट

@mootmoot लेकिन aws की सेवाओं / संसाधनों की क्वेरी / हेरफेर करना इन APIs द्वारा आसानी से किया जा सकता है बजाय आउटपुट लाने के या क्लाउडफॉर्म के माध्यम से स्टैक अपडेट करने से। क्या मैं सही हूँ?
एसके वेंकट

@SKVenkat यदि यूयू मल्टी इंटीग्रेशन, आदि का उपयोग करके मल्टी-सर्वर परिनियोजन का निर्माण शुरू करता है, तो क्लाउडफॉर्म / टेराफॉर्म / हीट को बनाए रखना बहुत आसान है और फिर boto3 कोड का उपयोग करना।
मूटमूट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.