Empezando con AWS
IAM, EC2, RDS, S3, CloudFront y Lambda

Como expliqué en la anterior entrada, mi propósito era empezar con AWS. Para tener una guía con la que empezar he seguido este video de midudev. Tras crearme la cuenta, lo primero ha sido acceder a IAM (Identity and Access Management), crear un usuario distinto de root y otorgarle los permisos necesarios para poder operar con él; lo segundo, establecer límites de presupuesto y alertas. Amazon te proporciona varios servicios gratis durante los primeros seis meses y te da 140 dólares de crédito; aún así he puesto límites muy por debajo de esos 140$ que disparan el envio de un correo electrónico cuando son superados para ser consciente de los créditos que estoy gastando y meterme en la piel de un administrador. Hecho esto, empezamos con los servicios propiamente dichos.
EC2
EC2 es el servicio de AWS que permite crear máquinas virtuales en la nube. En mi caso, lo he usado solo para hacer una primera prueba: crear una instancia, ver las opciones básicas de configuración como el sistema operativo, tipo de máquina, clave de acceso o reglas de red, conectarme desde mi consola con SSH y, tras ver que funciona, borrar la instancia inmediatamente después. La idea aquí no era desplegar nada todavía, sino entender el flujo mínimo para levantar un servidor en AWS sin dejar recursos consumiendo crédito innecesariamente.
RDS
RDS es el servicio de bases de datos gestionadas de AWS. Igual que con EC2, lo he utilizado únicamente como toma de contacto: crear una instancia, ver cómo se configura el motor de base de datos, las credenciales, la conectividad y las opciones básicas de administración, y eliminarla después. La principal diferencia frente a instalar una base de datos manualmente en un servidor es que AWS se encarga de buena parte de la gestión operativa del servicio.
S3 y Cloudfront
Como expliqué en los anteriores artículos, el primer dominio que compré fue un .click, pero después decidí migrar la página principal a un .xyz y reservar el primero para pruebas. Hasta ahora había dejado ambos dominios operativos en mi servidor personal, con dos archivos distintos de nginx en la ruta /etc/sites-available y sus correspondientes enlaces simbólicos en /etc/sites-enabled: uno para servir pabloquiros.xyz y otro para servir pabloquiros.click. Sin embargo, he borrado la configuración de nginx asociada al .click con la intención de dejar de servir ese dominio desde mi propio servidor y pasar a servirlo desde AWS. Para ello he usado dos servicios: S3 (Simple Storage Service) y CloudFront, la CDN de AWS.
Lo primero que hay que hacer es crear un bucket en S3 en el que se subir los archivos estáticos de mi página web, también he activado la opción de alojamiento de sitios web estáticos, que lo hace todo más sencillo. Una vez dados los permisos correspondientes y ver que se podía acceder a mi página web alojada en AWS, he modificado el upload.yml de mi página web para añadir dos steps inmediatamente después del despliegue en mi servidor personal que actualizan los archivos en S3:
# AWS S3 Sync for backup and CDN
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Sync files to S3
run: |
aws s3 sync ./public s3://${{ secrets.S3_BUCKET }} --delete
En ese momento la web ya estaba disponible, pero solo a través de la URL que proporciona AWS para el alojamiento estático del bucket. Esto sirve para comprobar que todo funciona, pero no es la forma ideal de exponer una página pública con dominio propio. El bucket está en una región concreta de AWS y el usuario accede directamente a ese origen. Ahí es donde entra CloudFront, el CDN de AWS. CloudFront se coloca delante del origen, cachea el contenido en distintas edge locations para así poder servirlo desde ubicaciones más cercanas al usuario, reduciendo latencia y evitando que todas las peticiones tengan que ir directamente contra S3. Además, CloudFront permite gestionar mejor el acceso por HTTPS y asociar un dominio propio a la distribución. Para ello es necesario crear un certificado en AWS Certificate Manager que nos permita acceder a pabloquiros.click mediante HTTPS. AWS valida ese certificado mediante DNS, así que he tenido que añadir en Cloudflare una entrada CNAME específica con el nombre que me dio AWS. Una vez validado el certificado, el dominio puede apuntar a CloudFront y la web queda accesible desde pabloquiros.click con conexión segura.
Importante: Durante la configuración de CloudFront, una de las opciones que te daban en el formulario era activar el AWS WAF para probar las capacidades de protección de aplicaciones web. Es una herramienta válida para entornos empresariales, pero su coste fijo es altísimo, lo que por suerte descubrí cuando me saltó la alarma. Pagué la primada en forma de dólar y medio en créditos que podría haberme ahorrado, es muy poco pero me sirve para estar atento a estas cosas. Incluso teniendo alarmas puestas, conviene revisar regularmente la página de precios y el impacto en Cost Explorer.
AWS Lambda
El último servicio que cubre el vídeo de midu y el que más interesante me ha resultado es AWS Lambda, que permite ejecutar funciones sin tener que administrar servidores. Charlando con ChatGPT le he preguntado si en un servicio como AWS Lambda una variable global tendría sentido (yo entendía que no) Tú subes una función, defines cuándo se ejecuta y AWS se encarga de levantar la infraestructura necesaria y Chat me ha explicado aunque Lambda sea serverless, eso no significa que cada ejecución empiece siempre desde cero. AWS puede reutilizar el entorno de ejecución entre llamadas, por lo que una variable global podría conservar su valor durante varias invocaciones… pero esto es algo que no es seguro y para lo que habría que hilar muy fino: esto excede el ámbito de mi competencia así que lo dejaré estar.
Para cerrar esta primera toma de contacto con Lambda he creado un “Hello World” para el que he configurado la URL de la función y poder hiperenlazarla desde aquí. Había pensado algo un poco más interesante: una función que devolviese al usuario el país desde el que está realizando la petición. De nuevo comentándolo con ChatGPT, surgió una idea bastante elegante. En lugar de consultar una API externa de geolocalización, podría colocar la Lambda detrás de CloudFront y aprovechar las cabeceras geográficas que este añade automáticamente a las peticiones. De esta forma la función podría conocer el país de origen del visitante utilizando información proporcionada directamente por la infraestructura de AWS. Pero todo esto, además de investigar otro tipo de desencadenadores y destinos de la función, lo dejaré para el siguiente artículo.

