Simplificación del despliegue de contenedores - Despliegue sin configuración con AWS App Runner

Explicamos el método de despliegue de aplicaciones web en contenedores con AWS App Runner. Presentamos de forma práctica la diferenciación con ECS/Fargate, el auto-escalado, la integración con VPC y la conexión con pipelines CI/CD.

Posicionamiento de App Runner y desafíos del despliegue de contenedores

Al desplegar aplicaciones web en contenedores en AWS, tradicionalmente se utilizaban ECS (Elastic Container Service) o EKS (Elastic Kubernetes Service). Sin embargo, estos servicios requieren configurar numerosos recursos como gestión de clústeres, definiciones de tareas, definiciones de servicios, balanceadores de carga, grupos de destino y grupos de seguridad, demandando conocimientos de infraestructura. AWS App Runner, lanzado en 2021, es un servicio de aplicaciones de contenedores completamente gestionado que abstrae completamente esta complejidad. Con solo especificar un repositorio de código fuente (GitHub) o una imagen de contenedor (ECR), App Runner procesa automáticamente la compilación, el despliegue, el escalado, el balanceo de carga y la terminación TLS. Los desarrolladores pueden concentrarse en el código de la aplicación y desplegar en producción sin conocimientos de infraestructura, siempre que tengan un Dockerfile.

Métodos de despliegue y configuración de origen

App Runner soporta 2 tipos de origen. El primero es el origen de imagen de contenedor, donde se especifica una imagen de ECR (público o privado). También es posible configurar el despliegue automático al detectar un push de imagen a ECR. El segundo es el repositorio de código fuente, donde se conecta un repositorio GitHub y App Runner ejecuta de forma consistente desde la compilación hasta el despliegue. Se proporcionan runtimes gestionados para Python y Node.js, funcionando solo con especificar los comandos de compilación e inicio sin necesidad de buildspec.yml. ```yaml # Definición de servicio App Runner en CloudFormation Resources: AppRunnerService: Type: AWS::AppRunner::Service Properties: ServiceName: my-web-app SourceConfiguration: AuthenticationConfiguration: AccessRoleArn: !GetAtt AppRunnerAccessRole.Arn AutoDeploymentsEnabled: true ImageRepository: ImageIdentifier: !Sub '${AWS::AccountId}.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest' ImageRepositoryType: ECR ImageConfiguration: Port: '8080' RuntimeEnvironmentVariables: - Name: NODE_ENV Value: production InstanceConfiguration: Cpu: '1024' Memory: '2048' ``` En la configuración de instancia se selecciona una combinación de vCPU (0.25 / 0.5 / 1 / 2 / 4) y memoria (0.5 a 12 GB). A diferencia de ECS Fargate, donde es necesario configurar individualmente la definición de tarea, definición de servicio, ALB, listener y grupo de destino, con una sola definición de recurso se completa el despliegue.

Integracion con GitHub y despliegue desde codigo fuente en la practica

Con el despliegue basado en codigo fuente, se conecta un repositorio GitHub y App Runner construye automaticamente una imagen de contenedor a partir del codigo y la despliega. Los runtimes gestionados compatibles incluyen Python, Node.js, Java, Go y .NET: al seleccionar uno de estos, el despliegue se completa sin necesidad de escribir un Dockerfile. Colocando un archivo apprunner.yaml en la raiz del repositorio, se pueden definir declarativamente los comandos de compilacion, comandos de inicio, versiones de runtime y variables de entorno, permitiendo gestionar la configuracion de infraestructura junto con el codigo bajo control de versiones. La integracion con GitHub ofrece la opcion de despliegue automatico o manual. Con el despliegue automatico habilitado, los push a la rama especificada activan automaticamente compilaciones y despliegues, eliminando la necesidad de construir un pipeline CI/CD separado. Con el despliegue manual, se activan los despliegues explicitamente desde la consola o la API. El costo de compilacion automatica es de aproximadamente 0.005 dolares por minuto, por lo que los repositorios con push frecuentes deben considerar la acumulacion de cargos de compilacion.

Dominios personalizados y observabilidad

La configuracion de dominios personalizados se completa ingresando el nombre de dominio en la consola y agregando un registro CNAME en el proveedor DNS (Route 53 o un servicio DNS externo). Un certificado ACM (AWS Certificate Manager) se emite y renueva automaticamente, habilitando el acceso HTTPS en el dominio personalizado. Al utilizar conectores VPC se crean ENIs (Elastic Network Interfaces), por lo que las subredes especificadas deben tener suficiente espacio de direcciones IP disponible. En cuanto a observabilidad, habilitar el rastreo con X-Ray permite visualizar trazas distribuidas de latencia y errores de las solicitudes. Los registros de acceso y de aplicacion se envian automaticamente a CloudWatch, con metricas que registran conteos HTTP 2xx/4xx/5xx y tiempos de respuesta. Los health checks se pueden configurar con ruta HTTP o TCP, y las instancias con problemas se reemplazan automaticamente.

