AWS App Runner是为那些只想无忧无虑地运行其容器的人提供的服务。在这篇文章中,我们将学习如何使用这个比ECS和Fargate简单得多的替代方案,探索它在竞争对手中的表现,当然还有如何用Semaphore持续部署软件。
App Runner是运行你的容器化应用程序的正确解决方案吗?
什么是App Runner
AWS App Runner于2021年5月推出,是一种用于云的管理容器服务。它的主要用例是网络应用程序和API。像它的表亲DigitalOcean App Platform、Heroku或Google Cloud Run一样,AWS不希望你在使用其服务时担心扩展或基础设施。
在幕后,App Runner在亚马逊ECS Cluster和Fargate上运行,以执行你的容器。但你不需要对这两项服务有任何了解就可以使用App Runner。

App Runner的特点
AWS在为开发者提供便利方面做了很多努力,特别是对于那些不需要强大基础设施的小规模项目,它有:
- 简单的自动缩放:随着需求的变化,在可配置的最小和最大限制之间,实例被启动和停止。
- 负载平衡:该服务包括一个透明的、不可配置的负载平衡器。
- 启用SSL:你为你的所有应用程序获得HTTPS端点,并有AWS管理的证书。你不需要发行或更新证书。
- 构建服务:你可以推送你自己的图像或让AWS从代码中为你构建。
- 持久性URL:该服务为每个环境分配随机生成的URL。你可以选择将它们映射到你自己的域上。
App Runner可以在两种模式下运行。在构建模式下,AWS从GitHub拉取代码,并在每次更改时构建应用程序。在容器模式下,它从公共或私有的AWS ECR注册处部署Docker兼容的镜像。

App Runner操作模式
构建模式听起来很好,直到你意识到只支持Python和Node.js运行模式(你可以在App Runner路线图上要求更多语言)。此外,AWS还收取每一次构建的费用。鉴于这些限制,我们将暂时忽略这种模式,而是使用Semaphore CI/CD来构建镜像。
App Runner与其他容器产品的比较
与AWS Lambda相比,App Runner不会将你锁定在亚马逊的生态系统中,因为生成的镜像可以在所有的云提供商中使用。从资源上看,App Runner给你更多的工作机会。你最多可以使用2个vCPU和4GB的内存。没有请求时间限制。
App Runner在AWS ECS和Fargate的基础上运行。与它们相比,App Runner要容易得多,但你会失去一些更精细的配置选项。另外,App Runner的成本估算要简单得多--AWS每秒钟改变一个固定的CPU和内存费用。

像所有其他服务一样,容器是临时的。你可以通过将你的容器与S3、DynamoDB或AWS RDS中的关系数据库连接来增加持久性。
亚马逊EKS是一个完全不同的野兽。它是一个受管理的Kubernetes服务,当你发现你需要更多的高级功能,如网络或结合多个容器时,你可以发展到这个服务。你可以通过我们的免费电子书了解所有关于Docker和Kubernetes的信息。CI/CD for Docker and Kubernetes。
与Google Cloud Run不同,你不能将App Runner实例减少到零;你必须在服务激活时为至少一个实例付费。然而,你可以在任何时候暂停服务以停止收费。
用AWS App Runner运行你的应用程序
除了AWS账户外,你还需要一些东西来配置AWS App Runner上的新服务:
- 一个Semaphore账户来设置CI/CD。
- 最新版本的copilot,AWS管理容器的官方工具。你还需要AWS命令行界面。
- Docker Desktop或Docker CLI来构建第一个镜像。
- Git和一个GitHub账户,你将用它来分叉和克隆这个hello-world示例仓库。
设置一个新的App Runner应用是一个三步走的过程:
- 初始化应用程序
- 创建生产环境
- 构建并推送镜像到ECR
运行copilot init ,在8080端口创建应用程序和一个服务端点。我们将应用程序称为 "hello",服务称为 "web":
$ copilot init \
--type "Request-Driven Web Service" \
--app hello \
--name web \
--port 8080 \
--dockerfile Dockerfile
这个命令只有在你之前至少已经执行过一次aws configure ,才会起作用。
完成后,copilot询问你是否要创建一个测试环境。如果你说是,它就会在现场构建并推送一个Docker镜像。我们现在可以跳过这个步骤。
现在让我们用copilot env init 创建一个生产环境。该环境包括:
- 公共和私有子网
- 一个具有默认设置的ECS集群
- 访问资源所需的所有IAM角色
$ copilot env init \
--profile default \
--default-config \
--app hello \
--name production --prod
✔ Created environment production in region us-east-2 under application hello.
最后一步是构建Docker镜像并发布它:
$ copilot svc deploy \
--app hello \
--env production \
--name web
✔ Deployed web, you can access it at https://xrtcgpxjjb.us-east-2.awsapprunner.com.
构建过程大约需要15分钟。一旦完成,copilot将输出一个支持SSL的端点的URL:

Copilot已经创建了一个包含应用程序清单的文件夹,在存储库中查看:
$ git add copilot
$ git commit -m "configure App Runner"
$ git push origin main
当你完成了App Runner的试用,你可以用copilot app delete 删除应用程序和其中的所有端点。
启用持续部署
示例应用程序已经上线。下一步是配置持续部署。然而,在这之前,你需要在App Runner中启用ECR监控。
登录AWS App Runner控制台,选择最近创建的应用程序:

点击配置标签,然后点击编辑。用模式调用服务。APP_NAME-ENV_NAME-SERVICE_NAME

点击容器URI地址旁边的浏览。

选择应用程序的ECR注册表和latest 标签:

接下来,将部署触发器从手动改为自动:

单击保存更改以完成此步骤,等到App Runner完成重新部署镜像。
创建一个CI/CD管道
我们现在必须构建Docker镜像,并将其推送到ECR。
用你的Semaphore账户登录,打开设置菜单:

转到Secrets,点击新的秘密。添加你的AWS账户程序性访问密钥。你可以在你的IAM控制台找到或创建它们。

创建一个项目
接下来,点击左上角附近的**+创建新的**。这将生成一个新的持续集成管道:

Semaphore现在正在显示你的代码库:

选择演示库后,你会登陆到一个页面,让你向项目添加人员:

选择 "从头开始",从零开始配置一个管道:

最后,选择 "单一工作 "并点击自定义:

你将到达工作流程生成器,在那里你可以配置管道中的工作:

我们将创建一个由两个阶段组成的CI/CD工作流:
- 构建:快速构建阶段,下载依赖性并运行一些测试。
- 部署:生成Docker镜像并将其推送到你的私有ECR注册中心。
构建工作
管道中的第一个作业将有以下命令:
sem-version ruby 2.7.3
checkout
cache restore
bundle install
cache store
顶部的两行,sem-version和checkout,设置活动的Ruby版本并克隆版本库。最后三行是安装并缓存Semaphore缓存中的Gems(依赖项)。
测试工作
接下来是一些测试。使用按钮来创建一个新的区块。在右边的窗格中打开序幕,并在其中加入以下命令。序言总是在块中的每个作业之前执行:
sem-version ruby 2.7.3
checkout
cache restore
bundle install

然后,添加测试命令:
bundle exec rspec

下一步是生成Docker镜像。
设置自动部署
Docker构建过程从下载存储在ECR中的最新镜像开始;这让Docker重复使用层,加快构建速度。然后,我们构建新的镜像并将其标记为latest

最后,在将镜像推送到私有的ECR注册中心后,就会触发部署。
部署管线
CI管道已经测试了该应用程序。现在我们将创建第二个管道构建并部署新的镜像。
要创建持续部署管道,使用添加推广按钮。然后,选中 "启用自动推广":

默认情况下,当所有测试在master 分支上通过时,推广就开始了。检查条件参考页,查看更多选项:

部署块应该有以下命令:
checkout
aws ecr get-login --no-include-email | bash
docker pull "$ECR_IMAGE":latest || true
docker build -t "$ECR_IMAGE":latest --cache-from "$ECR_IMAGE":latest .
docker push "$ECR_IMAGE":latest

如果你以前使用过Docker,你会认出docker build 和docker push 命令。这里唯一的新东西是aws ecr get-login 。顾名思义,这个命令允许访问ECR私有注册表。
打开环境变量部分,创建一个名为ECR_IMAGE 的变量,指向你的ECR URI。ECR地址是用这个形状创建的:
AWS_ACCOUNT_ID.dkr.ecr.AWS_REGION.amazonaws.com/APP_NAME/SERVICE_NAME
因此,举例来说,如果你的账户ID是123456,你的默认区域是us-east-2 (俄亥俄州),那么ECR地址就是:
123456.dkr.ecr.us-east-2.amazonaws.com/hello/web
你可以随时在ECR控制台中确认URI:

环境变量应该有与应用程序相关的ECR注册表的地址:

接下来,启用你先前创建的aws-key 秘密,你应该在秘密部分找到它。这将导入访问密钥,以便工作能够与AWS进行验证:

最后,点击 "运行工作流程",然后看起来不错,开始:

根据自动推广中设置的条件,你可能需要点击按钮来开始部署:

全部完成后,希望一切是绿色的,部署已经开始:

接下来的步骤
在App Runner上部署一个应用程序是很直接的。只要你有一个工作的Docker文件来构建图像,你就可以运行任何HTTP应用程序。
我们之前已经介绍过构建Docker镜像,所以请查看这些资源,了解不同语言在容器内的工作原理:
- Dockerizing a Node.js Web Application
- Dockerizing a Ruby on Rails Application
- Dockerizing a Python Django Web Application
- Dockerizing a PHP Application
- Dockerizing a Java Play Application
- Dockerizing Elixir和Phoenix应用程序
总结
App Runner是一个位于AWS Fargate、Lambda和ECS之间的服务。它专注于开发人员的生产力,是开始使用容器化应用程序的一个好方法。