Introduction
Une équipe de paiement a besoin d'une fonction calculant le total d'une commande. Vous allez déployer un court gestionnaire Python, envoyer deux entrées JSON et modifier le calcul avec des frais de traitement. Utilisez des centimes entiers pour simplifier l'arithmétique, puis supprimez votre fonction et ses journaux.
Terminez d'abord Premiers pas avec AWS sur LabEx, Utilisez des identifiants temporaires avec un rôle IAM et Trouver une requête échouée dans CloudWatch Logs. Ce nouvel environnement fournit la CLI, l'espace de travail et le rôle d'exécution.
Lien avec les certifications
Ce laboratoire propose une pratique des sujets d’examen suivants.
- Cloud Practitioner (CLF-C02) · Tâche 3.3: Déploiement Lambda, événements JSON et réponses calculées.
- Solutions Architect – Associate (SAA-C03) · Tâche 2.1: Déploiement Lambda, événements JSON et réponses calculées.
- Developer – Associate (DVA-C02) · Tâche 1.2: Déploiement Lambda, événements JSON et réponses calculées.
Déployer un calcul de commande
Dans cette étape, vous allez remplacer un gestionnaire inachevé et déployer une fonction. AWS Lambda exécute votre code lorsque vous invoquez une fonction. Un événement est l'entrée fournie pour cette invocation ; un gestionnaire est la fonction Python que Lambda appelle avec cette entrée. Le paramètre app.handler désigne la fonction nommée handler dans app.py.
Accédez à l'espace de travail préparé et inspectez le squelette. Il renvoie actuellement un objet vide et ne peut donc pas calculer une commande.
cd /home/labex/project
cat app.py
Python utilise l'indentation pour regrouper les instructions dans une fonction. event["quantity"] lit une valeur dans l'objet JSON entrant. * multiplie la quantité par le prix unitaire ; return envoie l'objet calculé à l'appelant. context fournit des informations d'invocation, même si ce calcul n'en a pas encore besoin.
Remplacez le squelette par ce gestionnaire complet. cat > app.py écrit dans le fichier les lignes entre <<'PY' et le PY final. La ligne de fermeture doit être seule.
cat > app.py <<'PY'
import json
def handler(event, context):
order_id = event["order_id"]
quantity = event["quantity"]
unit_price = event["unit_price_cents"]
total = quantity * unit_price
print("EVENT " + json.dumps(event))
return {"order_id": order_id, "total_cents": total}
PY
L'instruction print écrit l'entrée dans les journaux d'exécution ; elle ne renvoie pas la réponse. Gardez les secrets des clients hors des journaux. Ces événements ne contiennent que des identifiants et nombres synthétiques.
Créez un paquet Zip, l'archive déployée par Lambda. Placez app.py à sa racine pour que le gestionnaire puisse être trouvé. Le rôle d'exécution est l'identité utilisée par Lambda pendant l'exécution de votre code. Ce rôle préparé permet la journalisation ; vous configurerez l'accès aux données dans un laboratoire ultérieur. Lisez son ARN dans une variable du shell. Un ARN identifie une ressource précise ; la variable évite de le copier à la main.
zip -q function.zip app.py
ROLE_ARN=$(aws iam get-role --role-name labex-fn01-execution --query 'Role.Arn' --output text)
Déployez avec l'environnement d'exécution Python 3.12 et un délai maximal de cinq secondes. fileb:// lit l'archive sous forme d'octets. L'environnement d'exécution choisit l'environnement du langage ; le délai maximal borne une invocation.
aws lambda create-function --function-name labex-fn01-quote --runtime python3.12 --handler app.handler --role "$ROLE_ARN" --zip-file fileb://function.zip --timeout 5 --query '{Name:FunctionName,Runtime:Runtime,Handler:Handler,Timeout:Timeout,CodeSize:CodeSize}'
Attendez-vous à obtenir Name labex-fn01-quote, Runtime python3.12, Handler app.handler, Timeout 5 et un CodeSize positif. Créer la fonction déploie le code ; cela n'invoque pas le gestionnaire.
AWS View affiche la fonction, le gestionnaire et l'empreinte du code. Les journaux d'invocation sont encore vides. Le groupe de journaux de référence contient des données de plateforme sans rapport avec l'exercice et doit rester inchangé.
Invoquer deux événements JSON
Dans cette étape, vous allez appeler la fonction déployée avec deux commandes différentes et interpréter ses réponses. JSON représente un objet avec des champs nommés. Les nombres n'ont pas de guillemets ; les chaînes en ont. Chaque invocation reçoit son propre événement.