Auto-escalado y estructura de costos

App Runner proporciona auto-escalado basado en el número de solicitudes como estándar. En la Auto Scaling Configuration se puede configurar el umbral de solicitudes concurrentes (predeterminado 100), el número mínimo de instancias (1 a 25) y el número máximo de instancias (máximo 25). Cuando el tráfico disminuye, las instancias se reducen automáticamente hasta el número mínimo. Con la función de pausa (Pause) se pueden reducir las instancias a cero, facturándose solo el costo de memoria. La estructura de precios es de 0.064 USD/hora por vCPU y 0.007 USD/hora por GB de memoria. Las instancias activas se facturan por vCPU + memoria, mientras que las instancias aprovisionadas (en espera) solo se facturan por memoria. Por ejemplo, con una configuración de 1 vCPU / 2 GB de memoria funcionando 730 horas al mes, el costo es de aproximadamente 56.9 USD/mes. La configuración equivalente de ECS Fargate (1 vCPU / 2 GB) es de aproximadamente 44.3 USD/mes, pero como App Runner no requiere ALB (desde aproximadamente 22.3 USD/mes), para servicios pequeños App Runner puede ser más ventajoso en costo total.

Integración con VPC y seguridad

App Runner proporciona un endpoint público por defecto, pero usando un conector VPC se puede acceder a recursos dentro de subredes privadas (RDS, ElastiCache, endpoints VPC de DynamoDB, etc.). El conector VPC se crea especificando subredes y grupos de seguridad, y se asocia al servicio App Runner. Solo el tráfico de salida pasa por la VPC, mientras que el tráfico de entrada sigue siendo recibido por el endpoint gestionado de App Runner. Con la integración de WAF (Web Application Firewall), se puede asociar una WebACL de WAF al endpoint de App Runner para aplicar reglas de seguridad como restricciones de IP y límites de tasa. La integración con Secrets Manager y Systems Manager Parameter Store permite gestionar de forma segura credenciales de bases de datos y claves API, inyectándolas como variables de entorno. También se proporcionan como estándar el control de acceso con IAM, la monitorización de métricas con CloudWatch (número de solicitudes, latencia, códigos de estado HTTP) y la salida de registros de aplicación a CloudWatch Logs. Para ampliar conocimientos sobre tecnología de contenedores, los libros especializados en Amazon también pueden ser útiles.

Diferenciación con ECS/Fargate

App Runner y ECS/Fargate ejecutan cargas de trabajo de contenedores, pero los casos de uso objetivo difieren. App Runner está especializado en aplicaciones web y API basadas en HTTP/HTTPS, con escalado basado en solicitudes como estándar. Por otro lado, ECS/Fargate soporta una amplia gama de cargas de trabajo como procesamiento por lotes, procesos worker, gRPC, WebSocket y patrones sidecar. Los criterios de selección son los siguientes. Se debe elegir App Runner cuando se desea desplegar rápidamente aplicaciones web o API HTTP/HTTPS, cuando se quiere minimizar la gestión de infraestructura, o cuando el equipo tiene poca experiencia en orquestación de contenedores. Se debe elegir ECS/Fargate cuando se necesitan contenedores sidecar o service mesh, cuando se usan protocolos TCP/UDP, cuando se necesita control fino de estrategias de colocación de tareas o proveedores de capacidad, o para cargas de trabajo no HTTP como procesamiento por lotes o workers de cola. EKS se elige cuando se necesita compatibilidad con el ecosistema Kubernetes o cuando se prioriza la portabilidad de cargas de trabajo en una estrategia multi-nube. App Runner es una capa de abstracción más alta construida sobre ECS/Fargate, siendo un trade-off entre flexibilidad de control y simplicidad. Elastic Beanstalk también ofrece despliegue simplificado, pero los recursos subyacentes de EC2 y ALB son visibles y gestionables, ofreciendo mayor personalización a costa de más recursos operativos. Cuando se desea prescindir de Dockerfiles, configuración CI/CD y configuración de VPC/ALB, App Runner es la opción óptima.

Resumen - Directrices de uso de App Runner

AWS App Runner es un servicio para desplegar y operar aplicaciones web en contenedores con configuración mínima. Con solo especificar código fuente o imagen de contenedor, se configuran automáticamente la compilación, el despliegue, TLS, el balanceo de carga y el Auto Scaling. También cuenta con funciones necesarias para operación en producción como acceso a recursos privados mediante conector VPC, refuerzo de seguridad con integración WAF y gestión de credenciales con Secrets Manager. Comparado con ECS/Fargate tiene menor flexibilidad de control, pero como no requiere configuración de ALB ni grupos de destino, es ventajoso tanto en costo total como en carga operativa para aplicaciones web de pequeña a mediana escala. Como primer paso en el despliegue de contenedores o como medio para publicar prototipos rápidamente, App Runner es una opción sólida.