انتقل إلى المحتوى الرئيسي

استكشاف أخطاء Lambda

الأخطاء الشائعة​

نظرة عامة​

┌─────────────────────────────────────────────────────────────┐
│ ERREURS LAMBDA COURANTES │
├─────────────────────────────────────────────────────────────┤
│ │
│ CATÉGORIE ERREUR CAUSE TYPIQUE │
│ ───────── ────── ───────────── │
│ │
│ PERMISSIONS AccessDenied رôle IAM manquant │
│ ResourceNotFound ARN incorrect │
│ │
│ EXÉCUTION Timeout Code trop lent │
│ OutOfMemory RAM insuffisante │
│ HandlerNotFound Handler mal config│
│ │
│ CODE ImportError Module manquant │
│ SyntaxError Erreur de syntaxe │
│ RuntimeError Bug dans le code │
│ │
│ CONFIGURATION InvalidParameter Mauvaise config │
│ TooManyRequests Throttling │
│ │
└─────────────────────────────────────────────────────────────┘

انتهاء المهلة​

الأعراض والحلول​

┌─────────────────────────────────────────────────────────────┐
│ TIMEOUT │
├─────────────────────────────────────────────────────────────┤
│ │
│ SYMPTÔME : │
│ "Task timed out after X seconds" │
│ │
│ CAUSES POSSIBLES : │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 1. Opération trop longue │ │
│ │ • Requête API externe lente │ │
│ │ • Traitement de gros fichiers │ │
│ │ • Calcul intensif │ │
│ │ │ │
│ │ 2. Timeout configuré trop court │ │
│ │ • Défaut: 3 secondes │ │
│ │ • Max: 15 minutes │ │
│ │ │ │
│ │ 3. Blocage réseau │ │
│ │ • VPC mal configuré │ │
│ │ • NAT Gateway manquant │ │
│ │ • Security Group bloquant │ │
│ │ │ │
│ │ 4. Code en attente infinie │ │
│ │ • Connexion DB qui ne répond pas │ │
│ │ • Boucle infinie │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ SOLUTIONS : │
│ ✅ Augmenter le timeout (si justifié) │
│ ✅ Optimiser le code │
│ ✅ Utiliser des timeouts dans le code (requests, DB) │
│ ✅ Vérifier la config réseau (VPC, NAT) │
│ ✅ Découper en fonctions plus petites │
│ │
└─────────────────────────────────────────────────────────────┘

كود مع انتهاء المهلة​

import requests
import boto3

# ❌ MAUVAIS : Pas de timeout
response = requests.get('https://api.example.com/data')

# ✅ BON : Avec timeout
response = requests.get('https://api.example.com/data', timeout=5)

# ✅ BON : Vérifier le temps restant
def lambda_handler(event, context):
remaining = context.get_remaining_time_in_millis()

if remaining < 5000: # Moins de 5 secondes
return {'error': 'Not enough time remaining'}

# Continuer le traitement...

نفاد الذاكرة​

┌─────────────────────────────────────────────────────────────┐
│ OUT OF MEMORY │
├─────────────────────────────────────────────────────────────┤
│ │
│ SYMPTÔME : │
│ "Runtime exited with error: signal: killed" │
│ "Process exited before completing request" │
│ │
│ CAUSES : │
│ • Chargement de gros fichiers en mémoire │
│ • Fuites mémoire │
│ • RAM configurée trop basse │
│ │
│ DIAGNOSTIC : │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Dans les logs CloudWatch : │ │
│ │ │ │
│ │ REPORT RequestId: xxx │ │
│ │ Duration: 1500.00 ms │ │
│ │ Billed Duration: 1500 ms │ │
│ │ Memory Size: 128 MB │ │
│ │ Max Memory Used: 127 MB ← Proche du max ! │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ SOLUTIONS : │
│ ✅ Augmenter la mémoire allouée │
│ ✅ Traiter les fichiers en streaming │
│ ✅ Libérer les ressources après usage │
│ ✅ Utiliser des fichiers temporaires (/tmp) │
│ │
└─────────────────────────────────────────────────────────────┘

كود محسن للذاكرة​

import json

# ❌ MAUVAIS : Charge tout en mémoire
def process_large_file_bad(bucket, key):
s3 = boto3.client('s3')
response = s3.get_object(Bucket=bucket, Key=key)
data = response['Body'].read() # Tout en RAM !
return json.loads(data)

# ✅ BON : Streaming
def process_large_file_good(bucket, key):
s3 = boto3.client('s3')
response = s3.get_object(Bucket=bucket, Key=key)

# Traiter ligne par ligne
for line in response['Body'].iter_lines():
process_line(line)

أخطاء الأذونات​

