Cours > Module > Chapitre

Lab Avancé : Amazon SQS avec Dead Letter Queue (DLQ) et AWS Lambda

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

  1. Un producteur (AWS CLI ou un script Python) envoie des messages dans MainQueue.
  2. Une fonction AWS Lambda lit les messages et simule un échec de traitement.
  3. 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 :

  1. Créer une Dead Letter Queue (DLQ) et l’attacher à MainQueue.
  2. Configurer un maxReceiveCount pour envoyer les messages échoués vers la DLQ.
  3. Déployer une fonction AWS Lambda pour traiter les messages.
  4. Simuler des échecs et observer les messages déplacés vers la DLQ.
×

Panier