Nota 1: Aquí está la demostración interactiva alojada: demo.saasconstruct.com
Nota 2: Mi factura mensual por cada configuración de SaaS es de 3 a 5 dólares al mes, y se trata principalmente de costos de CI/CD.
Nota 3: La plantilla está aquí: saasconstruct.com.
He realizado varias pruebas de concepto de IA y MVP en AWS, y siempre son cosas similares:
Entonces, pensé en crear una solución simple para iniciar este tipo de cosas en AWS. Y escribe una publicación de blog al respecto.
Decidí agregar algunas funciones, como pagos Stripe (y pagos LemonSqueezy si no quieres preocuparte por el impuesto sobre las ventas/IVA) y gestión de pagos, autenticación, alarmas de tráfico y otras. También pensé que tenía que ser configurable, como reemplazar API Gateway y AWS Lambda con ELB y ECS para tareas más largas.
Para empezar, elegí el marco más fácil declarado comúnmente. Es Vue y, hasta donde tengo entendido, el segundo marco más popular que existe. Lo elegí porque no sólo es el más fácil, sino que también tenía algo de experiencia con él.
El sitio web es una aplicación SPA estándar con Vite como herramienta de construcción. Para el estilo, uso Bootstrap porque también es muy fácil trabajar con él y también porque no causa mucho dolor al migrar de una versión del framework frontend a otra.
Hay dos opciones:
Elegí Amplify Hosting como su enfoque principal de AWS en soluciones de hosting frontend y porque es fácil de configurar, adjuntar un dominio, etc.
Dado que es un sistema de pago por uso, configuré una alarma de tráfico: si hay más de un cierto número de visitas cada 10 segundos, recibo una notificación.
El backend es API Gateway, que limita la velocidad, y AWS Lambda (Python), que realiza la lógica comercial y general:
También tengo otra función de AWS Lambda que crea un usuario en la base de datos después de registrarse en Cognito.
Hay utilidades compartidas donde coloco algunas funciones compartidas, por ejemplo, envío de correo electrónico. Además, la funcionalidad de registro, por ejemplo, se me envía un correo electrónico si hubo un error en el pago.
La autenticación es complicada, lo sé, y no quería utilizar un servicio de terceros. Así que me quedé con AWS Cognito. Es bastante barato.
Puede decir, simplemente use AWS Amplify Auth (que es un contenedor de AWS Cognito), pero tuve algunos problemas con él. Incluso escribí una publicación en Reddit:
Mi lista de problemas con Amplify para autenticación
Y hay otra publicación con una lista aún mayor de un usuario frustrado (aunque es una publicación antigua).
aquí
Además, si usas Amplify únicamente, te quedarás atrapado con todo el ecosistema sin posibilidad de cambiar algo. Por ejemplo, si desea tener acceso a la distribución de CloudFront (por ejemplo, cuando desea bloquear geográficamente ciertas regiones), mala suerte, no podrá verlo con Amplify Hosting. También tuve otros problemas: uno de los ejemplos fue la creación de CDK a partir de recursos de Amplify, lo cual fue un problema para mí.
Entonces, lo que hice fue un enfoque híbrido (que es algo popular según Reddit): la biblioteca AWS Amplify JS te permite importar recursos de la nube que creas tú mismo, como grupos de usuarios, así que los creé. con CDK y luego simplemente usé la biblioteca Amplify JS para la autenticación.
En este caso, siempre puedo cambiar lo que quiera, intercambiar recursos de la nube (por ejemplo, podría pasar de Amplify Hosting a CloudFront S3 si necesito acceso a la distribución de CloudFront).
AWS SES. Es el principal servicio de correo electrónico de AWS. Envía todo, incluidos correos electrónicos de autenticación de Cognito, solicitudes desde el formulario de contacto, etc. Lo único que debe comprender es que en su cuenta de desarrollo de AWS, primero deberá crear identidades verificadas para poder enviar (lo automaticé a través de IaC), y en la cuenta de producción de AWS, deberá solicitar acceso de producción (que es solo un par de clics).
Con AWS SES, las notificaciones por correo electrónico se envían en los siguientes escenarios:
DynamoDB como base de datos. Fácil, rápido y gestionado. Sí, tuve que pensar en los patrones de acceso, pero en general, es bueno trabajar con él y tampoco me cuesta nada mientras valido/construyo. Como planeo trabajar en varios productos y quiero mantenerlos aislados, no puedo poner RDS/DocumentDB en cuentas de desarrollo y producción por proyecto (cuesta demasiado).
Agregué dos sistemas de pago, y es posible elegir cuál usar porque funcionan de manera similar:
Hay puntos finales que escribí para los webhooks Stripe/LemonSqueezy, que manejan toda la lógica.
Así que hay muchas cosas para elegir:
Elegí AWS CDK y estos son mis motivos:
La razón por la que no elegí Terraform es que CDK es más fácil; Permite crear recursos de forma sencilla, al menos en mi opinión. Me gusta la programación orientada a objetos e intento construir mi infraestructura en la nube en consecuencia. Un gran beneficio es que se incluye CI/CD (canalizaciones CDK), por lo que no tengo que inventar eso.
Elegí canalizaciones CDK porque, nuevamente, es fácil. Simplemente conecte la canalización al repositorio de GitHub y estará listo. Git push a la rama de desarrollo -> se implementará en la cuenta de desarrollo. Git push to the main (o pull request) -> lanzamiento de producción.
He configurado la limitación de velocidad para evitar recibir spam a través de la puerta de enlace API. He configurado dos alarmas de CloudWatch:
También configuré alarmas de facturación para informarme si estoy a punto de gastar demasiado.
CloudWatch registra los eventos, puede verlos tanto en la consola de AWS como directamente en el IDE a través de extensiones.
La elección fue entre usar OpenAI (con modelos GPT) o AWS Bedrock (con modelos Claude). Esta decisión fue un desafío porque, si bien AWS Bedrock with Claude se integra fácilmente con AWS, OpenAI se usa con mayor frecuencia. Ambas empresas ofrecen modelos de IA de primer nivel. Por ahora, he decidido seguir con AWS Bedrock. Esto podría cambiar en el futuro, pero por ahora aprecio la simplicidad. Para la base de datos vectorial, uso Pinecone, que tiene índices sin servidor.
Un ejemplo de la aplicación de IA que creé aquí es un sistema RAG, que es esencialmente un chatbot que puede responder preguntas basadas en tus datos. Almacena información en una base de datos vectorial y, en la consulta, realiza una búsqueda de similitud y luego simplemente usa LLM para dar una respuesta basada en el resultado de esa búsqueda. Actualmente uso modelos simples para evitar costos, pero cambiar a diferentes modelos es tan simple como cambiar una línea de código.
Inicialmente fui desarrollador de Java, pero luego me convertí en desarrollador de Python porque desarrollé servicios de aprendizaje automático y aprendizaje profundo. La mayoría de las bibliotecas en ese espacio están desarrolladas en Python o cuentan con un contenedor de Python. Además, Python se integra perfectamente con AWS, ya sea en AWS Lambda (por ejemplo, utilizando la biblioteca AWS Lambda Powertools) o en CDK. Entonces, al final, tanto el backend como la infraestructura de la nube (a través de CDK) se implementan en Python.
Mi idioma secundario es TypeScript debido a su popularidad entre los frameworks frontend. Si bien solía trabajar con JavaScript, la ausencia de tipos me resultaba confusa a medida que el código base crecía. La escritura estática de TypeScript proporciona claridad y seguridad muy necesarias durante el desarrollo, especialmente en proyectos grandes.
Como no tengo una gran carga de tráfico, mis costos de AWS son muy bajos, normalmente $3-5 por mes, principalmente debido a los gastos de CI/CD.
La configuración incluye un CDN (proporcionado por Amplify Hosting) y una pequeña capa de almacenamiento en caché dentro de AWS Lambda. Además, algunos servicios se incluyen en la capa gratuita de AWS, lo que reduce aún más mis costos.
A medida que el producto crece y gana más usuarios, es posible que deba optimizar los recursos cambiando a DynamoDB aprovisionado e implementando DAX (DynamoDB Accelerator). Sin embargo, por ahora, esta configuración funciona perfectamente.
Esta solución satisface mis necesidades actuales de manera eficiente.
He incluido toda esta pila tecnológica como repetitivo (que desarrollo y actualizo activamente) en mi plantilla de AWS en SaaSConstruct.
Continuaré explorando funciones adicionales que se pueden incorporar a esta configuración para mejorar sus capacidades...
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3