Publicación y suscripción a mensajes de AWS SNS con Node.js

    Introducción

    Mucha de la tecnología que vemos se basa en un ciclo de solicitud / respuesta muy inmediato: cuando realiza una solicitud a un sitio web, obtiene una respuesta que contiene el sitio web que solicitó, idealmente de inmediato. Todo esto depende de que el usuario tome la decisión activa de solicitar esos datos.

    A veces, necesitamos alejarnos de ese modelo, y para eso usamos el modelo ‘publicar / suscribir’. Servicio de notificación simple de AWS (SNS) es un servicio súper escalable que permite a los usuarios implementar el modelo de publicación / suscripción con facilidad. Esto nos permite enviar mensajes de texto, correos electrónicos, notificaciones automáticas u otros mensajes automáticos a otros objetivos a través de múltiples canales al mismo tiempo.

    En esta publicación, aprenderemos cómo crear una aplicación web que pueda publicar un mensaje a varios suscriptores a la vez por correo electrónico, todos usando SNS.

    Obviamente necesitarás un Servicios web de Amazon (AWS) para hacer esto. Y afortunadamente, SNS tiene un nivel gratuito en el que sus primeras notificaciones push de 1M SNS son gratuitas cada mes.

    Modelo de publicación / suscripción

    El modelo de publicación / suscripción consta de dos componentes en un sistema:

    • Editor: Un servicio que puede difundir mensajes a otros servicios que lo escuchan (suscritos).
    • Abonado: Cualquier servicio al que el editor transmitirá.

    Para convertirse en un suscriptor, un servicio debe notificar al editor que desea recibir sus transmisiones, así como dónde quiere recibir esas transmisiones; en ese momento, el editor lo incluirá en su lista de objetivos cuando vuelva publica un mensaje.

    Una buena metáfora para el modelo de publicación / suscripción es cualquier boletín al que se haya suscrito. En este caso, ha acudido activamente al editor y le ha dicho que desea suscribirse y le ha proporcionado su correo electrónico.

    No se hace nada de inmediato una vez que se ha suscrito y no recibe ningún número anterior del boletín.

    La próxima vez que el editor publica un mensaje (envía su boletín mensual), llega un correo electrónico. Luego puede elegir hacer lo que quiera con el correo electrónico: puede eliminarlo, leerlo o incluso actuar sobre algunos de los detalles que contiene.

    Configurar un tema de SNS

    Para comenzar, primero debemos configurar un tema en AWS SNS. Un tema es lo que consideraríamos un ‘editor’: podemos enviar mensajes a un tema, que luego publicará para todos sus suscriptores.

    En su panel de AWS, seleccione ‘Servicio de notificación simple’ y presione ‘Temas’ en el lado izquierdo, seguido del botón ‘Crear tema’.

    Se le presentará una pantalla que le pedirá que proporcione información básica sobre el tema SNS:

    Esta pantalla tiene varias opciones, aunque solo muestra un grupo de forma predeterminada: este es el nombre (que es obligatorio) y el nombre para mostrar, que se puede configurar opcionalmente, esto se usa si desea publicar para los suscriptores de SMS desde el tema.

    Algunas de las otras opciones incluyen:

    • Cifrado de mensajes: Cifrado de mensajes después de haber sido enviados por el editor. Esto realmente solo es útil si está enviando datos muy sensibles / personales.
    • Políticas de acceso: Define exactamente quién puede publicar mensajes en el tema.
    • Política de reintento: En el caso de que un suscriptor no reciba un mensaje publicado por cualquier motivo.
    • Registro de estado de entrega: Le permite configurar un rol de IAM (Identity and Access Management) en AWS que escribe registros de estado de entrega en AWS CloudWatch.

    Por ahora, vamos a completar un nombre y un nombre para mostrar, luego nos desplazaremos hasta el final y presionaremos ‘Crear tema’. Toma nota del ARN del tema recién creado, ya que lo necesitaremos más adelante.

    Configurar un usuario de IAM

    Usaremos el SDK de AWS JavaScript para interactuar con AWS SNS, y para poder hacerlo, necesitaremos un conjunto de credenciales que el SDK pueda usar para enviar solicitudes a AWS.

    Podemos obtener este conjunto de credenciales creando un usuario de IAM. Abra el menú ‘Servicios’ que usamos para buscar anteriormente, y esta vez busque IAM.

    Verá una pantalla que se parece a esto:

    Haga clic en ‘Usuarios’ a la izquierda, luego haga clic en ‘Agregar usuario’; se encontrará con una pantalla que se ve así:

    Para propósitos de tutorial, creemos un usuario con el nombre SNSUsery marque la casilla de acceso programático. Querremos acceder a él a través de nuestra aplicación mediante programación, no solo a través de la consola de AWS.

    Esto permite que cualquier persona con las credenciales acceda a partes específicas de AWS a través de la CLI o el SDK de JavaScript que vamos a utilizar. No necesitamos darles acceso a la Consola de administración de AWS, ya que no planeamos que esas credenciales interactúen con AWS a través de un navegador, como lo está haciendo ahora.

    Haga clic en siguiente y se le presentarán los permisos. Haga clic en el botón ‘Adjuntar políticas existentes directamente’ y, al buscar ‘SNS’, podrá encontrar fácilmente la opción ‘SNSFullAccess’:

    Los usuarios, los roles y las políticas de IAM son un gran tema que definitivamente vale la pena investigar; sin embargo, por ahora, esto debería funcionar para nosotros.

    Al presionar ‘Siguiente: Etiquetas’ en la esquina inferior derecha, y luego ‘Siguiente: Revisar’ en la misma ubicación, debería ver una pantalla de resumen que se parece a esto:

    Nota: Asegúrese de copiar el ID de la clave de acceso y la Clave de acceso secreta o descargar el archivo CSV, ya que esta es la única vez que puede obtener estas credenciales; de lo contrario, deberá crear un nuevo usuario.

    Mientras hablamos de credenciales, asegúrese de no haga publique estas credenciales en cualquier lugar en línea o consúltelas en un repositorio de Git. Los malos actores rastrearán GitHub en busca de repositorios con credenciales para poder acceder a su cuenta de AWS y utilizar los recursos en ella, lo que le costará algo de dinero.

    Finalmente, configuraremos nuestras credenciales localmente (Linux / OSX / Unix) para que nuestra aplicación Node pueda usarlas en el siguiente paso.

    Para determinar su región, visite esta página y encuentre la región más cercana a usted. El valor predeterminado en AWS es us-east-2 – que tiene su sede en Ohio. Esta es la región que verá cuando vea AWS en su navegador:

    touch ~/.aws/credentials
    echo '[sns_profile]' >> ~/.aws/credentials
    echo 'aws_access_key_id = <YOUR_ACCESS_KEY_ID>' >> ~/.aws/credentials # The access key ID from the IAM user
    echo 'aws_secret_access_key = <YOUR_SECRET_ACCESS_KEY>' >> ~/.aws/credentials # The secret access key from the IAM user
    echo 'region = <YOUR_AWS_REGION>' # From the regions page, examples include: us-east-1, us-west-1, eu-west-1, etc.
    

    Aplicación de demostración Node.js

    A continuación, crearemos una aplicación Node usando Express. Esta aplicación tendrá dos puntos finales. El primero será para agregar direcciones de correo electrónico como suscriptores a nuestro tema, el segundo será para enviar un correo electrónico a todos nuestros suscriptores.

    Nota: Mientras usamos el punto final de correo electrónico en esta demostración, el mismo código general se puede usar para cualquiera de los otros puntos finales SNS, como HTTP, SMS, Lambda, etc. Solo necesita intercambiar algunos parámetros en la API de SNS. llamada.

    En primer lugar, creemos una carpeta para nuestro proyecto en nuestra terminal, vayamos al directorio e inicialicemos nuestra aplicación Node:

    $ mkdir node-sns-app
    $ cd node-sns-app
    $ npm init
    

    Puede presionar enter hasta que el script se complete con las opciones predeterminadas, haciendo nuestro punto de entrada predeterminado index.js.

    A continuación, necesitamos instalar los módulos Express y AWS-SDK para que podamos usarlos a ambos:

    $ npm install express --save
    $ npm install aws-sdk --save
    

    A continuación, queremos crear nuestra aplicación. En el mismo directorio, cree un archivo llamado index.js:

    $ touch index.js
    

    Primero, ingresaremos un código solo para asegurarnos de que podamos ejecutar la aplicación con AWS:

    const express = require('express');
    const app = express();
    
    const AWS = require('aws-sdk');
    const credentials = new AWS.SharedIniFileCredentials({profile: 'sns_profile'});
    const sns = new AWS.SNS({credentials: credentials, region: 'eu-west-2'});
    
    const port = 3000;
    
    app.use(express.json());
    
    app.get('/status', (req, res) => res.json({status: "ok", sns: sns}));
    
    app.listen(port, () => console.log(`SNS App listening on port ${port}!`));
    

    La mayor parte de esto es repetitivo para Express, pero las líneas 4-6 crean una instancia de AWS, dígale que use las credenciales en el perfil que creamos en ~/aws/credentials anteriormente, y cree una instancia de la clase SNS con él.

    Ahora, podemos seguir adelante y ejecutar el archivo:

    $ node index.js
    

    Visitando localhost:3000/status imprimirá una gran parte de JSON que contiene sus credenciales de AWS. Si eso funciona, podemos seguir adelante y crear nuestros puntos finales.

    Punto final de suscripción

    Primero, necesitamos agregar un punto final POST para agregar suscriptores, en este caso, nuevas direcciones de correo electrónico. Bajo el /status punto final, agregaremos el /subscribe punto final:

    app.post('/subscribe', (req, res) => {
        let params = {
            Protocol: 'EMAIL', 
            TopicArn: '<YOUR_TOPIC_ARN_HERE>',
            Endpoint: req.body.email
        };
    
        sns.subscribe(params, (err, data) => {
            if (err) {
                console.log(err);
            } else {
                console.log(data);
                res.send(data);
            }
        });
    });
    

    Bien, repasemos esto. Primero, estamos creando un punto final POST. Dentro de ese punto final, estamos creando una variable de parámetros lista para entregar a nuestra solicitud de suscripción a SNS.

    La variable de parámetros necesita algunas cosas:

    • Protocol: Lo hemos configurado como correo electrónico, pero podría ser HTTP / S, SMS, SQS (si desea utilizar el servicio de cola de AWS) o incluso una función Lambda.
    • TopicArn: Este es el ARN, un identificador único para el tema de SNS que configuró anteriormente. Si no lo tienes, tómalo de tu tema en tu navegador y pégalo en el código ahora.
    • Endpoint: El tipo de punto final depende del protocolo. Como estamos enviando correos electrónicos, le daríamos una dirección de correo electrónico, pero si estuviéramos configurando una suscripción HTTP / S, pondríamos una dirección URL o un número de teléfono para SMS.

    Puedes leer más sobre el método de suscripción. de la documentación oficial.

    Una vez que esté dentro, inicie su servidor nuevamente. Deberá enviar una solicitud con un cuerpo JSON a su aplicación; puede hacerlo con herramientas como Postman o, si lo prefiere, puede hacerlo en la CLI:

    $ curl -H "Content-type: application/json" -d '{ "email": "<AN_EMAIL_ADDRESS_HERE>" }' 'localhost:3000/subscribe'
    

    Si el punto final y el mensaje son correctos, esa dirección de correo electrónico recibirá un correo electrónico que le preguntará si desea confirmar su suscripción; cualquier suscripción creada a través de AWS SNS debe ser confirmada por el punto final de alguna forma; de lo contrario, AWS podría usarse de forma maliciosa para enviar spam o Ataques de tipo DDOS.

    Asegúrese de confirmar la suscripción antes del siguiente paso para cualquier correo electrónico al que se suscriba.

    Punto final de correo electrónico

    Ahora para hacer el punto final para enviar nuestro correo electrónico:

    app.post('/send', (req, res) => {
        let params = {
            Message: req.body.message,
            Subject: req.body.subject,
            TopicArn: '<YOUR_TOPIC_ARN_HERE>'
        };
    
        sns.publish(params, function(err, data) {
            if (err) console.log(err, err.stack); 
            else console.log(data);
        });
    });
    

    Nuevamente, echemos un vistazo a de qué están hechos los parámetros aquí:

    • Message: Este es el mensaje que desea enviar; en este caso, sería el cuerpo del correo electrónico
    • Subject: Este campo solo se incluye porque estamos enviando un correo electrónico; esto establece el asunto del correo electrónico
    • TopicArn: Este es el tema en el que estamos publicando el mensaje; esto se publicará para todos los suscriptores de correo electrónico para ese tema.

    Si desea obtener más información sobre el método de publicación, consulte la documentación, también hay otras propiedades.

    Puede enviar un mensaje ahora usando Postman, o curl – siempre que pasemos nuestros parámetros para el asunto y el mensaje:

    $ curl -H "Content-type: application/json" -d '{ "subject": "Hello there!", "message": "You just received an email from SNS!" }' 'localhost:3000/send'
    

    Una vez realizada esta solicitud, todos los suscriptores del punto final deberían recibir este correo electrónico. ¡Felicitaciones, acaba de publicar su primer mensaje usando SNS y Node.js!

    ¿Qué sigue?

    Plantillas de mensajes

    Dado que su mensaje es una cadena, puede utilizar la interpolación de cadenas para la entrada dinámica, por ejemplo:

    app.post('/send', (req, res) => {
        let now = new Date().toString();
        let email = `${req.body.message} n n This was sent: ${now}`;
        let params = {
            Message: email,
            Subject: req.body.subject,
            TopicArn: '<YOUR_TOPIC_ARN_HERE'
        };
    
        sns.publish(params, function(err, data) {
            if (err) console.log(err, err.stack); 
            else console.log(data);
        });
    });
    

    Puntos finales HTTP

    Puede configurar un servicio diseñado para recibir el mensaje, en caso de que desee activar una acción en segundo plano, pero no necesariamente se preocupe por recibir el resultado de inmediato. Simplemente configure el punto final como HTTP / S y podrá formatear el mensaje como desee. Por ejemplo, esto es especialmente útil para servidores / servicios sobre los que es posible que no tenga control, pero que le permiten enviar notificaciones de webhooks.

    Lambda

    De manera similar, podría usar estos mensajes para activar y entregar entradas a las funciones Lambda. Esto podría iniciar un trabajo de procesamiento, por ejemplo. ¡Echa un vistazo a esta publicación para descubrir cómo!

    SMS

    Si quita el subject , puede enviar mensajes SMS de 160 caracteres a cualquier número de teléfono suscrito.

    SQS

    Con el tipo de punto final SQS, puede poner mensajes en colas para construir arquitecturas controladas por eventos; consulte este artículo para obtener más detalles.

    ¿Mensajes mixtos?

    Hay un MessageStructure parámetro que puede entregar y que le permite usar en Topic para transmitir en múltiples canales con diferentes mensajes; esto significa que puede escribir un correo electrónico completo para todos los suscriptores de correo electrónico, pero al mismo tiempo enviar un mensaje optimizado para SMS a todos suscriptores móviles, lo que permite comunicaciones de múltiples canales!

    Conclusión

    Servicio de notificación simple de AWS (SNS) es un servicio súper escalable que permite a los usuarios implementar el modelo de publicación / suscripción con facilidad. Esto nos permite enviar mensajes de texto, correos electrónicos, notificaciones automáticas u otros mensajes automáticos a otros objetivos a través de múltiples canales al mismo tiempo.

    En este artículo, creamos un tema y nos suscribimos a él mediante programación utilizando el AWS SDK de Node.js. Luego creamos puntos finales HTTP en nuestra aplicación de demostración que permite a los usuarios suscribirse a nuestro tema SNS por correo electrónico, y otro punto final para transmitir un correo electrónico a todos los suscriptores.

    Etiquetas:

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *