Differenza in boto3 tra risorsa, client e sessione?


Risposte:


249

Ecco alcune informazioni più dettagliate su cosa sono Client , Risorsa e Sessione .

Cliente:

  • accesso al servizio AWS di basso livello
  • generato dalla descrizione del servizio AWS
  • espone il client botocore allo sviluppatore
  • in genere mappa 1: 1 con l'API del servizio AWS
  • tutte le operazioni di servizio AWS sono supportate dai client
  • nomi dei metodi incastonati (ad es. API ListBuckets => metodo list_buckets)

Ecco un esempio di accesso a livello client agli oggetti di un bucket S3 (al massimo 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'])

** dovresti usare un paginatore o implementare il tuo ciclo, chiamando list_objects () ripetutamente con un marcatore di continuazione se ce ne fossero più di 1000.

Risorsa:

  • API di livello superiore e orientata agli oggetti
  • generato dalla descrizione della risorsa
  • utilizza identificatori e attributi
  • ha azioni (operazioni sulle risorse)
  • espone risorse secondarie e raccolte di risorse AWS
  • non fornisce una copertura API al 100% dei servizi AWS

Ecco l'esempio equivalente che utilizza l'accesso a livello di risorsa agli oggetti di un bucket S3 (tutti):

import boto3

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

Si noti che in questo caso non è necessario effettuare una seconda chiamata API per ottenere gli oggetti; sono disponibili per te come una raccolta sul secchio. Queste raccolte di risorse secondarie sono caricate pigramente.

Puoi vedere che la Resourceversione del codice è molto più semplice, più compatta e ha più capacità (fa impaginazione per te). La Clientversione del codice sarebbe effettivamente più complicata di quella mostrata sopra se si desidera includere l'impaginazione.

Sessione:

  • archivia le informazioni di configurazione (principalmente credenziali e regione selezionata)
  • consente di creare client e risorse di servizio
  • boto3 crea una sessione predefinita per te quando necessario

Una risorsa utile per saperne di più su questi concetti di boto3 è il video introduttivo: Invent .


2
C'è qualche differenza di prestazioni tra client e risorse? Ho avuto questo problema in cui l'eliminazione dei messaggi dalla coda di sqs era più veloce usando il client ed era più lenta usando la risorsa.
Vaulstein,

3
@Vaulstein Non ho paragoni specifici da condividere, ma generalmente mi aspetto che le interfacce client siano più leggere delle risorse e quindi potenzialmente più veloci in fase di esecuzione (anche se più lente rispetto al codice).
jarmod,

@jarmod Nell'ambito dell'apprendimento, ho provato a creare un bucket S3 utilizzando entrambi i metodi. Ritengo che la creazione di risorse avvenga più rapidamente quando si utilizza "Client" rispetto a "Risorsa". È giusto? In tal caso, perché la creazione di risorse è più veloce con Client?
Saravanan G,

1
@SaravananG Se puoi s3.set_stream_logger('botocore'), puoi vedere i registri della meta-programmazione che boto3 (chiamando a botocore) esegue sottocoperta. Funziona quindi non è necessario. Ha un intero sistema di eventi per personalizzazione / plug-in e una tassonomia profonda di eventi 3 (+?), Per gestire la preparazione delle richieste, l'analisi delle risposte e il concatenamento delle chiamate dipendenti. Notevoli la costruzione di parametri, la richiesta di firma, il rilevamento della regione. FYI è un dolore magico da modificare. Vedi facile cambiamento .
Mc

89

Proverò a spiegarlo nel modo più semplice possibile. Quindi non esiste alcuna garanzia sull'accuratezza dei termini effettivi.

La sessione è dove avviare la connettività ai servizi AWS. Ad esempio, la seguente è una sessione predefinita che utilizza il profilo delle credenziali predefinito (ad esempio ~ / .aws / credentials o assume l'EC2 utilizzando il profilo dell'istanza IAM)

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

Poiché la sessione predefinita è limitata al profilo o al profilo dell'istanza utilizzato, a volte è necessario utilizzare la sessione personalizzata per sovrascrivere la configurazione della sessione predefinita (ad esempio region_name, endpoint_url, ecc.) Ad es.

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

Risorsa : questa è la classe di servizio di alto livello che si consiglia di utilizzare. Ciò ti consente di collegare determinate risorse AWS e di trasmetterle, quindi devi semplicemente usare questa astrazione piuttosto che preoccuparti di quali servizi di destinazione sono indicati. Come noterai dalla parte della sessione, se hai una sessione personalizzata, devi semplicemente passare questo oggetto astratto piuttosto che preoccuparti di passare tutte le regioni personalizzate, ecc. Di seguito è riportato un esempio complicato, ad es

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)

Il client è un oggetto di classe di basso livello. Per ogni chiamata del cliente, è necessario specificare esplicitamente le risorse di targeting, il nome di destinazione del servizio designato deve essere lungo. Perderai l'abilità di astrazione.

Ad esempio, se hai a che fare solo con la sessione predefinita, sembra simile a 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') 

Tuttavia, se si desidera elencare oggetti da un bucket in diverse aree, è necessario specificare il parametro bucket esplicito richiesto per il client.

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

minore. "oggetto" non è una parola chiave?
Swagatika,

Dovremmo evitare di usare sia "risorsa" che "client" in parallelo una funzione o un modulo?
John Overiron,

1
@JohnOveriron Non tutti i servizi AWS hanno una controparte "risorsa", quindi è ancora necessario il "client" di basso livello. Se si intende utilizzare per le distribuzioni, si consiglia di utilizzare la cloudformation (è difficile da apprendere ma vi farà risparmiare tempo nel lungo periodo) rispetto all'utilizzo dell'API per automatizzare le distribuzioni.
mootmoot,

@mootmoot Ma queste API possono eseguire facilmente query / manipolazione di servizi / risorse aws anziché recuperare output o aggiornare lo stack tramite il cloudformation. Ho ragione?
SK Venkat,

@SKVenkat Se inizi a creare la distribuzione multi-server, utilizzando l'integrazione continua, ecc., La formazione di cloud / terraform / heat è molto più facile da mantenere rispetto all'utilizzo del codice boto3.
mootmoot,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.