DevOps Elastic Hayway
Document

SUBSCRIBE TO GET FULL ACCESS TO THE E-BOOKS FOR FREE 🎁SUBSCRIBE NOW

Professional Dropdown with Icon

SUBSCRIBE NOW TO GET FREE ACCESS TO EBOOKS

AWSLesson 31 / 475 min readUpdated September 13, 2026

À la fin de ce tutoriel, vous déploierez une fonction AWS Lambda (Python) exposée via API Gateway HTTP API, testerez un GET public de lab, puis supprimerez stack pour éviter les coûts — en ca-central-1.

Niveau : Intermédiaire · Temps estimé : 60–75 min · Versions testées : Lambda Python 3.12, API Gateway HTTP API 2026, AWS CLI v2 · Dernière vérification : 2026-09-10 · Region : ca-central-1

Slug : aws-lambda-api-gateway · Série : AWS Solutions Architect · Mot-clé SEO : Lambda API Gateway

← Précédent : SSM · → Suivant : CloudFormation · Hub : Démarrer avec AWS

Prérequis

  • Profil lab, droits IAM pour Lambda / API Gateway / IAM roles
  • Outils : zip, AWS CLI v2
  • Budget d’alerte — Free Tier Lambda généreux, mais une API ouverte sans auth ne doit vivre que le temps du lab — minutes, pas des heures
export AWS_PROFILE=lab
export AWS_DEFAULT_REGION=ca-central-1
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)

Ce que nous allons construire

Client ──HTTPS──► API Gateway HTTP API
                      │
                      ▼
                 Lambda lab-hello (Python)
                      │
                      ▼
                 {"message":"ok"}

(Schéma — alt : « HTTP API vers Lambda Python ».)

Client HTTPS vers HTTP API puis Lambda Python et réponse JSON. Logs CloudWatch pour le debug ; IAM least privilege sur le rôle d’exécution. En lab, une URL publique sans JWT suffit pour vérifier le chemin ; en production, ajoutez auth, WAF et throttle avant toute exposition Internet.

Étape 1 — Lambda vs EC2/Fargate (examen)

Lambda EC2 / Fargate
Facturation Par requête + durée Heures / tâche
Scaling Concurrent automatique ASG / desired count
Limites Timeout 15 min, cold start Quasi libre
Cas API, events S3/SQS/SNS Long running, GPU

HTTP API (API Gateway v2) vs REST API (v1) : pour un proxy Lambda simple, HTTP API est plus léger et souvent moins cher — c’est le choix de ce lab.

Étape 2 — Rôle d’exécution

Créez un trust policy JSON (lambda-trust.json) avec Principal lambda.amazonaws.com et Action sts:AssumeRole, puis :

aws iam create-role --role-name lab-lambda-basic 
  --assume-role-policy-document file://lambda-trust.json

aws iam attach-role-policy --role-name lab-lambda-basic 
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

ROLE_ARN=$(aws iam get-role --role-name lab-lambda-basic --query Role.Arn --output text)
sleep 8

AWSLambdaBasicExecutionRole = écriture des logs CloudWatch uniquement.

Étape 3 — Code Python et create-function

Fichier lambda_function.py :

import json

def lambda_handler(event, context):
    return {
        "statusCode": 200,
        "headers": {"content-type": "application/json"},
        "body": json.dumps({
            "message": "hello from lambda",
            "path": event.get("rawPath") or event.get("path"),
        }),
    }

Empaquetez et déployez :

zip -q function.zip lambda_function.py

aws lambda create-function 
  --function-name lab-hello 
  --runtime python3.12 
  --role "$ROLE_ARN" 
  --handler lambda_function.lambda_handler 
  --zip-file fileb://function.zip 
  --timeout 10 
  --memory-size 128

aws lambda invoke --function-name lab-hello --payload '{}' out.json
cat out.json

Si l’invoke CLI échoue avec un rôle « not authorized to perform », attendez encore quelques secondes (propagation IAM) puis réessayez. Vérifiez aussi que le handler pointe bien vers lambda_function.lambda_handler (fichier + nom de fonction).

Étape 4 — HTTP API + permission

API_ID=$(aws apigatewayv2 create-api 
  --name lab-http-api 
  --protocol-type HTTP 
  --target arn:aws:lambda:ca-central-1:${ACCOUNT_ID}:function:lab-hello 
  --query ApiId --output text)

