354 votes

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-3 . Mon doute est de savoir quand utiliser une ressource, un client ou une session et leurs fonctionnalités respectives.

454voto

jarmod Points 1582

Pour ajouter à l'autre réponse, plus précisément lors de la comparaison de Client et des Ressources.

Client:

  • faible niveau d'accès au service
  • générée à partir de service description
  • expose botocore client pour le développeur
  • généralement, les cartes de 1:1 avec de l'API du service
  • serpent-tubé noms de méthode (par exemple, ListBuckets API => list_buckets méthode)

Voici un exemple de client au niveau de l'accès à un compartiment S3, les objets (au plus 1000**):

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 devez utiliser un paginator, ou mettre en place votre propre boucle, appelant list_objects() à plusieurs reprises avec une poursuite de marqueur s'il n'y avait plus de 1000.

Ressources:

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

Voici l'équivalent exemple d'utilisation de la ressource au niveau de l'accès à un compartiment S3, les objets de (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, vous n'avez pas à faire un deuxième appel d'API pour obtenir les objets; ils sont disponibles pour vous que d'une collection sur le seau. Ces collections de sous-ressources sont paresseusement-chargé.

Session:

  • stocke les informations de configuration (principalement des informations d'identification et de la région sélectionnée)
  • vous permet de créer des clients de services et de ressources

Une ressource utile pour en apprendre davantage au sujet de ces boto3 concepts est l' introduction re:Inventer vidéo.

134voto

mootmoot Points 1485

Je vais essayer de l'expliquer le plus simple possible. Donc, il n'y a pas de garantie de l'exactitude des termes.

Session est l'endroit où lancer la connectivité aux services AWS. E. g. la suite est par défaut de la session qui utilisent les informations d'identification par défaut du profil(par exemple ~/.aws/informations d'identification, ou d'assumer votre EC2 avec IAM exemple de profil )

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

En raison de session par défaut est de limiter au profil de l'instance ou de profil utilisé, il est parfois nécessaire d'utiliser la session personnalisé pour remplacer la valeur par défaut configuration de session (par exemple, region_name, 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')

Ressources : C'est le haut niveau de la classe de service recommandé pour être utilisé. Cette option vous permet de lié notamment les ressources AWS et de le passer, alors il suffit d'utiliser cette abstraction qu'à vous inquiéter, qui cible des services est pointé. Comme vous l'avis de la session, si vous avez une séance personnalisée, vous venez de passer cet objet abstrait que de s'inquiéter de toute la région personnalisée,etc pour passer le long. Voici un exemple compliquer E. g.

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 faible niveau de la classe de l'objet. Pour chaque appel du client, vous devez explicitement spécifier le ciblage des ressources, le service désigné nom de la cible doit être de passer de long. Vous aurez perdu la capacité d'abstraction.

Par exemple, si vous ne traitez qu'avec de session par défaut, cela ressemble à boto3.de la ressource.

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 voulez la liste des objets à partir d'un seau en région différente, vous devez spécifier explicite seau paramètre 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') 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X