Une photo envoyée, c’est une requête web
Une boutique en ligne laisse ses clients envoyer la photo d’un article abîmé. La photo est rangée dans un bucket S3, un espace de stockage de fichiers dans le cloud. Votre code ne se connecte pas à une machine pour l’enregistrer. Il envoie une requête par le web et lit la réponse.
Cette leçon explique ce qu’est un service cloud, où il tourne et qui s’occupe de quoi.
À la fin de cette leçon
Remarque
Je peux dire ce que sont une région, un service et un appel d’API.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Service | un outil prêt à l’emploi que l’on utilise par le web | |
| Appel d’API | une requête envoyée à un service, et sa réponse | |
| Région | la zone du monde où tourne un service | eu-west-3 |
| Bucket | un conteneur nommé pour des fichiers dans S3 | |
| Responsabilité partagée | le fournisseur et le client s’occupent chacun d’une partie du système |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Ce que ce module n’est pas
Remarque
Vous n’avez pas besoin d’un compte AWS et rien n’est déployé. Vous ne taperez jamais de vraie clé, de mot de passe ni de numéro de compte. Ce n’est pas un cours sur les coûts ni sur la facture. Vous lisez, hors ligne, des réponses de la forme des vraies et vous écrivez du Python pour les traiter.
Un service est une API que l’on appelle
Un fournisseur de cloud fait tourner de grosses machines et loue ce qu’elles savent faire. Chaque outil loué est un service. S3 range des fichiers. SQS garde des messages dans une file. DynamoDB range des éléments dans des tables.
On utilise un service par un appel d’API : une requête qui nomme l’appel, comme list_objects_v2, et donne les détails utiles. La réponse revient sous forme de données.
Un appel et sa réponse
appel = {"service": "s3", "operation": "list_objects_v2", "Bucket": "boutique-photos"}
reponse = {
"Name": "boutique-photos",
"KeyCount": 2,
"IsTruncated": False,
"Contents": [
{"Key": "defauts/bouilloire.png", "Size": 2048, "StorageClass": "STANDARD"},
{"Key": "defauts/grille-pain.png", "Size": 3072, "StorageClass": "STANDARD"},
],
}
print("service :", appel["service"])
print("appel :", appel["operation"])
print("clés :", reponse["KeyCount"])
for objet in reponse["Contents"]:
print(objet["Key"], objet["Size"])
# Mettez 5000 comme Size du grille-pain, puis relancez.
Un appel qui échoue répond quand même
Tous les appels ne marchent pas. Une clé peut manquer, un bucket peut ne pas exister. Le service répond alors par une erreur : un Code qui nomme le problème et un statut HTTP.
Votre code doit chercher l’erreur d’abord. Un test comme "Contents" in reponse ne vaut que si l’appel a marché.
Distinguer une bonne réponse d’une erreur
bonne = {"KeyCount": 1, "Contents": [{"Key": "lisezmoi.txt", "Size": 5}]}
mauvaise = {"error": {"Code": "NoSuchBucket", "HTTPStatusCode": 404}}
for reponse in [bonne, mauvaise]:
if "error" in reponse:
print("échec :", reponse["error"]["Code"], reponse["error"]["HTTPStatusCode"])
else:
print("réussi, clés :", reponse["KeyCount"])
# Remplacez "NoSuchBucket" par "NoSuchKey", puis relancez.
Erreur fréquente
Attention
Beaucoup pensent qu’une réponse vide est une erreur. Ce n’est pas vrai. Demander à DynamoDB un élément absent donne {} avec un bon statut. Cherchez une entrée error, avec son Code. Une réponse vide veut dire « rien trouvé ».
Une région est l’endroit où tourne un service
Un fournisseur a des centres de données dans de nombreux endroits. Une région est l’une de ces zones, comme eu-west-3, qui est Paris. Vous choisissez la région en créant un bucket, et les fichiers y restent.
Choisissez une région proche de vos utilisateurs, pour que les réponses arrivent vite. Les réponses indiquent aussi la région du bucket.
Lire la région de chaque bucket
reponse = {
"Buckets": [
{"Name": "boutique-photos", "BucketRegion": "eu-west-3", "BucketArn": "arn:aws:s3:::boutique-photos"},
{"Name": "boutique-sauvegardes", "BucketRegion": "us-east-1", "BucketArn": "arn:aws:s3:::boutique-sauvegardes"},
],
"Owner": {"DisplayName": "boutique", "ID": "identifiant-proprietaire"},
}
for bucket in reponse["Buckets"]:
print(bucket["Name"], "est dans", bucket["BucketRegion"])
# Affichez seulement les buckets de eu-west-3 : ajoutez un if dans la boucle.
Le fournisseur et vous, chacun sa part
Le fournisseur s’occupe des bâtiments, des machines et du logiciel du service. Vous vous occupez de ce que vous y mettez et de qui peut s’en servir.
C’est la responsabilité partagée. Si vous laissez tout le monde lire un bucket, c’était votre choix. Si un centre de données perd le courant, c’est au fournisseur de réagir.
Qui s’occupe de quoi
| Élément | Pris en charge par |
|---|---|
| Le bâtiment et le courant | Le fournisseur |
| Le logiciel S3 lui-même | Le fournisseur |
| Les fichiers que vous envoyez | Vous |
| Qui peut lire un bucket | Vous |
| Le code qui appelle le service | Vous |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.