web-dev-qa-db-fra.com

Différence dans boto3 entre ressource, client et session?

J'utilise Python 2.7.12 dans Ubuntu 16.04 LTS. J'apprends à utiliser boto3 à partir du lien suivant: https://boto3.readthedocs.io/en/latest/guide/quickstart.html#using-boto- . Mon doute est de savoir quand utiliser une ressource, un client ou une session et leurs fonctionnalités respectives.

150
shiva

Voici quelques informations plus détaillées sur ce que Client , Ressource , et Session .

Client:

  • accès de service de bas niveau
  • généré à partir de service description
  • expose le client botocore au développeur
  • mappe généralement 1: 1 avec l'API de service
  • toutes les opérations de service sont prises en charge par les clients
  • noms de méthode snake-cased (par exemple, ListBuckets API => méthode list_buckets)

Voici un exemple d'accès au niveau client aux objets d'un compartiment S3 (au plus 1 000 **):

import boto3

client = boto3.client('s3')
response = client.list_objects(Bucket='mybucket')
for content in response['Contents']:
    obj_dict = client.get_object(Bucket='mybucket', Key=content['Key'])
    print(content['Key'], obj_dict['LastModified'])

** vous devrez utiliser un paginator , ou implémenter votre propre boucle, en appelant list_objects () à plusieurs reprises avec un marqueur de continuation s'il y en a plus de 1000.

Ressource:

  • aPI de niveau supérieur, orientée objet
  • généré à partir de description de la ressource
  • utilise des identifiants et des attributs
  • a des actions (opérations sur les ressources)
  • expose les sous-ressources et les collections
  • ne fournit pas une couverture 100% API

Voici l'exemple équivalent utilisant l'accès au niveau des ressources aux objets d'un compartiment S3 (tous):

import boto3

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

Notez que dans ce cas, il n'est pas nécessaire de faire un deuxième appel d'API pour obtenir les objets; ils sont à votre disposition en tant que collection sur le seau. Ces collections de sous-ressources sont chargées paresseusement.

Vous pouvez voir que la version Resource du code est beaucoup plus simple, plus compacte et plus performante (elle effectue la pagination à votre place). La version Client du code serait en réalité plus compliquée que celle présentée ci-dessus si vous souhaitez inclure la pagination.

Session:

  • stocke les informations de configuration (principalement les informations d'identification et la région sélectionnée)
  • vous permet de créer des clients et des ressources de service
  • boto3 crée une session par défaut pour vous en cas de besoin

Une ressource utile pour en savoir plus sur ces concepts de boto3 est le introduction: re: Invent video .

141
jarmod

Je vais essayer de l'expliquer le plus simplement possible. Il n’existe donc aucune garantie quant à l’exactitude des conditions réelles.

Session est l'endroit où initier la connectivité aux services AWS. Par exemple. Ce qui suit est la session par défaut qui utilise le profil des informations d'identification par défaut (par exemple ~ ~.

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

Comme la session par défaut est limitée au profil ou au profil d'instance utilisé, vous devez parfois utiliser la session personnalisée pour remplacer la configuration de session par défaut (par exemple, nom_région, endpoint_url, etc.), par exemple.

# custom resource session must use boto3.Session to do the override
my_west_session = boto3.Session(region_name = 'us-west-2')
my_east_sesison = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource('s3')
video_s3 = my_east_sesison.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: Il s'agit de la classe de service de haut niveau recommandée. Cela vous permet de lier certaines ressources AWS et de les transmettre. Vous utilisez donc cette abstraction sans vous soucier des services ciblés. Comme vous le constatez à partir de la partie session, si vous avez une session personnalisée, il vous suffit de transmettre cet objet abstrait plutôt que de s’inquiéter de toute région personnalisée, etc. Voici un exemple compliqué, par exemple.

import boto3 
my_west_session = boto3.Session(region_name = 'us-west-2')
my_east_sesison = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource("s3")
video_s3 = my_east_sesison.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)

Client est un objet de classe de bas niveau. Pour chaque appel client, vous devez spécifier explicitement les ressources de ciblage. Le nom de la cible du service désigné doit être long. Vous allez perdre la capacité d'abstraction.

Par exemple, si vous ne traitez que la session par défaut, cela ressemble à 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') 

Toutefois, si vous souhaitez répertorier les objets d'un compartiment dans une région différente, vous devez spécifier le paramètre de compartiment explicite requis pour le client.

import boto3 
backup_s3 = my_west_session.client('s3',region_name = 'us-west-2')
video_s3 = my_east_sesison.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') 
72
mootmoot