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.
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.
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.
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.
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
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.
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.
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.
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.
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