Amazon Simple Notification Service (SNS) es un servicio de mensajería de publicación/suscripción que permite desacoplar microservicios, sistemas distribuidos y aplicaciones sin servidor. Lo que quiere decir que te ayudará a que estos servicios / aplicaciones, se comuniquen sin necesidad de estar en el mismo servidor y/o proyecto.

¿Cuándo usarlo?

  • Cuando tu proyecto se encuentra distribuido en microservicios y necesitas que se comuniquen entre ellos.
  • Cuando tenemos dos o más proyectos diferentes, pero necesitamos que compartan alguna información de un microservicio.

Nuestra problemática

Tenemos dos microservicios, un receptor y un emisor, el emisor se encarga de recopilar información de cierto nicho poblacional y semanalmente envía un listado con toda esa información al receptor, aquí el problema surge cuando un usuario en la aplicación receptor decide usar información de algún nicho que ha sido borrado en el transcurso de esa semana; ya que cuando se haga un nuevo update el usuario notará que la información del nicho que él usó ya no está.

La solución fue implementar un sistema de notificaciones que nos alerte sobre un cambio en un nicho en particular y así poder actualizar la información.

El flujo básico es el siguiente:

El receptor en este caso es solo uno, pero el mensaje puede llegarle a tantos endpoint como estén registrados.

Configurando nuestro proyecto en Laravel

Publicando mi primer mensaje con SNS y Laravel

Para esta sección trabajaremos con el lado de la aplicación emisor, la cual enviará un mensaje a SNS y nos notificará de algún cambio.

  1. Primeramente, debemos entrar en nuestro console AWS management console a la sección SNS y crear un topic o tema.

  1. Debemos crear una Queue o Cola, esto nos ayudará para poder probar que nuestros mensajes se están enviando de forma correcta, para esto debemos ir a la sección de SQS.

Verás que tiene varias opciones de configuración, en nuestro caso solo le daremos un nombre y dejaremos todo por default.

  1. Regresamos a la sección subscriptions y creamos una suscripción, y asociamos el topic y la queue que creamos previamente.


El endpoint/arn de la cola lo encontrarás en la sección de SQS, en la descripción de la misma.

Una vez hecho esto, nos dirigimos a la descripción de nuestro topic, todo debería verse de la siguiente forma:

Hasta aquí hemos terminado la configuración del lado de AWS para poder comenzar a enviar Notificaciones.

Solamente podrás publicar mensajes para topics y endpoint que estén en misma región que tu entorno AWS.

Configuración de AWS en Laravel (Emisor)

  1. Debemos instalar el paquete aws/aws-sdk-php-laravel, puedes ver cómo hacerlo aquí.
  2. Debemos obtener nuestras credenciales de AWS, asegúrate que tengan los permisos para crear y administrar SNS y SQS, de no tener acceso al área de administración de usuarios, solicita ayuda al área de DevOps.
  3. Una vez instalado el SDK de AWS vamos a copiar el siguiente código. Lo haremos como una función anónima dentro de una ruta para no complicar más el código.

El campo TargetArn debe ser sustituido por el ARN del topic, lo encuentras en la descripción del mismo.

Para saber más acerca del tipo de datos que puedes enviar, revisa la documentación oficial de Attributes & PHPSDK.

  1. Listo, accedemos a la URL https://localhost/send-notification y ya deberíamos estar enviando nuestro primer mensaje.
  2. Nos vamos a la sección SQS en AWS y deberíamos observar que hay un mensaje disponible, podemos verlo seleccionando nuestra queue y después en el dropdown Queue action que se encuentra en la parte superior.

Así debería lucir al dar clic en more details después de haber entrado a View/Delete Messages.

Puedes revisar el código para publicar mensajes en GitHub

Listo, con esto ya hemos enviado nuestro primer mensaje con SNS y Laravel. Si te gustaría conocer cómo recibirlos, te invito a leer nuestro siguiente tutorial: Recibir Notificaciones con SNS/AWS y Laravel.

Conoce más sobre esta herramienta visitando la página oficial de Amazon SNS.

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.