Unterschied in boto3 zwischen Ressource, Client und Sitzung?

Antworten:

247

Hier finden Sie detailliertere Informationen zu Client , Ressource und Sitzung .

Klient:

  • AWS-Servicezugriff auf niedriger Ebene
  • erzeugt aus AWS Service description
  • macht den Botocore-Client für den Entwickler verfügbar
  • Ordnet normalerweise 1: 1 der AWS-Service-API zu
  • Alle AWS-Servicevorgänge werden von Clients unterstützt
  • Methodennamen mit Schlangengehäuse (z. B. ListBuckets API => list_buckets-Methode)

Hier ist ein Beispiel für den Zugriff auf Client-Ebene auf Objekte eines S3-Buckets (höchstens 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'])

** Sie müssten einen Paginator verwenden oder eine eigene Schleife implementieren und list_objects () wiederholt mit einer Fortsetzungsmarkierung aufrufen, wenn mehr als 1000 vorhanden wären.

Ressource:

  • übergeordnete, objektorientierte API
  • aus Ressource generiert Ressourcenbeschreibung
  • verwendet Bezeichner und Attribute
  • hat Aktionen (Operationen an Ressourcen)
  • macht Unterressourcen und Sammlungen von AWS-Ressourcen verfügbar
  • bietet keine 100% ige API-Abdeckung für AWS-Services

Hier ist das entsprechende Beispiel für den Zugriff auf Ressourcenebene auf die Objekte eines S3-Buckets (alle):

import boto3

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

Beachten Sie, dass Sie in diesem Fall keinen zweiten API-Aufruf ausführen müssen, um die Objekte abzurufen. Sie stehen Ihnen als Sammlung auf dem Eimer zur Verfügung. Diese Sammlungen von Unterressourcen werden träge geladen.

Sie können sehen, dass die ResourceVersion des Codes viel einfacher, kompakter und leistungsfähiger ist (es macht Paginierung für Sie). Die ClientVersion des Codes wäre tatsächlich komplizierter als oben gezeigt, wenn Sie die Paginierung einschließen möchten.

Session:

  • speichert Konfigurationsinformationen (hauptsächlich Anmeldeinformationen und ausgewählte Region)
  • Ermöglicht das Erstellen von Service-Clients und -Ressourcen
  • boto3 erstellt bei Bedarf eine Standardsitzung für Sie

Eine nützliche Ressource, um mehr über diese boto3-Konzepte zu erfahren, ist das einführende Video zu re: Invent .

jarmod
quelle
2
Gibt es einen Leistungsunterschied zwischen Client und Ressource? Ich hatte dieses Problem, bei dem das Löschen von Nachrichten aus der SQL-Warteschlange mit dem Client schneller und mit der Ressource langsamer war.
Vaulstein
3
@Vaulstein Ich habe keine spezifischen Vergleiche zum Teilen, aber ich würde im Allgemeinen erwarten, dass die Client-Schnittstellen leichter als Ressourcen sind und daher zur Laufzeit möglicherweise schneller (obwohl langsamer zu codieren).
Jarmod
@jarmod Als Teil des Lernens habe ich versucht, einen S3-Bucket mit beiden Methoden zu erstellen. Ich bin der Meinung, dass die Ressourcenerstellung bei Verwendung von "Client" im Vergleich zu "Ressource" schneller erfolgt. Ist es richtig? Wenn ja, warum ist die Ressourcenerstellung mit Client schneller?
Saravanan G
1
@SaravananG Wenn Sie s3.set_stream_logger('botocore'), können Sie Protokolle der Metaprogrammierung sehen, die boto3 (Aufruf von botocore) unter der Haube ausführt. Es funktioniert, also müssen Sie nicht. Es verfügt über ein ganzes Ereignissystem zur Anpassung / Plug-Fähigkeit und eine 3 (+?) Tiefe Taxonomie von Ereignissen, um die Vorbereitung von Anforderungen, das Parsen von Antworten und das Verketten abhängiger Anrufe zu handhaben. Parametererstellung, Anforderungssignierung und Regionserkennung sind bemerkenswert. Zu Ihrer Information, es ist ein magischer Schmerz, etwas zu ändern. Siehe einfache Änderung .
Mcint
89

Ich werde versuchen, es so einfach wie möglich zu erklären. Es gibt also keine Garantie für die Richtigkeit der tatsächlichen Bedingungen.

In der Sitzung wird die Konnektivität zu AWS-Diensten initiiert. Beispiel: Es folgt eine Standardsitzung, die das Standardprofil für Anmeldeinformationen verwendet (z. B. ~ / .aws / credentials, oder nehmen Sie an, dass Ihr EC2 das IAM-Instanzprofil verwendet).

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

Da die Standardsitzung auf das verwendete Profil oder Instanzprofil beschränkt ist, müssen Sie manchmal die benutzerdefinierte Sitzung verwenden, um die Standardsitzungskonfiguration (z. B. region_name, endpoint_url usw.) zu überschreiben, z

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

Ressource : Dies ist die übergeordnete Serviceklasse, deren Verwendung empfohlen wird. Auf diese Weise können Sie bestimmte AWS-Ressourcen verknüpfen und weitergeben. Verwenden Sie also nur diese Abstraktion, um sich Sorgen zu machen, auf welche Zieldienste verwiesen wird. Wie Sie im Sitzungsteil feststellen, übergeben Sie bei einer benutzerdefinierten Sitzung nur dieses abstrakte Objekt, ohne sich Gedanken über die Weitergabe aller benutzerdefinierten Regionen usw. zu machen. Es folgt ein kompliziertes Beispiel, z

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)

Klient ist ein Low-Level-Klassenobjekt. Für jeden Clientaufruf müssen Sie die Targeting-Ressourcen explizit angeben. Der angegebene Service-Zielname muss lange übergeben werden. Sie verlieren die Abstraktionsfähigkeit.

Wenn Sie sich beispielsweise nur mit der Standardsitzung befassen, ähnelt dies 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') 

Wenn Sie jedoch Objekte aus einem Bucket in verschiedenen Regionen auflisten möchten, müssen Sie den expliziten Bucket-Parameter angeben, der für den Client erforderlich ist.

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
quelle
geringer. Ist 'Objekt' kein Schlüsselwort?
Swagatika
Sollten wir vermeiden, sowohl 'Ressource' als auch 'Client' parallel zu einer Funktion oder einem Modul zu verwenden?
John Overiron
1
@JohnOveriron Nicht jeder AWS-Service verfügt über ein Gegenstück "Ressource", daher benötigen Sie immer noch den "Client" auf niedriger Ebene. Wenn Sie beabsichtigen, für Bereitstellungen zu verwenden, wird empfohlen, Cloudformation zu verwenden (es ist schwer zu erlernen, spart Ihnen aber auf lange Sicht Zeit), als API zur Automatisierung von Bereitstellungen zu verwenden.
Mootmoot
@mootmoot Das Abfragen / Bearbeiten von aws-Diensten / -Ressourcen kann jedoch mit diesen APIs problemlos durchgeführt werden, anstatt Ausgaben abzurufen oder den Stapel durch Cloud-Informationen zu aktualisieren. Hab ich recht?
SK Venkat
@SKVenkat Wenn Sie mit dem Aufbau einer Multi-Server-Bereitstellung beginnen, die kontinuierliche Integration usw. verwendet, ist Cloudformation / Terraform / Heat viel einfacher zu warten als die Verwendung von Boto3-Code.
Mootmoot