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.
Voici quelques informations plus détaillées sur ce que Client , Ressource , et Session .
Client:
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:
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:
Une ressource utile pour en savoir plus sur ces concepts de boto3 est le introduction: re: Invent video .
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')