[PYTHON] Manipuler des objets S3 avec Boto3 (API de haut niveau et API de bas niveau)

J'ai essayé de savoir comment utiliser Boto3, qui est le SDK AWS pour Python, en consultant à nouveau la Documentation.

Environnement d'exploitation

Selon la page PyPI, il fonctionne avec 2.6 ou supérieur pour 2 séries et 3.3 ou supérieur pour 3 séries.

Ce qui suit est

Nous avons confirmé l'opération dans l'environnement de.

Configuration de Boto3

La section "Principales fonctionnalités" de la page Quoi de neuf présente les cinq fonctionnalités suivantes: ..

Je n'ai pas compris cette configuration et jusqu'à présent, j'ai confondu ** Resources ** avec ** Clients **.

Notez que l'API de haut niveau n'est pas disponible pour tous les services AWS, et jusqu'à présent, il semble que seuls certains services tels que EC2 et S3 la prennent en charge.

Installation et préparation

Facile à installer avec pip.

$ pip install boto3

Étant donné que les clés d'accès IAM sont requises pour les opérations AWS, créez-les à l'avance à partir de la console de gestion et définissez les autorisations appropriées pour les utilisateurs.

Du côté du terminal, définissez les informations de clé d'accès sur ~ / .aws / credentials. Si vous utilisez awscli, ce fichier a déjà été généré lorsque vous avez fait ʻaws configure`, mais sinon, configurez awscli ou définissez la clé d'accès directement dans le fichier des informations d'identification.

~/.aws/credentials


[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY

Accéder au compartiment S3 avec une API de haut niveau

Vous pouvez accéder au bucket via l'objet S3.Bucket.

import boto3

#Nom du godet
AWS_S3_BUCKET_NAME = 'hogehoge'

s3 = boto3.resource('s3')
bucket = s3.Bucket(AWS_S3_BUCKET_NAME)

print(bucket.name)
# => hogehoge

Vous pouvez accéder aux informations sur les objets S3 stockés dans le compartiment via l'attribut ʻobjects`.

Cet attribut est une instance de la classe Bucket.objectsCollectionManager, et les méthodes de ʻall (), delete (), filter (), limit ()etpage_size ()sont disponibles. Ces méthodes retournent une instance de la classes3.Bucket.objectsCollection, et vous pouvez parcourir cet objet pour obtenir une instance de la classe ʻObjectSummary.

print(bucket.objects.all())
# => s3.Bucket.objectsCollection(s3.Bucket(name='hogehoge'), s3.ObjectSummary)

print([obj_summary.key for obj_summary in bucket.objects.all()])
# => ['hayabusa.txt']

L'opération utilisant «objets» est efficace lorsque l'objet cible n'est pas spécifié, par exemple lors de la recherche d'un objet stocké dans un compartiment.

Obtenez des objets à partir de compartiments S3 avec une API de haut niveau

Si vous souhaitez obtenir un objet S3 dont la clé est connue, utilisez la classe S3.Object.

GET_OBJECT_KEY_NAME = 'hayabusa.txt'

obj = bucket.Object(GET_OBJECT_KEY_NAME)

print(obj.key)
# => hayabusa.txt

Les objets ʻObject` peuvent également être créés en spécifiant le nom du bucket et le nom de la clé sans passer par l'objet Bucket.

obj = s3.Object(AWS_S3_BUCKET_NAME, GET_OBJECT_KEY_NAME)

print(obj.key)
# => hayabusa.txt

Pour obtenir le contenu d'un objet S3, utilisez la méthode get () de l'objet.

La valeur de retour de la méthode get () est un dictionnaire, et vous pouvez faire référence au contenu de l'objet via Body dans ce dictionnaire.

Ce Body est une instance de la classe botocore.response.StreamingBody et est un flux qui gère les données de type octet. Par conséquent, pour le traiter comme une chaîne de caractères, il est nécessaire de le lire à partir du flux et de le convertir en un type de chaîne de caractères.

response = obj.get()
body = response['Body'].read()

print(type(body))
# => <class 'bytes'>

print(body.decode('utf-8'))
# =>10 allers-retours de Tokyo à Shin Hakodate Hokuto
#Sendai-Shin Hakodate Hokuto 1 aller-retour

Notez qu'une fois que le flux est read (), il sera recherché à la fin du flux, donc les résultats ne peuvent pas être obtenus avec le deuxième appel et les suivants.

Ajouter des objets aux compartiments S3 avec une API de haut niveau

Comme pour la récupération, vous pouvez utiliser l'objet ʻObject` pour ajouter de nouveaux objets S3 à votre compartiment et mettre à jour leur contenu.

Pour définir le contenu de l'objet S3, transmettez le contenu que vous souhaitez enregistrer sous forme de chaîne d'octets dans l'argument Body de la méthode put (). Vous pouvez également spécifier des options détaillées telles que ʻACLetContentType` avec des arguments.

PUT_OBJECT_KEY_NAME = 'hayate.txt'

obj = bucket.Object(PUT_OBJECT_KEY_NAME)

body = """Morioka-Shin Hakodate Hokuto 1 aller-retour
Shin Aomori-Shin Hakodate Hokuto 1 aller-retour
"""

response = obj.put(
    Body=body.encode('utf-8'),
    ContentEncoding='utf-8',
    ContentType='text/plane'
)

Fonctionnement à l'aide de l'API de bas niveau

En utilisant l'objet S3.Client, il est possible d'opérer en utilisant une API de bas niveau.

Par exemple, l'obtention d'un objet S3 peut également être écrite à l'aide d'une API de bas niveau comme suit:

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

response = client.get_object(Bucket=AWS_S3_BUCKET_NAME, Key=GET_OBJECT_KEY_NAME)
body = response['Body'].read()

print(body.decode('utf-8'))
# =>10 allers-retours de Tokyo à Shin Hakodate Hokuto
#Sendai-Shin Hakodate Hokuto 1 aller-retour

Résumé

Jusqu'à présent, les API de bas niveau (clients) et les API de haut niveau (ressources) étaient confondues.

Certaines fonctionnalités ne sont fournies que par l'API de bas niveau, mais vous pouvez écrire des programmes orientés objet, donc si vous avez une API de haut niveau, vous devriez l'utiliser.

Recommended Posts

Manipuler des objets S3 avec Boto3 (API de haut niveau et API de bas niveau)
Manipulez des objets à l'aide de l'API Python de bas niveau de Blender 2.8
[AWS] Associez Lambda et S3 à boto3
Téléchargeur S3 avec boto
Opération S3 avec python boto3
Je voulais supprimer plusieurs objets en s3 avec boto3
Détecter les objets vidéo avec l'API Video Intelligence
Utilisez boto3 pour accéder à S3
Générer une URL signée S3 avec boto
[Automation] Manipulez la souris et le clavier avec Python
Jupyter avec PYNQ et synthèse de haut niveau avec Polyphony
Essayez le chiffrement côté serveur de S3 à l'aide de boto3
Chiffrement côté serveur S3 SSE avec Python boto3
API Boto3 (manipuler les ressources AWS avec la bibliothèque Python) qui est souvent utilisée en privé
Afficher les images sur S3 avec API Gateway + Lambda
Afficher l'API Google Maps avec Rails et affichage des broches
[Python] Résumé des opérations sur les fichiers S3 avec boto3
Décrivez ec2 avec boto3 et récupérez la valeur
Obtenez l'objet et le corps de Gmail avec Python et l'API Gmail