Utiliser l'API Resource plutôt que l'API client dans AWS SDK for Python (Boto3)

introduction

Cet article s'intitule AWS Beginner Advent Calendar 2019 Ceci est l'article du 14ème jour de. Je vous serais reconnaissant si vous pouviez signaler des erreurs.

emballer

Dans Boto3, certains services ont une API de ressources (appelée par boto3.reosurce ('service name')). L'API de ressource est plus abstraite que l'API client et peut être implémentée sans écrire d'informations inutiles, donc si vous pouvez faire de même avec chaque API, il est préférable de donner la priorité à l'API de ressource.

Structure générale de l'article

Tout d'abord, reconfirmons ce qu'étaient Boto3, l'API client et l'API de ressources. Après cela, si vous utilisez les deux API, reprenez les modèles d'utilisation de SQS, S3 et DynamoDB un par un et comparez-les pour voir en quoi ils diffèrent. Enfin, j'écris une liste et des impressions des services pour lesquels l'API de ressources est actuellement fournie.

Qu'est-ce que Boto3

Le kit SDK AWS fourni avec Python est utilisé pour se connecter à partir du code à divers services AWS (EC2, DynamoDB, S3, etc.). Les références API peuvent être trouvées dans les ressources suivantes: Boto 3 Documentation

Les API incluent principalement des API client, qui sont des API de bas niveau, et des API de ressources, qui sont des API de haut niveau. Plus précisément, il est appelé avec la description suivante.

# Client API
boto3.client('sqs')

# Resource API
boto3.resource('sqs')

Ensuite, vérifions les caractéristiques de chaque API.

API client (API de bas niveau)

Cette méthode a une correspondance biunivoque avec l'API HTTP fournie par le service AWS. API HTTP Il est entièrement mappé, vous pouvez donc faire tout ce que l'API peut faire. Cependant, puisqu'il s'agit d'un paramètre à usage général, il est nécessaire de définir les paramètres de l'API directement sur la méthode. Voici un exemple d'exécution de SQS send_message. QueueUrl etc. utilisés dans l'API sont spécifiés.

import boto3

#Version de l'API du client SQS
sqs = boto3.client('sqs')

response = sqs.send_message(QueueUrl='https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue', MessageBody='...')

Source de référence: document de l'API client Boto3 (send_message) https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sqs.html#SQS.Client.send_message

API de ressources (API de haut niveau)

Il s'agit d'une API d'abstraction de haut niveau par rapport à l'API client. Il est plus facile pour les développeurs de gérer en insérant une classe abstraite entre les deux au lieu de mapper directement avec l'API. Ici, à titre d'exemple, send_message est exécuté avec l'API de ressources de la même manière que l'API client.

queueName='target-queue-name'

#Version de l'API de ressource SQS
sqs = boto3.resource('sqs')

response = sqs.get_queue_by_name
                QueueName = queueName
            ).send_message(
                MessageBody = '...'
            )

Source de référence: "J'ai essayé d'utiliser" Service Resource "dans Boto3 (Python) (Lambda)" https://cloudpack.media/16114

Par rapport à l'API client, vous pouvez écrire un message en interrogeant le nom de la file d'attente sans écrire l'URL SQS dans le code. Les développeurs doivent uniquement écrire le nom de la file d'attente car ils n'ont pas à connaître l'URL de la file d'attente à chaque fois.

Comparaison de l'API client et de l'API de ressources (S3)

Ensuite, comparez l'API du client S3 et l'API de ressources. À titre d'exemple, écrivez le code pour obtenir le nom de fichier du compartiment.

#Constante commune(Préfixes de compartiment et de fichier dans S3)
BUCKET_NAME= "xxx-bucket"
S3_PREFIX = "image-file-done/"
#Version de l'API du client S3
s3_client = boto3.client('s3')
#Type de retour:<class 'dict'>
s3_objects = s3_client.list_objects_v2(Bucket=BUCKET_NAME, Prefix=S3_PREFIX)

for filename in s3_objects['Contents']:
    print('client:'+filename['Key'])

#Version de l'API de ressource S3
s3_resource = boto3.resource('s3')
#Type de retour:<class 'boto3.resources.collection.s3.Bucket.objectsCollection'>
s3_objects = s3_resource.Bucket(BUCKET_NAME).objects.filter(Prefix=S3_PREFIX)

for filename in s3_objects:
    print('resource:'+filename.key)

C'est presque le même jusqu'à l'appel, mais le type après l'appel est différent. Lorsqu'il est appelé par l'API client, il est renvoyé sous forme de dictionnaire, il est donc nécessaire de récupérer des données conscientes du format de type de dictionnaire renvoyé chaque fois qu'il est implémenté. S'il s'agit d'une API de ressources, c'est un objet pour boto3, donc même si vous utilisez l'API de ressources avec d'autres services, vous pouvez écrire du code avec une description similaire.

Comparaison de l'API client et de l'API de ressources (DynamoDB)

Enfin, comparez l'API client DynamoDB et l'API de ressources. En particulier, je ne comprends pas bien le document Boto3, et il semble que je le copie souvent par erreur en référence à d'autres descriptions. (Il s'agit de moi autrefois ...)

