Backend de administracion (Parte 1 de un millon)
Con esta cruzada de querer armar el blog desde 0, obviamente tuve que tambien programar el Backend.
Y porque no le pusiste un Wordpress?
Porque, justamente, la gracia era practicar un poco la full experience: Frontend, Backend, Deployment y CI/CD. En sistemas, cocodrilo que se duerme es cartera: siempre hay que practicar, y como mi laburo actual ni siquiera toco AWS, no queria que los conocimientos se oxidaran. Asi que, ahi vamos para contar un poco como esta armado el backend (por si no se dieron cuenta, me siento mucho mas comoda en el Backend que en el Frontend)
Empecemos por lo primero: como esta armada la arquitectura?
Esto es muy basico: es un blog, no vamos a lanzar cohetes al espacio. Entonces, la primera pregunta es: Serverless o Hosted? En mi caso, por el trafico que va a tener mi app, Serverless es perfecto: no tengo que preocuparme por containers, mantenimiento de servidores, backups, etc: AWS lo hace por mi.
La idea es hacer Lambdas para cada API que necesite. El soporte de AWS para .NET es bastante....... rustico (aunque esta mejorando!), entonces tengo un par de Lambda functions creadas
- API Publica
- API Admin
- Lambda Auth
Cada Lambda es una Minimal API de .NET con FastEndpoints encima (que gran libreria! la recomiendo ampliamente). La funcion corre bajo un rol que tiene los permisos correspondientes hacia los recursos de AWS (por ej, la API publica solo tiene permisos de read de los buckets y de las tablas de DynamoDb). Todas las API tienen un grupo de logs en Cloudwatch para loguear lo que pasa.
Una vez que tenemos unit e integration testings, que es lo siguiente? Bueno, vamos a agrupar todo en API gateway:
- API Gateway publico
- API Gateway admin
Porque no usar directamente function URLs? Si bien podria (le pones hasta poner dominios y certificados), yo no tenia ganas de renegar con la autenticacion de forma manual, y me parece horrible usar IAM para manejar usuarios en internet, entonces, al poner una API Gateway, puedo dejar que una funcion (en este caso la de Auth) se encargue de hablar con Cognito para darme los tokens JWT para la administracion.
La API publica no tiene seguridad, pero la API gateway tambien me ayudo a configurar CORS (eso sera un post aparte, QUE COMPLICADO hacer andar eso! Seguramente estoy haciendo algo mal/mas complicado de lo que tiene que ser, pero bueno).
Entonces, volviendo a nuestras API Gateway, la de admin tiene un dominio asignado, con un certificado SSL, y tiene un path especial para la parte del login. Y los endpoints del admin todos requieren la autenticacion. De esta forma, todo queda asegurado a ese nivel, y no tengo que preocuparme a nivel de .NET. Si quisiera agregar un layer mas de permisos, ahi tendria que codificar un poco para poder conseguir los claims en base al token, etc. Pero es un blog y lo uso yo sola, it's good enough 😅 .
Si tuviera que hacer esto manualmente por cada entorno, me largo al llorar antes de intentarlo. Y por eso, usamos (y me pongo de pie): Pulumi. Si bien tiene sus cositas, realmente es un antes y despues para armar los entornos. Tenemos toda la infra definida ahi (includos dominios, certificados, los lambda, permisos, buckets, todo) y podemos generar nuestra infra desde 0, o ir metiendo cambios de forma progresiva.
Yo tengo dos entornos: sandbox y produccion. En mi caso no tenia sentido mas. Todos los cambios los voy haciendo en Sandbox y despues paso a Produccion. Cada entorno es una organizacion dentro de mi cuenta de AWS, para poder separar los recursos (no usen una sola cuenta mezclando entornos!).
Las imagenes estan hosteadas en buckets de S3, que tienen una distro de Cloudfront adelante para poder usar un dominio para mostrarlas. Desde la administracion se pueden subir las imagenes sin mayores problemas (de nuevo, la administracion solo tiene permisos para escribir y leer el bucket, y la publica, solo para leer). Es importante siempre poner el minimo set de permisos en AWS para mitigar cualquier problema!
Y cuanto costo todo esto? Cuanto sale esto? Bueno, digamos que es practicamente gratis: estoy pagando 0.50 USD por cada zona hosteada (sandbox y prod), asi que ahi tenemos 1 USD. DynamoDb es gratis (no tengo casi datos en las tablas). Lambda es gratis (estoy muy abajo de los millones de requests a partir de los que empiezan a cobrar). API Gateway es gratis tambien. Los certificados? Gratis. El bucket? Centavos, no se, deben ser 0.0005 USD o algo asi por el espacio ocupado.
Como siempre, todo depende de cuanto piensen escalar: en mi caso, esto me recontra sobra. Si van a hacer un reddit, probablemente el billing los reviente con esta arquitectura, pero para mi, era perfecto.
Si tienen alguna duda, pueden mandarme un mensajito a mi cuenta de X/Twitter (todavia no hay soporte para comentarios, pero esta en el roadmap): https://x.com/peorth 🙂
Comentarios Recientes
No hay comentarios, porque no dejás alguno?

Deja un comentario
