Fan-Out Pattern avec SQS et SNS

Les service SQS (Amazon Simple Queue Service) et SNS (Amazon Simple Notification Service) sont des services managés de AWS qui facilitent le découplage des composants du SI (microservices, applications serverless, Saas, … ).

Une utilisation correcte de SQS et de SNS contribue à la construction d’architectures agiles, scalables, et faciles à maintenir. Pour cela, il est nécessaire de suivre les bonnes pratiques en termes de Pattern d’architecture. Parmi les Patterns les plus utilisés, on distingue le pattern nommé « Fan-out ».

Le Pattern « Fan-out » se base sur une Topic SNS qui agit comme un Broker pour alimenter plusieurs files SQS qui vont traiter le message en parallèle et de façon asynchrone.

Setup

Ci-dessous quelques commandes CLI pour créer et configurer une topic SNS et les files SQS qui consomment les messages publiés par la SNS.

  • Créer une SNS Topic :

aws> sns create-topic –name fan-out-sns-topic

  • Créer une file SQS  :

aws> sqs create-queue –queue-name fan-out-sqs-queue1

  • Créer une policy IAM et l’associer à SQS

Les queues SQS ont besoin d’être associées à une policy IAM afin que les topics SNS puissent leur envoyer des messages via l’action « SendMessage ».

 1-Créer un fichier /tmp/policy.json avec le contenu ci-dessous :

{ « Policy » : « { \ »Version\ »: \ »2012-10-17\ », \ »Id\ »: \ »arn:aws:sqs:us-east-1:***********: fan-out-sqs-queue1/SQSDefaultPolicy\ », \ »Statement\ »: [{ \ »Sid\ »: \ »Sid1508039487834\ »,\ »Effect\ »: \ »Allow\ », \ »Principal\ »: {\ »AWS\ »: \ »*\ »},\ »Action\ »: \ »SQS:SendMessage\ »,\ »Resource\ »: \ »arn:aws:sqs:us-east-1:***********: fan-out-sqs-queue1\ »,\ »Condition\ »: {\ »ArnEquals\ »: {\ »aws:SourceArn\ »: \ »arn:aws:sns:us-east-1:***********:fan-out-sns-topic\ »}}}]} »}

Les Ids et ARN sont à modifier

2-Associer cette policy à SQS :

aws> sqs set-queue-attributes –queue-url https://queue.amazonaws.com/***********/fan-out-sqs-queue1 –attributes file:///tmp/policy.json

  • Souscription de SQS à SNS

aws> sns subscribe –topic-arn arn:aws:sns:us-east-1:***********: fan-out-sns-topic –protocol sqs –notification-endpoint arn:aws:sqs:us-east-1:***********: fan-out-sqs-queue1

{

   « SubscriptionArn »: « arn:aws:sns:us-east-1:***********:fan-out-sns-topic:c0ddf05a-a62e-44dc-ac64-99da02a00fba »

}

Ainsi, nous aurons créé, en quelques minutes, un système d’échanges entre composants du SI basé sur le Pattern « Fan-out ».