对AWS App Runner的初步了解

954 阅读8分钟

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 architecture

App Runner的特点

AWS在为开发者提供便利方面做了很多努力,特别是对于那些不需要强大基础设施的小规模项目,它有:

  • 简单的自动缩放:随着需求的变化,在可配置的最小和最大限制之间,实例被启动和停止。
  • 负载平衡:该服务包括一个透明的、不可配置的负载平衡器。
  • 启用SSL:你为你的所有应用程序获得HTTPS端点,并有AWS管理的证书。你不需要发行或更新证书。
  • 构建服务:你可以推送你自己的图像或让AWS从代码中为你构建。
  • 持久性URL:该服务为每个环境分配随机生成的URL。你可以选择将它们映射到你自己的域上。

App Runner可以在两种模式下运行。在构建模式下,AWS从GitHub拉取代码,并在每次更改时构建应用程序。在容器模式下,它从公共或私有的AWS ECR注册处部署Docker兼容的镜像。

Container and source code menu options

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和内存费用。

AWS Container Offerings

像所有其他服务一样,容器是临时的。你可以通过将你的容器与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上的新服务:

设置一个新的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:

Example output of the service

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 Runner console

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

Example service options

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

Changing ECR registry URI

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

Pick from the existing ECR containers

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

Changing from manual to automatic deployment

单击保存更改以完成此步骤,等到App Runner完成重新部署镜像。

创建一个CI/CD管道

我们现在必须构建Docker镜像,并将其推送到ECR。

用你的Semaphore账户登录,打开设置菜单:

Settings menu in Semaphore

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

Creating a new secret in Semaphore for the AWS keys

创建一个项目

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

The location of the create menu button

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

Choosing a Git repository to add

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

You can add people in the first page of the create project wizard

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

Choose to start a new pipeline from scratch

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

Selecting the single job starter template

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

The workflow editor window

我们将创建一个由两个阶段组成的CI/CD工作流:

  • 构建:快速构建阶段,下载依赖性并运行一些测试。
  • 部署:生成Docker镜像并将其推送到你的私有ECR注册中心。

构建工作

管道中的第一个作业将有以下命令:

sem-version ruby 2.7.3
checkout
cache restore
bundle install
cache store

顶部的两行,sem-versioncheckout,设置活动的Ruby版本并克隆版本库。最后三行是安装并缓存Semaphore缓存中的Gems(依赖项)。

测试工作

接下来是一些测试。使用按钮来创建一个新的区块。在右边的窗格中打开序幕,并在其中加入以下命令。序言总是在块中的每个作业之前执行:

sem-version ruby 2.7.3
checkout
cache restore
bundle install

Add the install commands in the first block

然后,添加测试命令:

bundle exec rspec

Create a second block

下一步是生成Docker镜像。

设置自动部署

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

The release cycle for AWS App Runner

最后,在将镜像推送到私有的ECR注册中心后,就会触发部署。

部署管线

CI管道已经测试了该应用程序。现在我们将创建第二个管道构建并部署新的镜像。

要创建持续部署管道,使用添加推广按钮。然后,选中 "启用自动推广":

Click add promotion to create a release pipeline

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

You can change the promotion conditions

部署块应该有以下命令:

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

Setup deploment commands

如果你以前使用过Docker,你会认出docker builddocker 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:

Where the ECR URI is found in the AWS console

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

Copy the URI into the ECR_IMAGE variable

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

Import the aws-key secret into the block

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

Start the pipeline

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

Click on promotion button to start it

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

This is the final state of the pipeline.

接下来的步骤

在App Runner上部署一个应用程序是很直接的。只要你有一个工作的Docker文件来构建图像,你就可以运行任何HTTP应用程序。

我们之前已经介绍过构建Docker镜像,所以请查看这些资源,了解不同语言在容器内的工作原理:

总结

App Runner是一个位于AWS Fargate、Lambda和ECS之间的服务。它专注于开发人员的生产力,是开始使用容器化应用程序的一个好方法。