Perbedaan boto3 antara sumber daya, klien, dan sesi?

Jawaban:

248

Berikut adalah beberapa informasi yang lebih terperinci tentang apa itu Klien , Sumber Daya , dan Sesi .

Klien:

  • akses layanan AWS tingkat rendah
  • dihasilkan dari deskripsi layanan AWS
  • menghadapkan klien botocore kepada pengembang
  • biasanya memetakan 1: 1 dengan API layanan AWS
  • semua operasi layanan AWS didukung oleh klien
  • nama metode snake-cased (mis. API ListBuckets => metode list_buckets)

Berikut adalah contoh akses tingkat klien ke objek bucket S3 (paling banyak 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'])

** Anda harus menggunakan paginator , atau menerapkan loop Anda sendiri, memanggil list_objects () berulang kali dengan penanda kelanjutan jika ada lebih dari 1000.

Sumber:

  • API tingkat tinggi, berorientasi objek
  • dihasilkan dari deskripsi sumber daya
  • menggunakan pengidentifikasi dan atribut
  • memiliki tindakan (operasi pada sumber daya)
  • memperlihatkan sub-sumber daya dan koleksi sumber daya AWS
  • tidak menyediakan cakupan API 100% untuk layanan AWS

Berikut adalah contoh yang setara menggunakan akses tingkat sumber daya ke objek bucket S3 (semua):

import boto3

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

Perhatikan bahwa dalam hal ini Anda tidak perlu melakukan panggilan API kedua untuk mendapatkan objek; mereka tersedia untuk Anda sebagai koleksi di ember. Koleksi sub-sumber ini dimuat dengan malas.

Anda dapat melihat bahwa Resourceversi kodenya jauh lebih sederhana, lebih ringkas, dan memiliki lebih banyak kemampuan (ini membuat pagination untuk Anda). The Clientversi kode sebenarnya akan lebih rumit daripada yang ditunjukkan di atas jika Anda ingin menyertakan pagination.

Sidang:

  • menyimpan informasi konfigurasi (terutama kredensial dan wilayah yang dipilih)
  • memungkinkan Anda untuk membuat layanan klien dan sumber daya
  • boto3 membuat sesi default untuk Anda saat dibutuhkan

Sumber yang berguna untuk mempelajari lebih lanjut tentang konsep boto3 ini adalah pengantar re: Invent video .

jarmod
sumber
2
Apakah ada perbedaan kinerja antara klien dan sumber daya? Saya punya masalah ini di mana menghapus pesan dari antrian sqs lebih cepat menggunakan klien dan lebih lambat menggunakan sumber daya.
Vaulstein
3
@Vaulstein Saya tidak punya perbandingan khusus untuk dibagikan, tetapi saya biasanya mengharapkan antarmuka klien lebih ringan dari sumber daya dan karenanya berpotensi lebih cepat saat runtime (meskipun lebih lambat untuk kode terhadap).
jarmod
@jarmod Sebagai bagian dari pembelajaran, saya telah mencoba membuat S3 bucket menggunakan kedua metode ini. Saya merasa bahwa, penciptaan sumber daya terjadi lebih cepat ketika menggunakan "Klien" dibandingkan dengan "Sumber Daya". Apakah tepat? Jika demikian, mengapa penciptaan sumber daya lebih cepat dengan Klien?
Saravanan G
1
@SaravananG Jika Anda s3.set_stream_logger('botocore'), Anda dapat melihat log dari pemrograman meta yang dilakukan boto3 (memanggil botocore) di bawah kap. Ini berhasil sehingga Anda tidak perlu melakukannya. Ini memiliki seluruh sistem acara untuk penyesuaian / plugability dan 3 (+?) Taksonomi acara yang mendalam, untuk menangani persiapan permintaan, penguraian respons, dan merantai panggilan yang bergantung. Pembangunan parameter, penandatanganan permintaan, deteksi kawasan perlu diperhatikan. FYI itu sakit ajaib untuk dimodifikasi. Lihat perubahan mudah .
mcint
89

Saya akan mencoba menjelaskannya sesederhana mungkin. Jadi tidak ada jaminan keakuratan istilah yang sebenarnya.

Session adalah tempat untuk memulai konektivitas ke layanan AWS. Misalnya, berikut adalah sesi default yang menggunakan profil kredensial default (mis. ~ / .Aws / kredensial, atau asumsikan EC2 Anda menggunakan profil instance IAM)

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

Karena sesi default dibatasi untuk profil atau profil instan yang digunakan, kadang-kadang Anda perlu menggunakan sesi khusus untuk mengganti konfigurasi sesi default (mis. Region_name, endpoint_url, dll.) Mis.

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

Sumberdaya : Ini adalah kelas layanan tingkat tinggi yang direkomendasikan untuk digunakan. Ini memungkinkan Anda untuk mengikat sumber daya AWS tertentu dan meneruskannya, jadi Anda hanya menggunakan abstraksi ini daripada khawatir layanan target mana yang diarahkan. Seperti yang Anda perhatikan dari bagian sesi, jika Anda memiliki sesi khusus, Anda hanya melewatkan objek abstrak ini daripada mengkhawatirkan semua wilayah kustom, dll untuk meneruskan. Berikut ini adalah contoh rumit Eg

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)

Klien adalah objek kelas tingkat rendah. Untuk setiap panggilan klien, Anda harus secara spesifik menentukan sumber daya penargetan, nama target layanan yang ditunjuk harus panjang. Anda akan kehilangan kemampuan abstraksi.

Misalnya, jika Anda hanya berurusan dengan sesi default, ini mirip dengan 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') 

Namun, jika Anda ingin membuat daftar objek dari ember di berbagai wilayah, Anda perlu menentukan parameter bucket eksplisit yang diperlukan untuk klien.

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') 
mootmoot
sumber
minor. bukan 'objek' kata kunci?
Swagatika
Haruskah kita menghindari penggunaan 'sumber daya' dan 'klien' secara paralel satu fungsi atau modul?
John Overiron
1
@JohnOveriron Tidak semua layanan AWS memiliki mitra "sumber", jadi Anda masih memerlukan "klien" tingkat rendah. Jika Anda bermaksud menggunakan untuk penyebaran, disarankan untuk menggunakan cloudformation (sulit dipelajari tetapi akan menghemat waktu Anda dalam jangka panjang) daripada menggunakan API untuk mengotomatiskan penyebaran.
mootmoot
@mootmoot Tetapi meminta / memanipulasi layanan / sumber daya aws dapat dilakukan dengan mudah oleh API ini daripada mengambil output atau memperbarui stack melalui cloudformation. Apakah saya benar?
SK Venkat
@SKVenkat Jika Anda mulai membangun penempatan multi-server, menggunakan Integrasi berkelanjutan, dll. Cloudformation / terraform / heat jauh lebih mudah untuk dipelihara daripada menggunakan kode boto3.
mootmoot