Exécuter une fonction Lambda avec un événement JSON

AWSBeginner
Pratiquer maintenant

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.

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.

Le déploiement stocke votre paquet de code ; une invocation fournit un événement et exécute son gestionnaire.

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

Exemple officiel de la console Lambda avec un fichier Python et des commandes de déploiement.

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.

La révision déployée renvoie 850 centimes tandis que les totaux calculés antérieurs et les journaux de référence restent inchangés.

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.