Los contenedores también pueden funcionar sin servidor, al menos hasta cierto punto. Decidí probar Fargate y ver lo fácil que es implementar una aplicación web mientras aprendo sobre sus ventajas y la experiencia de los desarrolladores.
En esta publicación, aprenderá a crear un clúster de Fargate ECS con un balanceador de carga de aplicaciones y una aplicación web mediante el código CDK de Python. Crearemos un clúster seguro y de nivel de producción que supere las herramientas de escaneo de seguridad como CDK-nag y aloje una aplicación web ChatBot que se conecte a OpenAI.
Puedes encontrar el repositorio completo de GitHub implementable aquí .
*Si encuentra alguna configuración incorrecta o errores, hágamelo saber .
Tabla de contenido
Introducción rápida a AWS Fargate
Puedes crear una aplicación web en Lambda, App Runner, EC2, ECS o EKS. En esta publicación, nos centraremos en ECS y las aplicaciones web en contenedores.
Para implementar una aplicación web en contenedores, necesita un clúster ECS y un balanceador de carga de aplicaciones que dirija el tráfico hacia él.
AWS Fargate es un servicio que lleva los servicios de contenedorización, ya sea ECS o EKS, al siguiente nivel. Agrega otra capa de abstracción y facilidad de gestión.
AWS Fargate es una tecnología que puede utilizar con Amazon ECS para ejecutar contenedores sin tener que administrar servidores o clústeres de instancias de Amazon EC2. Con AWS Fargate, ya no tiene que aprovisionar, configurar ni escalar clústeres de máquinas virtuales para ejecutar contenedores. - Documentación de AWS
No necesita pensar en los tipos de máquinas EC2, administrarlas, instalar actualizaciones de seguridad o administrar su escalabilidad hacia arriba o hacia abajo; todo se hace por usted. AWS afirma que es un servicio sin servidor; sin embargo, en mi opinión, es "casi" sin servidor ya que, como verá en los ejemplos de código, aún necesitamos crear VPC y pagamos por el servicio incluso cuando está inactivo y ningún cliente accede a nuestro clúster. Sin embargo, sigue siendo una abstracción bendita y estoy de acuerdo con la siguiente declaración de AWS:
Con AWS Fargate, puede centrarse en crear aplicaciones y gestionar menos: documentación de AWS
Gestionarás menos, pero pagarás más, así que tenlo en cuenta. Si no tienes problemas con la gestión de la infraestructura y las máquinas EC2, puedes usar clústeres ECS sin Fargate, lo que te costará tiempo del equipo de DevOps/infraestructura.
Creación de una aplicación web de chatbot sin servidor en Fargate
Escribiremos una construcción de CDK que implementará un clúster ECS administrado por Fargate que ejecuta una aplicación web con un balanceador de carga de aplicaciones que enruta el tráfico hacia él. Compré un dominio personalizado y creé un certificado, pero no es obligatorio.
Toda la solución será segura y auditada con configuraciones de nivel de producción. Usé CDK-nag para escanear la salida de CloudFormation de mi CDK y asegurarme de que no faltara ninguna configuración de seguridad o auditoría importante.
La aplicación web será un chatbot simple (sí, uno de esos) que potencia OpenAI. El chatbot es un contenedor de tareas ECS que ejecuta una aplicación Streamlit basada en Python.
Streamlit , una herramienta de código abierto, me permitió crear una interfaz de chatbot con menos de 10 líneas de código. Está diseñada para gestionar sesiones y respuestas de usuarios en el backend y, al mismo tiempo, ofrece una interfaz de usuario atractiva en el frontend.
Como nota al margen, el código CDK puede implementar cualquier aplicación web, no solo un chatbot.
Arquitectura de alto nivel
Repasemos la arquitectura de nuestra solución Fargate a continuación.
AWS Fargate administrará el balanceador de carga de aplicaciones y un clúster de ECS. El clúster de ECS se implementa en una VPC en dos zonas de disponibilidad y crea contenedores de tareas de ECS (el contenedor de aplicaciones web) con sus grupos de seguridad. La imagen del contenedor se carga en ECR .
Fargate también crea un balanceador de carga. Tiene AWS WAF para protegerlo con un depósito S3 que registra los datos de tráfico y otro depósito que rastrea el acceso al primer depósito S3.
También creamos un dominio personalizado de Route53 y registros DNS que apuntan a la dirección pública de ALB.
Repasemos el código CDK y el código de la aplicación web.
Código CDK
Hay mucho código, así que sigue mis comentarios.
En la línea 19, obtenemos un objeto WAF (consulte su definición aquí ) y activos de red. Los activos de red son el dominio personalizado y su certificado. Tenga en cuenta que son opcionales. Su definición está aquí .
En las líneas 25 a 31, creamos la imagen de Docker de ECR para la imagen del contenedor de nuestra aplicación web. CDK ejecutará Docker y esperará un Dockerfile en el directorio que le proporcionamos. Más sobre esto más adelante.
En las líneas 34 a 78, definimos una VPC para nuestro clúster ECS. Fargate no es "verdaderamente" sin servidor; aún debemos usar VPC como ECS normal. También habilitamos flujos de VPC y todos los permisos necesarios (sí, es mucho código solo para registros).
En la línea 81, definimos el clúster ECS y habilitamos Container Insights . Aquí hay muchas partes móviles, por lo que debemos habilitar tantos registros y métricas como sea posible para depurar problemas.
En las líneas 35 a 51, definimos la definición de la tarea Fargate. Observe que no seleccionamos los tipos de máquinas EC2. En cambio, definimos la cantidad de memoria y CPU virtuales que necesitamos. Fargate encontrará los tipos de máquinas adecuados según sus estrategias rentables (puede controlarlas y agregar también instancias Spot capacity provider ). En la línea 42, seleccionamos la plataforma ARM64, ya que uso una computadora portátil basada en ARM para crear la imagen de Docker.
En las líneas 84 a 103, definimos el contenedor utilizado en la tarea ECS. Configuramos la imagen de Docker y habilitamos el registro para el contenedor. Nuevamente, otro tipo de registro que deberíamos habilitar para ayudar a depurar la aplicación web.
En la línea 103, establecemos el puerto abierto del contenedor en 8501, que es el predeterminado para Streamlit como nuestra aplicación web.
Pasemos al ALB y otras configuraciones de preparación para la producción.
En las líneas 105 a 129, creamos los depósitos S3 para ALB y los registros de acceso a los depósitos; habilitamos las configuraciones de seguridad recomendadas.
En las líneas 132 a 163, definimos la tarea ALB de Fargate. Crea un servicio ECS con nuestra definición de tarea (y contenedor) y configura un ALB que maneja el enrutamiento a esos contenedores. Le proporcionamos el certificado y la zona hospedada creada en la construcción de activos de red. No configuramos una IP pública; habilitamos la redirección HTTP a HTTPS. Se recomiendan funciones avanzadas, como disyuntores, para detectar fallas durante la implementación e iniciar una reversión a un estado estable anterior.
En las líneas 154 a 160, agregamos permisos de IAM al proceso en ejecución en el contenedor. En nuestro caso, necesitamos acceder al administrador de secretos para obtener la clave API de OpenAI que se almacenó allí.
En la línea 166, habilitamos WAF ACL en nuestro ALB para mayor seguridad.
En las líneas 172 a 182, le indicamos a Fargate cómo y cuándo escalar su servicio. Proporcionamos umbrales de CPU y memoria.
Por último, la línea 184 habilita los controles de estado en nuestra aplicación web. Streamlit proporciona compatibilidad con puntos finales de control de estado en la ruta '/healthz'.
Puedes encontrar el archivo completo en este repositorio .
Código de aplicación web y Dockerfile
Empecemos con el Dockerfile.
Cuando ejecute CDK Deploy, este utilizará este Dockerfile para crear y cargar una imagen ECR. Requiere que el archivo requirements.txt se encuentre en la misma carpeta. También requerimos app.py de nuestra aplicación web.
Lo creé automáticamente ejecutando el siguiente comando:
poetry export --without=dev --format=requirements.txt > cdk/service/docker/requirements.txt
Repasemos el archivo a continuación:
En cuanto al código de la aplicación web, se basa principalmente en este ejemplo con código agregado que obtiene el secreto de la clave API de OpenAI de Secrets Manager.
Si observas detenidamente la línea 21, verás que realicé una "ingeniería de indicaciones" sencilla y le pedí al bot que respondiera cada pregunta con un contexto predefinido. Obviamente, no se trata de un bot de chat optimizado ni bueno, sino solo de una prueba de concepto. La idea principal era aprender a implementar una aplicación web de Fargate.
Implementemos el código y veámoslo en acción.
Resultado de la implementación
Una vez implementado, accederá a la URL y será recibido por esta interfaz de chatbot.
Le pregunté si Ran, el constructor, prefería K8s o sin servidor y obtuve una respuesta bastante razonable.
Resumen
En esta publicación, aprendimos un poco sobre Fargate. Creamos un chatbot en Fargate ECS y mejoramos su seguridad y las mejores prácticas de auditoría mediante CDK. Puede usar este código como plantilla e implementar cualquier aplicación web.
Revise este código y verifique que no haya errores de configuración ni problemas de seguridad. Además, asegúrese de agregar los paneles y alertas de CloudWatch de la misma manera que lo hice para mi servicio sin servidor (consulte esta publicación ).
Si encuentra algún problema de seguridad, comuníquese conmigo .