┌─────────────────────────────────────────────────────────────┐
│ ERREURS IAM │
├─────────────────────────────────────────────────────────────┤
│ │
│ "AccessDeniedException" │
│ "User is not authorized to perform..." │
│ │
│ CHECKLIST : │
│ │
│ ☐ Le rôle d'exécution a les bonnes permissions ? │
│ aws lambda get-function --function-name xxx │
│ → Vérifier "Role" ARN │
│ │
│ ☐ La politique IAM est correcte ? │
│ aws iam get-role-policy --role-name xxx │
│ → Vérifier les actions autorisées │
│ │
│ ☐ Les ressources sont correctement spécifiées ? │
│ → ARN exact vs wildcard (*) │
│ │
│ ☐ Pas de Deny explicite qui bloque ? │
│ → Vérifier les SCP, policies │
│ │
│ EXEMPLE DE POLITIQUE CORRECTE : │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ { │ │
│ │ "Effect": "Allow", │ │
│ │ "Action": [ │ │
│ │ "s3:GetObject", │ │
│ │ "s3:PutObject" │ │
│ │ ], │ │
│ │ "Resource": "arn:aws:s3:::my-bucket/*" │ │
│ │ } │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

بدء بارد​

┌─────────────────────────────────────────────────────────────┐
│ COLD START │
├─────────────────────────────────────────────────────────────┤
│ │
│ Le "Cold Start" est le temps d'initialisation quand │
│ Lambda crée un nouvel environnement d'exécution. │
│ │
│ TIMELINE : │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ COLD START (1ère invocation) │ │
│ │ ├── Téléchargement du code (50-200ms) │ │
│ │ ├── Démarrage du runtime (100-500ms) │ │
│ │ ├── Initialisation (votre code init) │ │
│ │ └── Exécution du handler │ │
│ │ │ │
│ │ WARM (invocations suivantes) │ │
│ │ └── Exécution du handler seulement (~10ms) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ FACTEURS QUI AUGMENTENT LE COLD START : │
│ • Gros package (beaucoup de dépendances) │
│ • Runtime lourd (Java > Python > Node) │
│ • VPC (ajoute 1-10 secondes !) │
│ • Initialisation complexe │
│ │
│ OPTIMISATIONS : │
│ ✅ Provisioned Concurrency (garde des instances warm) │
│ ✅ Réduire la taille du package │
│ ✅ Initialiser hors du handler │
│ ✅ Éviter VPC si pas nécessaire │
│ ✅ Utiliser des runtimes légers │
│ │
└─────────────────────────────────────────────────────────────┘

سجلات CloudWatch​

قراءة السجلات​

┌─────────────────────────────────────────────────────────────┐
│ LOGS CLOUDWATCH │
├─────────────────────────────────────────────────────────────┤
│ │
│ Emplacement : │
│ /aws/lambda/<function-name> │
│ │
│ Format d'un log : │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ START RequestId: abc-123 │ │
│ │ [INFO] Processing event... │ │
│ │ [ERROR] Failed to connect to database │ │
│ │ END RequestId: abc-123 │ │
│ │ REPORT RequestId: abc-123 │ │
│ │ Duration: 1234.56 ms │ │
│ │ Billed Duration: 1300 ms │ │
│ │ Memory Size: 256 MB │ │
│ │ Max Memory Used: 128 MB │ │
│ │ Init Duration: 234.56 ms ← Cold start ! │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Commandes CLI : │
│ # Voir les derniers logs │
│ aws logs tail /aws/lambda/my-function --follow │
│ │
│ # Filtrer les erreurs │
│ aws logs filter-log-events \ │
│ --log-group-name /aws/lambda/my-function \ │
│ --filter-pattern "ERROR" │
│ │
└─────────────────────────────────────────────────────────────┘

طريقة التشخيص​

┌─────────────────────────────────────────────────────────────┐
│ MÉTHODE DE DIAGNOSTIC │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. IDENTIFIER LE SYMPTÔME │
│ • Message d'erreur exact │
│ • Code HTTP retourné │
│ • Comportement observé │
│ │
│ 2. CONSULTER LES LOGS │
│ • CloudWatch Logs │
│ • X-Ray traces (si activé) │
│ • سجلات التطبيق │
│ │
│ 3. التحقق من التكوين │
│ • Timeout │
│ • الذاكرة │
│ • متغيرات البيئة │
│ • VPC / Security Groups │
│ │
│ 4. التحقق من الأذونات │
│ • دور التنفيذ │
│ • السياسات المرتبطة │
│ • Resource policies │
│ │
│ 5. الاختبار بمعزل │
│ • الاستدعاء يدويًا │
│ • تبسيط الـ payload │
│ • تعطيل الميزات واحدة تلو الأخرى │
│ │
│ 6. التصحيح والتحقق │
│ • تطبيق الإصلاح │
│ • الاختبار بنفس السيناريو │
│ • توثيق الحل │
│ │
└─────────────────────────────────────────────────────────────┘

ملخص الحلول​

ErreurCauseSolution
TimeoutCode lentOptimiser, augmenter timeout
OutOfMemoryRAM insuffisanteAugmenter mémoire, streaming
AccessDeniedIAM manquantAjouter permissions
Cold StartInitialisationProvisioned Concurrency
Handler not foundMauvais nomVérifier handler config

القسم التالي : مختبر استكشاف الأخطاء