#Constante commune(Nom de la table, nom de la clé de hachage, nom de la clé de tri)
TABLE_NAME='XXXXX_IFO'
HASH_KEY_NAME='XXXXX_CODE'
SORT_KEY_NAME='DATE_TIME'
#Version du client DynamoDB
dynamodb_client = boto3.client('dynamodb')
#Type de retour: <class 'dict'>
response = dynamodb_client.get_item(
    TableName=TABLE_NAME,
    Key={
        HASH_KEY_NAME:{
            'S': '54620100'  
        },
        SORT_KEY_NAME:{
            'S': '2019050621'
        }
    }
)
#API de ressources DynamoDB
dynamodb_resource = boto3.resource('dynamodb')
table = dynamodb_resource.Table(TABLE_NAME)
#Type de retour: <class 'dict'>
response = table.get_item(
    Key={
        HASH_KEY_NAME: '54620100',
        SORT_KEY_NAME: '2019050621'
    }
)

Je l'ai écrit avec l'API client après un long moment, mais c'est un peu difficile car j'écris les paramètres dans le même format que CLI. Les types de retour eux-mêmes sont des types de dictionnaire, mais les opérations à l'intérieur de la table peuvent être effectuées à partir de l'objet Table et la description de l'élément Key est considérablement plus facile car vous n'avez pas à écrire les informations de type une par une.

Services pour lesquels l'API de ressources est fournie (à compter du 14 décembre 2019)

L'API de ressources offre un nombre limité de services. Plus précisément, les services suivants sont pris en charge.

Source de référence: "Documentation Boto 3" https://boto3.amazonaws.com/v1/documentation/api/latest/index.html

Lors de l'utilisation des services ci-dessus, il semble nécessaire de considérer d'abord l'API de ressources avant d'utiliser l'API client. Dans CodeExamples de Boto3 (exemple de document), DynamoDB est une ressource, mais comme d'autres EC2 et CloudWatch sont des clients, il semble que vous deviez examiner les services disponibles ainsi que les CodeExamples.

Impressions

Jusqu'à présent, j'utilisais l'API client et l'API de ressources sans y prêter beaucoup d'attention, j'ai donc résumé les résultats de diverses enquêtes en guise de réflexion. Comme vous pouvez le voir dans l'exemple SQS, il n'est pas nécessaire d'écrire des informations inutiles dans la partie de code, donc à l'avenir, je vérifierai d'abord si le service a une API de ressource, et si elle est fournie, réfléchissez à si elle peut être bien utilisée, puis utiliser l'API client. Je veux l'utiliser. Il semble qu'il existe de nombreuses implémentations écrites dans l'API client sur Qiita et sur le net, je voudrais donc augmenter les informations sur l'API de ressources en écrivant moi-même des articles à l'avenir.

Recommended Posts

Utiliser l'API Resource plutôt que l'API client dans AWS SDK for Python (Boto3)
Développement du kit SDK AWS pour Python (Boto3) dans Visual Studio 2017
Utilisez AWS SDK for Python (boto) dans un environnement Proxy
Remarque sur boto3 (AWS SDK for Python)
Utilisez le SDK API kintone pour Python avec Raspberry Pi (stockez facilement des données dans kintone à partir de Raspberry Pi)
Utilisez pathlib dans Maya (Python2.7) en préparation du prochain Python3.7
Utilisez autre chose qu'une chaîne <br> pour la clé <br> dict en Python
Conseils pour accéder à l'API ATND avec Python
Comment utiliser OAuth et API de compte de service avec le client API Google pour python
N'utilisez pas readlines () dans votre instruction Python for!
Définir la réponse de l'API client boto3 dans la classe de données
Appeler Polly à partir du kit SDK AWS pour Python
[BigQuery] Comment utiliser l'API de BigQuery pour Python -Création de table-
[Pour les débutants] Comment utiliser la commande say avec python!
[AWS IoT] Enregistrer des éléments dans AWS IoT à l'aide du SDK AWS IoT Python
Provisionnement de flotte avec AWS IoT SDK for Python v2
Utilisez config.ini avec Python
Utiliser des dates en Python
Utiliser Valgrind avec Python
Utiliser le client LiquidTap Python ③
API Evernote en Python
Utiliser le client LiquidTap Python ②
Utiliser le profileur en Python
API C en Python 3
Utiliser le client LiquidTap Python ①
Exécutez AWS IoT Device SDK for Python sur Raspberry Pi
Obtenez des données de l'API d'analyse avec le client API Google pour python
Hit API de Mastodon en Python
Voyons comment utiliser def en python
Utiliser l'API Trello avec python
Utiliser l'expression let en Python
[Python] Scraping dans AWS Lambda
AWS CDK-Lambda + API Gateway (Python)
Utiliser l'API Twitter avec Python
Utiliser le magasin de paramètres en Python
Utilisez l'ODM de MongoDB avec Python
Utiliser un dict clé de liste en Python
Techniques de tri en Python
Utiliser Random Forest avec Python
Utilisez Spyder de Python IDE
API Blender Python dans Houdini (Python 3)
Utiliser l'API subsonique avec python3
Client IRC simple avec python
À propos de "for _ in range ():" de python
Utilisez l'API e-Stat de Python
Envelopper (partie de) la bibliothèque AtCoder en Cython pour une utilisation en Python
Bonnes pratiques pour la journalisation au format JSON sur AWS Lambda / Python
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Installer Networkx dans l'environnement Python 3.7 pour une utilisation dans les livres de science des données sur les logiciels malveillants
Une note à ceux qui utilisent Python dans Visual Studio (moi)