Objectif
Dans ce lab, nous allons :
✅ Créer une Main Queue et une Dead Letter Queue (DLQ).
✅ Configurer un maximum de tentatives avant l’échec.
✅ Intégrer une fonction AWS Lambda pour simuler un traitement de message.
✅ Vérifier le transfert automatique des messages non traités vers la DLQ.
Architecture du Lab
- Un producteur (AWS CLI ou un script Python) envoie des messages dans MainQueue.
- Une fonction AWS Lambda lit les messages et simule un échec de traitement.
- Après 3 tentatives (configurables), le message est déplacé vers DLQQueue.
Étape 1 : Création des files SQS
1.1 Créer la Dead Letter Queue (DLQ)
bash
aws sqs create-queue --queue-name DLQQueue
📌 Récupérer l’ARN de la DLQ :
aws sqs get-queue-attributes --queue-url https://sqs.us-east-1.amazonaws.com/123456789012/DLQQueue --attribute-names QueueArn
Exemple de sortie :
{
"Attributes": {
"QueueArn": "arn:aws:sqs:us-east-1:123456789012:DLQQueue"
}
}
Copiez cet ARN, il sera utilisé dans la prochaine étape.
🔹 1.2 Créer la Main Queue avec la DLQ configurée
bash
aws sqs create-queue --queue-name MainQueue --attributes '{"RedrivePolicy":"{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:123456789012:DLQQueue\", \"maxReceiveCount\":\"3\"}"}'
✅ Explication :
- maxReceiveCount=3 → Après 3 tentatives d’échec, le message est envoyé dans la DLQ.
- deadLetterTargetArn → Identifie la DLQ où envoyer les messages échoués.
Vérifiez que la DLQ est bien configurée :
aws sqs get-queue-attributes --queue-url https://sqs.us-east-1.amazonaws.com/123456789012/MainQueue --attribute-names RedrivePolicy
Étape 2 : Créer une Fonction AWS Lambda
Notre fonction recevra les messages de MainQueue et simulera un échec pour tester la DLQ.
🔹 2.1 Créer un rôle IAM pour Lambda
aws iam create-role --role-name LambdaSQSRole --assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}'
Attacher les permissions nécessaires :
aws iam attach-role-policy --role-name LambdaSQSRole --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
aws iam attach-role-policy --role-name LambdaSQSRole --policy-arn arn:aws:iam::aws:policy/AmazonSQSFullAccess
🔹 2.2 Créer la fonction Lambda
📌 Créer un fichier lambda_function.py avec le code suivant :
python
import json
import boto3
def lambda_handler(event, context):
for record in event['Records']:
message_body = record['body']
print(f"Message reçu : {message_body}")
# Simuler un échec (ne pas supprimer le message)
if "fail" in message_body.lower():
print("Simulation d'échec de traitement")
raise Exception("Échec de traitement du message")
return {
'statusCode': 200,
'body': json.dumps('Traitement réussi')
}
Créer un fichier ZIP pour le code Lambda :
zip lambda_function.zip lambda_function.py
📌 Créer la fonction Lambda avec AWS CLI :
aws lambda create-function --function-name ProcessSQSMessage \
--runtime python3.9 --role arn:aws:iam::123456789012:role/LambdaSQSRole \
--handler lambda_function.lambda_handler \
--zip-file fileb://lambda_function.zip
🔹 2.3 Lier la file SQS à Lambda
aws lambda create-event-source-mapping \
--function-name ProcessSQSMessage \
--event-source-arn arn:aws:sqs:us-east-1:123456789012:MainQueue
📌 Explication :
- Cela permet à MainQueue de déclencher automatiquement la Lambda ProcessSQSMessage à chaque nouveau message.
Étape 3 : Tester le fonctionnement de la DLQ
🔹 3.1 Envoyer un message qui va échouer
aws sqs send-message --queue-url https://sqs.us-east-1.amazonaws.com/123456789012/MainQueue --message-body "fail - test message"
✅ La Lambda va échouer 3 fois, puis le message sera redirigé vers la DLQ.
🔹 3.2 Vérifier que le message est dans la DLQ
aws sqs receive-message --queue-url https://sqs.us-east-1.amazonaws.com/123456789012/DLQQueue
Si tout fonctionne, vous devriez voir :
{
"Messages": [
{
"Body": "fail - test message",
"ReceiptHandle": "XXXXXX",
"MessageId": "YYYYYY"
}
]
}
Étape 4 : Nettoyage des ressources
Après le test, supprimez les ressources pour éviter les frais AWS :
aws sqs delete-queue --queue-url https://sqs.us-east-1.amazonaws.com/123456789012/MainQueue
aws sqs delete-queue --queue-url https://sqs.us-east-1.amazonaws.com/123456789012/DLQQueue
aws lambda delete-function --function-name ProcessSQSMessage
aws iam delete-role --role-name LambdaSQSRole
Conclusion
🎯 Ce que nous avons appris :
- Créer une Dead Letter Queue (DLQ) et l’attacher à MainQueue.
- Configurer un maxReceiveCount pour envoyer les messages échoués vers la DLQ.
- Déployer une fonction AWS Lambda pour traiter les messages.
- Simuler des échecs et observer les messages déplacés vers la DLQ.