aws lambda add-permission 
  --function-name lab-hello 
  --statement-id apigw-invoke 
  --action lambda:InvokeFunction 
  --principal apigateway.amazonaws.com 
  --source-arn "arn:aws:execute-api:ca-central-1:${ACCOUNT_ID}:${API_ID}/*/*"

ENDPOINT=$(aws apigatewayv2 get-api --api-id "$API_ID" --query ApiEndpoint --output text)
curl -s "$ENDPOINT/"

Vous pouvez aussi créer intégration + route $default + stage explicitement (create-integration, create-route, create-stage) si le mode --target ne convient pas.

Étape 5 — Prod vs lab

Sujet Lab Prod
Auth Ouverte JWT, IAM, Lambda authorizer
Throttle Défaut compte Limites par route / usage plan
Domaine execute-api Custom domain + ACM
VPC Non ENI si accès RDS privé (cold start+)

Memory ↑ = CPU ↑ (réduit souvent la durée facturée). Provisioned concurrency = anti-cold-start payant.

Cold start : première invocation (ou après idle) charge le runtime — latence supplémentaire. Mitigations : memory un peu plus haute, package léger, provisioned concurrency sur les routes UX critiques, ou accepter le cold start pour du batch. En lab 128 MB Python, le cold start reste souvent acceptable.

Étape 6 — Autres triggers

La même fonction peut être branchée sur S3, SQS, SNS, EventBridge, DynamoDB Streams — seul le shape de event change. L’HTTP API n’est qu’un déclencheur parmi d’autres.

Étape 7 — Vérification

aws lambda get-function --function-name lab-hello 
  --query 'Configuration.{Runtime:Runtime,Timeout:Timeout}'
curl -sI "$ENDPOINT/"
aws logs describe-log-groups --log-group-name-prefix /aws/lambda/lab-hello

Checklist : invoke CLI OK · curl JSON · permission apigw-invoke · logs présents · delete planifié.

Nettoyage (obligatoire)

aws apigatewayv2 delete-api --api-id "$API_ID"
aws lambda delete-function --function-name lab-hello
aws iam detach-role-policy --role-name lab-lambda-basic 
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
aws iam delete-role --role-name lab-lambda-basic

Reserved concurrency

Réserver de la concurrence protège le reste du compte d’un spike sur lab-hello, mais peut aussi throttler cette fonction. En lab laissez le défaut ; en prod isolez les fonctions critiques.

Variables d’environnement

Passez STAGE=lab via --environment. Chiffrez les secrets avec KMS (ou mieux : récupérez depuis SSM/Secrets Manager au runtime avec le rôle Lambda).

Erreurs fréquentes

Symptôme Cause Correction
500 depuis l’API Permission invoke absente add-permission + SourceArn
AccessDenied create-function Role pas prêt Attendre propagation IAM
Timeout 3s Défaut trop court --timeout 10
Handler not found Mauvais nom fichier/fonction lambda_function.lambda_handler

Versions, alias et layers

Publiez une version immuable et un alias live pour rollback. Les layers partagent des deps (ex. libs Python) — inutiles pour ce hello world ; respectez la limite de taille unzipped.

IaC ensuite

Préférez SAM, CloudFormation (tuto suivant) ou Terraform plutôt que des CLI jetables en prod.

Observability et sécu

Alarmez Errors / Throttles (CloudWatch). Une API publique sans auth = lab de 15 minutes max, jamais une journée. Prod : auth + WAF + throttle, et jamais de secrets en clair dans le code source du ZIP.

Payload size et quotas

Request/response HTTP API et payload Lambda ont des plafonds (plusieurs Mo selon le cas). Pour des fichiers lourds, préférez S3 pré-signé plutôt que de faire passer le binaire dans Lambda.

Idempotence et retries

API Gateway et les clients HTTP retrouvent. Si votre fonction écrit en DynamoDB, utilisez des conditions / ids clients pour éviter les doubles créations lors des retries.

Comparaison rapide SAM

sam init + sam deploy génère le même duo HTTP API + Lambda avec template CloudFormation. Une fois ce lab CLI compris, SAM devient le flux quotidien.

Function URL vs HTTP API