Écrivez le premier événement : deux articles à 375 centimes chacun.
cat > small.json <<'JSON'
{"order_id":"fn01-small","quantity":2,"unit_price_cents":375}
JSON
Invoquez la fonction et enregistrez sa réponse. --cli-binary-format raw-in-base64-out permet à la CLI d'accepter du JSON ordinaire comme charge utile. file:// lit le texte de l'événement ; le nom de fichier final reçoit la charge utile renvoyée.
aws lambda invoke --function-name labex-fn01-quote --cli-binary-format raw-in-base64-out --payload file://small.json small-response.json
cat small-response.json
La commande indique StatusCode 200. Le fichier de réponse doit contenir {"order_id":"fn01-small","total_cents":750}. Le statut de la requête au service et les données renvoyées par le gestionnaire constituent des preuves différentes ; inspectez aussi la charge utile.
Envoyez une deuxième commande sans redéployer le code. Cinq articles à 120 centimes doivent produire un total différent.
cat > large.json <<'JSON'
{"order_id":"fn01-large","quantity":5,"unit_price_cents":120}
JSON
aws lambda invoke --function-name labex-fn01-quote --cli-binary-format raw-in-base64-out --payload file://large.json large-response.json
cat large-response.json
Attendez-vous à obtenir {"order_id":"fn01-large","total_cents":600}. Les valeurs d'entrée déterminent le calcul de la même fonction.
Dans AWS View, comparez les identifiants de commande, quantités, prix et totaux. La configuration de la fonction reste identique tandis que les enregistrements d'invocation changent. Ouvrez Show logs pour l'une des commandes afin de voir son entrée et le résultat renvoyé.
Mettre à jour le code et tracer son résultat
Dans cette étape, vous allez ajouter 100 centimes de frais de traitement et confirmer qu'une nouvelle invocation exécute le calcul modifié. Modifier le fichier local app.py ne change pas le code déployé ; mettez à jour le paquet et envoyez-le à Lambda.
Remplacez le gestionnaire par cette révision. Seul le calcul change : + 100 ajoute les frais après la multiplication.
cat > app.py <<'PY'
import json
def handler(event, context):
order_id = event["order_id"]
quantity = event["quantity"]
unit_price = event["unit_price_cents"]
total = quantity * unit_price + 100
print("EVENT " + json.dumps(event))
return {"order_id": order_id, "total_cents": total}
PY
zip -q function.zip app.py
aws lambda update-function-code --function-name labex-fn01-quote --zip-file fileb://function.zip --query '{Name:FunctionName,CodeSHA:CodeSha256}'
Le déploiement renvoie le nom et une empreinte SHA du code. AWS View affiche l'empreinte modifiée ; les résultats d'invocations antérieures restent dans les journaux.
Pour comparer avec la console, l'exemple officiel affiche le fichier Python à côté des commandes Deploy et Test. Ses noms lambda_function.py et lambda_handler correspondent à app.py et handler dans ce laboratoire ; poursuivez ici avec le processus dans Terminal.

Source : Guide AWS Lambda.
Utilisez les quantités de la première commande avec un nouvel identifiant de corrélation.
cat > revised.json <<'JSON'
{"order_id":"fn01-revised","quantity":2,"unit_price_cents":375}
JSON
aws lambda invoke --function-name labex-fn01-quote --cli-binary-format raw-in-base64-out --payload file://revised.json revised-response.json
cat revised-response.json
Attendez-vous à obtenir {"order_id":"fn01-revised","total_cents":850} : 750 centimes pour les articles plus 100 centimes de frais. La première réponse reste 750 ; une mise à jour du code ne réécrit pas l'historique.
Les journaux d'exécution sont stockés dans /aws/lambda/<function-name>. Récupérez les messages contenant cet identifiant de commande pour relier son événement à la réponse calculée.
aws logs filter-log-events --log-group-name /aws/lambda/labex-fn01-quote --filter-pattern '"fn01-revised"' --query 'events[].message'
Attendez-vous à obtenir l'entrée EVENT et l'objet renvoyé avec un total de 850. Les flux complets contiennent aussi le début et la fin d'invocation ainsi que les rapports d'exécution, distincts de la réponse de commande.
Retournez dans AWS View. Comparez les trois enregistrements réels, ouvrez Show logs pour fn01-revised et associez son entrée au résultat de 850 centimes. La référence reste inchangée.

Supprimer la fonction et conserver les journaux de référence
Dans cette étape, vous allez supprimer uniquement la fonction et son groupe de journaux d'exécution, puis confirmer que la référence sans rapport subsiste. La fonction et le groupe de journaux sont des ressources distinctes ; supprimer uniquement la fonction ne retire pas les journaux stockés.
Supprimez la fonction exacte, puis lisez un inventaire réussi.
aws lambda delete-function --function-name labex-fn01-quote
aws lambda list-functions --query 'Functions[].FunctionName'
Attendez-vous à obtenir une liste vide. Une erreur d'authentification ou de connexion ne prouverait pas la suppression.
Retirez les journaux d'exécution de l'exercice et listez les groupes restants.
aws logs delete-log-group --log-group-name /aws/lambda/labex-fn01-quote
aws logs describe-log-groups --query 'logGroups[].logGroupName'
Seul /labex/labex-fn01-reference doit rester. Lisez son message pour prouver que le nettoyage a conservé les données sans rapport.
aws logs get-log-events --log-group-name /labex/labex-fn01-reference --log-stream-name platform --query 'events[].message'
Attendez-vous à obtenir INFO platform reference keep unchanged. AWS View n'affiche plus de fonction déployée ni de journaux d'invocation, tandis que la référence subsiste. Le rôle et l'identité préparés sont des éléments de l'environnement ; la révocation des identifiants et l'arrêt suivent les contrôles de ressources.
Résumé
Vous avez écrit un gestionnaire Python, déployé un paquet Zip et calculé des totaux à partir de deux événements JSON. Vous avez modifié le calcul déployé, relié son nouveau résultat aux journaux d'exécution et supprimé uniquement la fonction et son groupe de journaux en conservant les données de référence.



