Kaynak, istemci ve oturum arasındaki boto3 farkı?


Yanıtlar:


248

İşte ne istemci , kaynak ve oturum hakkında daha ayrıntılı bilgi .

Müşteri:

  • düşük seviyeli AWS servis erişimi
  • AWS hizmetinden üretildi tanımından
  • Botocore istemcisini geliştiriciye sunar
  • genellikle 1: 1'i AWS hizmet API'sı ile eşler
  • tüm AWS servis işlemleri istemciler tarafından desteklenir
  • yılan kasalı yöntem adları (örn. ListBuckets API => list_buckets yöntemi)

Bir S3 grubunun nesnelerine istemci düzeyinde erişimin bir örneği (en fazla 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'])

** Eğer bir kullanması gerekir paginator daha 1000'den olsaydı devamı işaretleyici ile defalarca) (list_objects çağırarak, veya kendi döngü uygulamak.

Kaynak:

  • daha üst düzey, nesne yönelimli API
  • kaynaktan üretildi tanımından
  • tanımlayıcıları ve nitelikleri kullanır
  • eylemleri var (kaynaklar üzerindeki işlemler)
  • AWS kaynaklarının alt kaynaklarını ve koleksiyonlarını gösterir
  • AWS hizmetlerinin% 100 API kapsamını sağlamaz

İşte bir S3 grubunun nesnelerine (tümü) kaynak düzeyinde erişimi kullanan eşdeğer örnek:

import boto3

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

Bu durumda, nesneleri almak için ikinci bir API çağrısı yapmanız gerekmediğini unutmayın; kova üzerinde bir koleksiyon olarak kullanılabilirler. Bu alt kaynak koleksiyonları tembel olarak yüklenir.

Bunu görebilirsiniz Resourcekod sürümü, çok daha basit daha kompakt ve daha yeteneği (sizin için pagination yapar) sahiptir. ClientKod sürümü aslında daha sen pagination dahil etmek istiyorsa yukarıda gösterilen daha karmaşık olacaktır.

Oturum, toplantı, celse:

  • yapılandırma bilgilerini saklar (öncelikle kimlik bilgileri ve seçilen bölge)
  • hizmet istemcileri ve kaynakları oluşturmanıza olanak tanır
  • boto3 gerektiğinde sizin için varsayılan bir oturum oluşturur

Bu boto3 kavramları hakkında daha fazla bilgi edinmek için yararlı bir kaynak, giriş niteliğindeki yeniden icat videosudur .


2
İstemci ve kaynak arasında herhangi bir performans farkı var mı? Sqs kuyruğundan mesaj silme istemci kullanarak daha hızlı ve kaynak kullanarak daha yavaş olduğu bu sorun vardı.
Vaulstein

3
@Vaulstein Paylaşmak için belirli bir karşılaştırma yok ama genellikle istemci arayüzleri kaynaklardan daha hafif ve dolayısıyla çalışma zamanında potansiyel olarak daha hızlı olmasını beklerdim (kodlamak daha yavaş olsa da).
jarmod

@jarmod Öğrenmenin bir parçası olarak, her iki yöntemi kullanarak S3 kovası oluşturmaya çalıştım. "İstemci" kullanılırken "Kaynak" ile karşılaştırıldığında kaynak yaratmanın daha hızlı gerçekleştiğini hissediyorum. Doğru mu? Öyleyse, istemci ile neden kaynak oluşturma daha hızlı?
Saravanan G

1
@SaravananG İsterseniz s3.set_stream_logger('botocore'), boto3'ün (botocore'a çağrı yaparak) başlığın altında yaptığı meta-programlama günlüklerini görebilirsiniz. İşe yarıyor, böylece zorunda değilsiniz. Özelleştirme / takılabilirlik için tüm bir olay sistemine ve istek hazırlama, yanıt ayrıştırma ve bağımlı çağrıları zincirleme gibi 3 (+?) Derin olay sınıflandırmasına sahiptir. Parametre oluşturma, istek imzalama, bölge algılama dikkat çekicidir. Bilginize değiştirmek büyülü bir acı. Kolay değişime bakın .
mcint

89

Mümkün olduğunca basit bir şekilde açıklamaya çalışacağım. Dolayısıyla, gerçek terimlerin doğruluğunun garantisi yoktur.

Oturum , AWS hizmetlerine bağlantının nerede başlatılacağıdır. Örneğin, varsayılan kimlik bilgisi profilini kullanan varsayılan oturum aşağıdadır (örn. ~ / .Aws / kimlik bilgileri veya IAM örnek profilini kullanarak EC2'nizi varsayalım)

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

Varsayılan oturum kullanılan profil veya örnek profiliyle sınırlı olduğundan, bazen varsayılan oturum yapılandırmasını (ör. Bölge_adı, bitiş noktası_url vb.) Geçersiz kılmak için özel oturumu kullanmanız gerekir.

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

Kaynak : Bu, kullanılması önerilen üst düzey hizmet sınıfıdır. Bu, belirli AWS kaynaklarını bağlamanıza ve aktarmanıza izin verir, böylece bu soyutlamayı hangi hedef hizmetlerin işaret edildiğinden endişe etmekten daha çok kullanırsınız. Oturum bölümünde fark ettiğiniz gibi, özel bir oturumunuz varsa, bu soyut nesneyi, geçmek için tüm özel bölgeler vb. Aşağıda karmaşık bir örnek verilmiştir.

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)

müşteri düşük seviyeli bir sınıf nesnesidir. Her müşteri çağrısı için, hedefleme kaynaklarını açıkça belirtmeniz gerekir, belirlenen hizmet hedefi adı uzun süre iletilmelidir. Soyutlama yeteneğini kaybedeceksiniz.

Örneğin, yalnızca varsayılan oturumla ilgileniyorsanız, boto3.resource öğesine benzer.

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

Ancak, farklı bölgelerdeki bir gruptaki nesneleri listelemek istiyorsanız, istemci için gereken açık kova parametresini belirtmeniz gerekir.

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

minör. 'nesne' bir anahtar kelime değil mi?
Swagatika

Hem "kaynak" hem de "istemci" yi bir işlev veya modülde kullanmaktan kaçınmalı mıyız?
John Overiron

1
@JohnOveriron Tüm AWS hizmetlerinin bir "kaynak" karşılığı yoktur, bu nedenle yine de düşük düzey "istemciye" ihtiyacınız vardır. Dağıtımlar için kullanmayı planlıyorsanız, dağıtımları otomatikleştirmek için API kullanmak yerine bulutbilgisi kullanmanız önerilir (öğrenmesi zordur, ancak uzun vadede size zaman kazandırır).
mootmoot

@mootmoot Ancak aws hizmetlerini / kaynaklarını sorgulamak / değiştirmek, çıktıları getirmek veya yığını bulut oluşturma yoluyla güncellemek yerine bu API'lar tarafından kolayca yapılabilir. Doğrumuyum?
SK Venkat

@SKVenkat Sürekli sunucu entegrasyonu vb. Kullanarak çoklu sunucu dağıtımı oluşturmaya başlarsanız, bulutlama / terraform / ısı kullanımı boto3 kodu kullanarak çok daha kolaydır.
mootmoot
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.