Blog de Amazon Web Services (AWS)
Aumentando la capacidad de recepción y almacenamiento de correos electrónicos mediante Amazon SES
Por: Camilo García Villabona, Arquitecto de Soluciones en Amazon Web Services para el Sector Público en la región Andina.
Problema
El correo electrónico es un componente esencial del portafolio de servicios de tecnología dentro de una organización. En general es el principal medio de comunicación diaria entre personal interno, así como con actores y stakeholders externos.
Aunque comúnmente su uso se limita al comentado anteriormente, algunas organizaciones requieren el uso de correo electrónico para enviar y recibir masivamente correos debido a las actividades propias de su negocio, servicios que prestan o a su público objetivo.
En relación a esta necesidad, muchas soluciones de correo tienen límites sumamente restrictivos que impiden una operación efectiva para el manejo de altos volúmenes de correos entrantes. Esto empuja a organizaciones a manejar varios buzones de correo, procesos manuales de limpieza y archivado de datos, entre otros “workarounds” que elevan la complejidad, carga operativa y posibles errores.
El propósito de este blog es enfocarse en casos de uso alrededor de la recepción masiva de correos. Esto incluye, por ejemplo, clientes que reciben retroalimentación mediante correos sobre la calidad de su servicio y/o productos, manejo de facturación electrónica, etc… que requieren una amplia capacidad de recepción, almacenamiento escalable y posibilidad de análisis a gran escala para mantener una relación positiva con sus clientes, cumplir obligaciones tributarias y demás sin agregar complejidad operativa.
Amazon SES
Amazon Simple Email Service (Amazon SES) es un servicio que le permite a su organización llegar a sus clientes de forma fiable sin la necesidad de un servidor de correo en sus instalaciones. Aunque usualmente se piensa en Amazon SES por sus capacidades de envío de correos, también es un poderoso servicio para su recepción.
Amazon SES se puede configurar para recibir mensajes de correo electrónico en uno o más de los dominios de su organización. Al configurarse como receptor de correo electrónico, el servicio administra sus operaciones de recepción como lo es la comunicación con otros servidores de correo, escaneo de correo no deseado o virus, bloqueo de correos de fuentes no confiables y más.
Aprovechando las integraciones de Amazon SES
Amazon SES soporta de forma nativa integración con diferentes servicios de AWS al generar reglas de recepción de correo. Una regla de recepción de correo indica a Amazon SES cómo gestionar el correo entrante mediante la ejecución de una lista ordenada de acciones. Se pueden agrupar varias reglas de recepción de forma ordenada en conjuntos de reglas.
Como parte de las acciones que se pueden usar en las reglas de recepción, se encuentran integraciones con servicios como AWS Lambda, Amazon S3, Amazon SNS y Amazon WorkMail. Las integraciones son de la siguiente manera:
AWS Lambda
AWS Lambda es un servicio informático sin servidor y basado en eventos que le permite ejecutar código para prácticamente cualquier tipo de aplicación o servicio backend sin necesidad de aprovisionar o administrar servidores.
Un evento en una función Lambda se refiere a datos estructurados en formato JSON. La estructura JSON varía según el servicio que la genera (En este caso, Amazon SES) y el tipo de evento y contiene los datos pertenecientes al mensaje que pueden ser usados por la función. Al procesar un correo electrónico, el evento contendrá metadatos propios de un correo electrónico como asunto, remitente, fecha, etc…
Haciendo uso de los datos del evento y las capacidades de cómputo e integración de AWS Lambda (A través del SDK de AWS) es posible el procesamiento adicional de estos datos como, por ejemplo, su registro en una base de datos.
Amazon S3
Amazon Simple Storage Service (Amazon S3) es un servicio de almacenamiento de objetos que ofrece escalabilidad, disponibilidad de datos, seguridad y rendimiento líderes en el sector.
Al procesar un correo electrónico, se puede enviar este a un bucket de Amazon S3. Esto permite integrar las capacidades de almacenamiento a escala de Amazon S3 para guardar una gran cantidad de correos, necesario para soportar un alto volumen de correos entrantes que requieren traza y análisis, como los casos de uso considerados para este blog.
Hay dos consideraciones importantes al almacenar los correos en Amazon S3:
- El correo electrónico se almacenará sin procesamiento ni modificación en el formato Multipurpose Internet Mail Extensions (MIME)
- El tamaño máximo soportado es de 40MB, por lo que para almacenar correos más grandes puede ser necesario procesamiento previo mediante otros servicios como AWS Lambda.
Amazon SNS
Amazon Simple Notification Service (Amazon SNS) es un servicio de publicación-suscripción totalmente administrado para mensajería “Aplicación a aplicación” y “Aplicación a persona”.
La integración con Amazon SES consiste en la publicación del contenido y demás datos relevantes del email mediante una notificación de Amazon SNS. Esto le permitirá a su organización, por ejemplo, ser informada de los rebotes, los reclamos y las entregas de sus correos electrónicos. Es importante recordar que para esta publicación aplica un límite de tamaño de 150KB.
Amazon WorkMail
Amazon WorkMail es un servicio de correo electrónico y calendario empresarial seguro y administrado que soporta las aplicaciones cliente de correo para dispositivos móviles y de escritorio existentes.
Esta integración permitiría la entrega del correo desde SES hacía Amazon WorkMail, para tenerlo en un cliente de correo administrado con las ventajas de integración propias del servicio.
Procesando y visualizando los correos
Ahora: ¿Cómo se puede utilizar este servicio y sus integraciones para aumentar la capacidad de recepción y almacenamiento de correos electrónicos? Además del conocimiento de Amazon SES, es necesario entender el concepto de “SMTP Relay”.
“SMTP Relay”, en su definición más básica, se refiere a la transferencia de correos entre servidores. Usualmente, el servidor (o servicio) que termina siendo el intermediario para la transferencia actúa como un Mail Transfer Agent (MTA). Lo útil en este caso es que, usualmente, estos MTA no tienen límites de recepción/almacenamiento de la misma manera que lo hacen los buzones de entrada o clientes de correo, lo que favorece su uso para transferencia de altos volúmenes de correo electrónico.
Así, su organización podría pensar en ese servicio de correo que está generando problemas de límite de recepción/almacenamiento simplemente como un punto más del proceso de transferencia. A partir de ese servicio se pueden enrutar los correos a Amazon SES, que tendría la posibilidad de soportar la capacidad de recepción y almacenamiento requerida para estos correos.
Ahora, se debe pensar en cómo configurar Amazon SES para recepción de correo. A alto nivel, el proceso consiste en la autenticación del dominio de su organización en el servicio. Una vez se hace esto, se pueden empezar a configurar las reglas de recepción que permitan el procesamiento de los correos electrónicos. Se puede encontrar una guía más detallada acá.
Por ejemplo, se podría configurar una regla de recepción donde en primer lugar se almacene el correo electrónico en Amazon S3 y, posteriormente, se corra una segunda acción que use una función de AWS Lambda que nos permita registrar en una base de datos información relevante del correo como asunto, remitente y hora, así como el ID con el que se almacena en el bucket de Amazon S3.
Para la definición de las reglas y su consecuente uso es importante entender a mayor profundidad la integración con Amazon S3 y con AWS Lambda. Empezando por Amazon S3: al definir la regla de recepción de entregar al bucket de S3, el correo recibido se almacenará en el bucket definido con una llave de objeto predeterminada (que identifica de forma única el objeto en un bucket de Amazon S3).
En cuanto a AWS Lambda, es necesario analizar la estructura del evento que se usa para la invocación de la función (Completo acá). En este blog se hará hincapié en la sección “commonHeaders” y parte de la sección “mail”, aunque hay mucha más información que hace parte del evento:
Como se puede ver en este evento de ejemplo, a partir de estos campos del evento se puede sacar información valiosa para la referenciación de este correo después de su almacenamiento en un bucket de Amazon S3 (Destinatario, remitente, asunto, fecha). Algo importante a recalcar es que, si se utiliza una acción de función Lambda posterior a la acción de envío a un bucket de S3 como parte de la misma regla de recepción, el campo “messageId” corresponderá a la llave asignada al correo al almacenarse en el bucket de S3, lo que también permitiría tener referencia a su ruta de almacenamiento para su posterior consulta.
Contando con toda esta información, se puede pensar en el desarrollo de una solución como la que se ve en la siguiente arquitectura de referencia:
Está solución podrá recibir altos volúmenes de correo (1-2) y almacenarlos de forma segura y elástica en Amazon S3 (3). También será posible la ejecución de los comandos requeridos para su referenciación en una base de datos (4) pensando en una posterior consulta, por ejemplo, mediante una aplicación web.
Para lograr esta referenciación y consulta, contamos con una base de datos de Amazon DynamoDB: una base de datos NoSQL de clave-valor sin servidor y completamente administrada que está diseñada para ejecutar aplicaciones de alto rendimiento a cualquier escala. Esta base de datos nos permitirá almacenar información relacionada con el correo, así como la llave con la cual se almacena en Amazon S3 (5) para tener una referencia al contenido del correo.
Asimismo, tenemos AWS Amplify, una solución completa que permite a los desarrolladores web y móviles de front-end crear, enviar y alojar aplicaciones de pila completa en AWS de forma sencilla. AWS Amplify nos permitirá alojar una aplicación web que sirva como buscador de correos para la organización (8), que a su vez estará haciendo llamadas mediante una API REST (6) publicada en Amazon API Gateway, un servicio completamente administrado que facilita a los desarrolladores la creación, la publicación, el mantenimiento, el monitoreo y la protección de API a cualquier escala.
Esta API se puede integrar con una función Lambda encargada de hacer la búsqueda de un correo sobre Amazon DynamoDB, generar una URL prefirmada que autorice la descarga del correo desde la aplicación (7) y retornarla a la aplicación web para su uso.
Siguientes pasos
Como siguiente paso se recomienda analizar la factibilidad de las propuestas en este blog para su carga de trabajo. Esta solución puede adaptarse a los diferentes casos de uso de su organización alrededor de la recepción, almacenamiento y consulta de correos electrónicos de forma masiva.
Lo invito a acercarse a su equipo de cuenta o a comunicarse con AWS para conocer más sobre soluciones de este estilo, aterrizar la solución a su caso de uso y aprovechar las ventajas de la nube de AWS.
Sobre el autor
Camilo García es un Arquitecto de Soluciones en Amazon Web Services para el Sector Público en la región Andina. Camilo ha trabajado junto a clientes del sector Salud, Gobierno, Educación y Entidades sin ánimo de lucro apoyándolos en la consecución de sus metas mediante tecnologías en la nube. Le apasionan los temas de TI en las organizaciones, manejo de redes y diseño de sistemas resilientes.
Revisores técnicos
Nicolas Bolaños es un Arquitecto de Soluciones en Amazon Web Services para el Sector Público en Latinoamérica. Nicolás ha trabajado tanto con socios de negocio como clientes para las verticales de Salud, Gobierno, Educación y Entidades sin ánimo de lucro en su camino hacia la nube, así como modernización y optimización. Se especializa en el diseño de soluciones SaaS nativas en nube.
Felix Mendoza es un Ingeniero de Desarrollo de software para Simple Email Service (SES). Él y su equipo se especializan en el componente de envío de correos, con enfoque en mejorías de rendimiento del servicio, reducción de costos e integración con otros componentes.