Lambda Function URL expose HTTPS sans API Gateway — encore plus minimal. HTTP API reste préférable dès que vous voulez stages, JWT authorizer, throttle fin, ou routes multiples. Pour l’examen : sachez que les deux existent ; ce lab enseigne le duo classique HTTP API + permission lambda:InvokeFunction.

Lab bonus (8–10 min) — env, update-code, logs

aws lambda update-function-configuration   --function-name lab-hello   --environment "Variables={STAGE=lab,REGION=ca-central-1}"

# Petite évolution du handler puis redeploy
zip -q function.zip lambda_function.py
aws lambda update-function-code   --function-name lab-hello   --zip-file fileb://function.zip

aws lambda invoke --function-name lab-hello   --payload '{"rawPath":"/bonus"}' out2.json
cat out2.json

# Logs (attendez 10–20 s après invoke)
aws logs filter-log-events   --log-group-name /aws/lambda/lab-hello   --limit 5   --query 'events[].message' --output text

Objectif : cycle config → code → invoke → logs sans recréer la fonction. En prod ce cycle passe par alias/versions + CI.

Scénario examen classique

« API publique légère, pics imprévisibles, pas de serveur à patcher ; besoin d’auth plus tard et d’alarmer les erreurs. » → Lambda + HTTP API ; auth JWT/IAM en prod ; alarmes CloudWatch Errors / Throttles / Duration ; pas d’EC2 « au cas où ». Si accès RDS privé : Lambda dans le VPC (ENI, cold start+) ou mieux RDS Proxy. Fichiers lourds : S3 pré-signé, pas le body HTTP API.

Checklist lab anti-facture Lambda/API

  1. Region ca-central-1 ; nommez lab-hello / lab-http-api pour les retrouver.
  2. API ouverte = durée de vie minutes ; delete-api dès la fin du curl.
  3. Rôle = AWSLambdaBasicExecutionRole seulement (ajoutez policies une par une si S3/SSM).
  4. Timeout 10 s lab ; pas 15 min « pour débugger tranquillement » sur une URL publique.
  5. Delete : API → function → detach policy → delete role ; vérifiez absence de Log Group orphelin si politique de rétention compte.

Quotas et concurrence en une minute

Compte : limite de concurrence régionale partagée entre toutes les fonctions. Un spike sur lab-hello peut throttler une autre Lambda du même compte — d’où reserved concurrency en prod. HTTP API a aussi des throttle/burst ; alignez-les avec vos SLO. Payload et durée ont des plafonds documentés : au-delà, découpez (Step Functions, SQS, S3).

Quiz (5 questions)

1. Pour un proxy Lambda simple en 2026, on choisit souvent : – A. Classic Load Balancer seulement
– B. HTTP API (API Gateway v2)
– C. Direct Connect

2. AWSLambdaBasicExecutionRole sert surtout à : – A. Admin S3
– B. Écrire les logs CloudWatch
– C. Ouvrir le port 22

3. Fin de lab : – A. Laisser l’URL publique
– B. Supprimer API + Lambda + rôle
– C. Désactiver MFA

4. Augmenter la mémoire Lambda : – A. Désactive CloudWatch
– B. Augmente aussi le CPU alloué (souvent ↓ durée)
– C. Ouvre le port 22

5. Sans add-permission pour API Gateway, le symptôme typique est : – A. Une EIP manquante
– B. Une 500 / invoke refusé côté intégration
– C. Un bucket S3 public

Réponses : 1‑B · 2‑B · 3‑B · 4‑B · 5‑B

Pour aller plus loin

Maillage série AWS (P1)

← Précédent SSM
→ Suivant CloudFormation
Aussi SNS/SQS · CloudWatch

Meta publication (SEO)

  • Title SEO : Lambda + API Gateway HTTP : API serverless (lab 2026)
  • Meta description : Déployez une Lambda Python derrière une HTTP API, testez curl, puis nettoyez. ca-central-1.
  • Focus keyword : Lambda API Gateway
  • Image mise en avant : assets/web/devopelastichayway/cover-aws-lambda-api-gateway-1200x630.webp (Visuels AWS — WebP 1200×630)
  • Catégorie : AWS · Niveau : Intermédiaire

Retour parcours AWS — hub de la série et leçons sœurs.

Share your love

Leave a Reply

Your email address will not be published. Required fields are marked *