AWS App Runner
从容器镜像或源代码自动构建、部署和扩展 Web 应用程序与 API 的全托管服务
概述
AWS App Runner 是一项全托管服务,可在无需基础设施知识的情况下部署和运维容器化的 Web 应用程序及 API。只需指定 ECR 中的容器镜像或 GitHub 仓库的源代码,即可自动完成构建、部署、TLS 终止、负载均衡和自动扩展的配置。当流量为零时,实例会缩减至最小数量;当请求增加时,会自动横向扩展。
与 ECS Fargate 和 Lambda 的选型标准
App Runner、ECSFargate 和 Lambda 都可以以无服务器方式运行容器或代码,但在抽象程度和可控性之间的权衡各不相同。App Runner 的抽象程度最高,完全无需关注 VPC 配置、负载均衡器设置、任务定义和服务发现等概念。非常适合快速部署 Web 应用程序或 REST API 的场景。ECS Fargate 比 App Runner 具有更高的可控性,可以在任务定义中精细配置容器的 CPU/内存、Sidecar 容器、卷挂载和健康检查。它还提供服务网格 (App Mesh)、服务发现 (Cloud Map)、蓝/绿部署 (CodeDeploy 集成) 等生产运维所需的功能。当存在微服务架构或复杂网络需求时,应选择 Fargate。Lambda 专注于事件驱动的函数执行,除 HTTP 请求外还支持其他触发器 (S3 事件、SQS 消息、定时调度)。但其执行时间上限为 15 分钟,不适合 WebSocket 或流式响应。选型参考:简单 Web 应用选 App Runner,正式微服务选 Fargate,事件驱动处理选 Lambda。
部署流水线与自动扩展机制
App Runner 的部署源有两种:ECR 容器镜像和 GitHub 仓库。使用 ECR 源时,可以设置在镜像推送时自动触发部署,只需在 CI/CD 流水线中将镜像推送到 ECR 即可完成部署。使用 GitHub 源时,App Runner 会自动构建源代码并进行部署。支持 Python、Node.js、Java、Go、.NET、Ruby、PHP 运行时,通过 apprunner.yaml 定义构建命令和启动命令。自动扩展基于并发请求数运作,当单个实例的最大并发请求数 (默认 100) 被超过时会触发横向扩展。将最小实例数设为 1 时,即使流量为零也会保持 1 个实例常驻运行,从而避免冷启动。最小实例数不能设为 0,如果需要完全零缩放,请考虑使用 Lambda。部署时会自动执行滚动更新,通过健康检查的新版本会接管流量。
VPC 连接与私有资源访问
App Runner 默认拥有公共端点,但通过配置 VPC 连接器,可以访问 VPC 内的私有资源 (RDS、ElastiCache、DocumentDB 等)。VPC 连接器在 App Runner 服务与 VPC 之间建立网络连接,通过指定的子网和安全组到达私有资源。需要注意的是,配置 VPC 连接器后,App Runner 的所有出站通信都将经过 VPC,因此访问互联网需要 NAT Gateway,这会产生额外费用。对于调用外部 API 的应用程序,需要事先进行成本估算。对于入站流量,可以使用 App Runner 的私有端点功能构建仅从 VPC 内部可访问的内部服务。适用于不希望暴露到互联网的内部管理界面或微服务间通信。费用按预置实例的 vCPU 和内存的时间计费,活跃请求处理期间按正常费率计费,空闲时按较低的待机费率计费。