AWS App Runner 从 2026 年 4 月 30 日起,将不再向新客户开放。如果您想使用 App Runner,请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息,请参阅 AWS App Runner 可用性变更。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
AWS App Runner 可用性变更
经过深思熟虑,我们决定从 2026 年 4 月 30 日开始与新客户接 AWS App Runner 触。现有 AWS App Runner 客户可以继续照常使用该服务,包括创建新的资源和服务。 AWS 继续在安全性和可用性方面进行投资 AWS App Runner,但我们不打算引入新功能。
我们建议客户在迁移时探索亚马逊弹性容器服务 (Amazon ECS) Elastic Service Express 模式。 AWS App Runner Amazon ECS 快速模式保留了 App Runner 的操作简便性,同时提供了对更广泛的 Amazon ECS 功能集的访问权限。只需调用一个 API,即可提供一个容器镜像和两个 IAM 角色,Amazon ECS 将在您的 AWS 账户中预配置完整的应用程序堆栈,包括 Fargate 上的 ECS 服务、应用程序负载均衡器、自动扩展和联网。使用 Amazon ECS 快速模式无需支付额外费用。您只需为为运行应用程序而创建的底层 AWS 资源付费。
本指南介绍如何将现有的 App Runner 服务迁移到 ECS 快速模式并使用 DNS 路由逐步转移流量。
迁移概述
本指南使用具有 DNS 加权路由的 blue/green 部署方法将流量从 App Runner 迁移到 ECS 快速模式。在迁移过程中,这两个服务同时运行。您可以使用 Amazon Route 53(或您的 DNS 提供商)逐渐将流量从 App Runner 服务转移到 ECS 快速模式服务,从一小部分开始,然后随着时间的推移而增加。这种方法可以最大限度地减少停机时间,并允许您在出现问题时通过调整 DNS 权重进行回滚。
典型的迁移包括以下步骤:
查看现有 App Runner 服务的配置
使用相同的容器镜像创建 ECS 快速模式服务
如果您使用自定义域,请为 ECS 快速模式服务配置相同的自定义域
使用 DNS 路由将流量从 App Runner 转移到 ECS 快速模式
完成迁移,并在不再需要 App Runner 服务时将其删除
先决条件
在开始之前,请确保您具备以下条件:
具有创建和管理 Amazon ECS AWS App Runner、Amazon Route 53 和应用程序负载均衡器资源的适当 AWS Identity and Access Management 权限的 AWS 账户
AWS CLI 已安装并配置了您的 AWS 账户凭证
存储在 Amazon 弹性容器注册表(或其他容器注册表)中以部署到 ECS 快速模式的容器映像
ECS 快速模式所需的 IAM 角色:
ecsTaskExecutionRole用于 Amazon ECS 任务执行和ecsInfrastructureRoleForExpressServicesECS 快速模式基础设施配置
如果您想在迁移期间保留现有的自定义域,还需要:
由您控制的注册域名
app.example.com,例如使用 Amazon Route 53 或第三方域名注册商进行控制AWS Certificate Manager(ACM) 中与您的自定义域名匹配的 SSL/TLS 证书。在部署资源 AWS 区域 的地方@@ 申请公有 ACM 证书。App Runner 和 Amazon ECS Express 模式都需要 ACM 证书才能使用自定义域名启用 HTTPS 访问。
开始前的准备工作
-
容器映像要求-ECS 快速模式部署容器映像。如果您的 App Runner 服务是从源代码部署的,请先添加一个构建步骤,该步骤用于创建容器映像并将其推送到注册表(例如 Amazon Elastic Container Registry)。然后将该映像部署到 ECS 快速模式。迁移基于源的部署有关迁移基于源代码的部署的详细信息,请参阅。
-
域行为 — 如果您的 App Runner 服务已经使用自定义域(例如),则可以在迁移期间重复使用相同的主机名,并通过更新 DNS 在 App Runner 和 ECS Express 模式之间逐渐转移流量。
app.example.com如果您的 App Runner 服务仅使用默认的 App Runner 服务 URL,则 ECS 快速模式服务将具有不同的端点。在这种情况下,没有可用于逐渐转移流量的共享主机名。您应该创建并验证 ECS 快速模式服务,然后更新客户端或 DNS 以使用新的终端节点。
迁移演练
下图显示了迁移是如何使用 Route 53 在 App Runner 服务和 ECS 快速模式服务之间移动 DNS 记录的。
第 1 步:查看现有的 App Runner 配置
在 App Runner 控制台中,查看您的现有服务并记下要延续的值。至少要注意以下几点:
容器映像
应用程序端口
环境变量
自定义域名(如果已配置)
与自定义域相关联的 ACM 证书(如果已配置)
您还可以查看要延续到新服务中的任何其他运行时设置。
有关自定义域的详细信息,请参阅管理 App Runner 服务的自定义域名。
步骤 2:创建 ECS 快速模式服务
使用与 App Runner 服务相同的容器映像创建 ECS 快速模式服务。您可以使用AWS 管理控制台或创建服务AWS CLI。
示例 CLI 命令:
aws ecs create-express-gateway-service \ --execution-role-arn arn:aws:iam::123456789012:role/ecsTaskExecutionRole \ --infrastructure-role-arn arn:aws:iam::123456789012:role/ecsInfrastructureRoleForExpressServices \ --primary-container '{ "image": "123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:latest", "containerPort": 8080, "environment": [{ "name": "ENV_VAR_NAME", "value": "value" }] }' \ --service-name "my-application" \ --health-check-path "/" \ --scaling-target '{"minTaskCount":1,"maxTaskCount":4}' \ --monitor-resources
将图像、端口、环境变量和缩放值替换为 App Runner 服务中的图像、端口、环境变量和缩放值。
此命令在您的 AWS 账户中配置完整的应用程序堆栈,包括 Fargate 上的 ECS 服务、带有目标组和运行状况检查的 Application Load Balancer、自动扩展策略、安全组和网络配置以及默认 URL。
配置通常需要 3 到 5 分钟。您可以在 Amazon ECS 控制台的 “资源” 选项卡下跟踪进度。
完成后,使用控制台中显示的默认 URL 测试您的 ECS 快速模式服务。在继续进行流量转移之前,请验证您的应用程序是否正常运行。
步骤 3:为 ECS 快速模式配置自定义域
如果您的 App Runner 服务使用自定义域,请在转移流量之前为 ECS 快速模式服务配置相同的自定义域。此步骤配置为 ECS 快速模式服务创建的 Application Load Balancer,使其接受您的域的流量并使用适用于 HTTPS 的 ACM 证书。
将您的自定义域作为主机标头条件添加到 App lication Load Balancer 侦听器规则中。使用与 App Runner 服务关联的相同域名(例如,
app.example.com)。这会告诉 Application Load Balancer 将流量从您的域路由到 ECS 快速模式目标组。将 SSL 证书添加到 Application Load Balancer HTTPS 侦听器。将步骤 1 中记下的 ACM 证书添加到 HTTPS 侦听器。
有关详细说明,请参阅 Amazon ECS 开发人员指南中的向服务添加自定义域。
下图显示了在 Application Load Balancer 侦听器规则中配置主机标头条件的示例。
步骤 4:使用 Route 53 加权路由转移流量
如果您的 App Runner 服务已经使用自定义域,则可以使用 R oute 53 加权路由逐步将流量转移到 ECS 快速模式服务。加权路由允许您将相同主机名的流量路由到多个端点。每个端点都被定义为具有自己权重的单独的 DNS 记录,Route 53 根据这些权重分配请求。
注意
本指南以 Route 53 为例。如果您使用其他 DNS 提供商,请使用提供商的流量管理功能进行等效的 DNS 更改。
将现有的 App Runner 记录转换为加权记录:
打开 Route 53 控制台。
选择托管区域,然后为您的域选择托管区域。
找到当前指向 App Runner 的主机名的现有记录(例如
app.example.com)。编辑记录并将其路由策略更改为加权。
将权重设置为
100(这会将所有初始流量定向到 App Runner)。在 “记录 ID” 下,输入描述性标识符,例如。
app-runner-service选择保存更改。
为 ECS 快速模式创建加权记录:
在同一个托管区域中创建新记录。
使用相同的记录名称(例如
app.example.com)。使用相同的记录类型。
将路由策略设置为加权。
在 “将流量路由到” 下,选择 “应用程序的别名” 和 “Classic Load Balancer”。
从下拉列表中选择您的 ECS Express 模式应用程序负载均衡器。
将权重设置为
0(除非您明确增加权重,否则流量不会流向 ECS 快速模式)。在 “记录 ID” 下,输入描述性标识符,例如。
ecs-express-service选择创建记录。
逐渐转移交通:
配置 DNS 记录后,通过增加 ECS 快速模式权重,同时按比例减少 App Runner 权重,开始转移流量。推荐的方法:
将 ECS 快速模式设置为 10 /App Runner 设置为 90
监控并验证服务是否成功处理请求
增加到 25/75
增加到 50/50
增加到 75/ 25
在 100/0 时完成
在每一步中,在转移额外流量之前,都要测试应用程序。如果在任何时候出现问题,请通过将权重调整回先前的值来回滚。
重要
让 App Runner 服务运行一段验证期(例如 24-48 小时),以确认 DNS 更改已在全球范围内传播,并在需要时提供回滚选项。如果遇到问题,可以快速将 Route 53 的权重恢复到 App Runner。
步骤 5:完成迁移
在验证 ECS Express Mode 服务是否正确处理生产流量并且验证期已过后,完成迁移:
在 Route 53 中,移除指向 App Runner 的加权记录(或将其权重设置为 0)。
从 App Runner 服务中移除自定义域关联。
删除 App Runner 服务:
aws apprunner delete-service --service-arnyour-app-runner-service-arn
还要考虑移除任何不再需要的资源:
App Runner 的 53 条加权路由记录
来自 Amazon 弹性容器注册表的未使用容器镜像
专为 App Runner 创建的 IAM 角色(如果不再需要)
注意
如果服务在生产环境中运行,请勿删除 ECS 快速模式服务、其 Application Load Balancer 或相关资源。
迁移基于源的部署
如果您现有的 App Runner 服务是从源代码而不是容器映像部署的,则需要在部署到 ECS 快速模式之前添加容器化步骤。与 App Runner 不同,ECS 快速模式需要容器镜像。但是,您可以使用诸如带有 A mazon ECS 部署快速服务 GitHub 操作的 GitHub 操作之类的 CI/CD 工具复制 App Runner 的自动部署
迁移工作流程分为三个阶段:
使用 Docker file 构建容器镜像
将镜像推送到容器注册表,例如 Amazon 弹性容器注册表
将镜像部署到 ECS 快速模式
下图显示了此工作流程如何使用 “ GitHub 操作”:
将您的应用程序容器化
如果您的应用程序还没有 Dockerfile,请在存储库根目录中创建一个 Dockerfile。Dockerfile 是构建源代码并将其打包成容器镜像的蓝图。
您的存储库结构应包括:
your-app/ ├── src/ # Application source code ├── Dockerfile # Container build instructions ├── package.json # Dependencies and scripts └── .github/ # GitHub configuration └── workflows/ # GitHub Actions workflows └── deploy.yml # ECS Express Mode deployment workflow
为自动部署设置 GitHub 操作
要在代码推送时复制 App Runner 的自动部署,请使用以下 GitHub 内容配置 Actions:
创建 OpenID Connect (OIDC) 提供商
以允许 Actions 担任 I GitHub AM 角色 创建 ECS 快速模式所需的两个 IAM 角色
为您的 ECS 资源创建 GitHub 环境变量:
ECS_SERVICEECS_CLUSTER、AWS_REGION、AWS_ACCOUNT_ID、和ECR_REPOSITORY
GitHub 操作工作流程示例
在以下位置创建工作流程文件.github/workflows/deploy.yml:
name: Build and Deploy to ECS on: push: branches: [ main ] env: AWS_REGION: ${{ vars.AWS_REGION }} AWS_ACCOUNT_ID: ${{ vars.AWS_ACCOUNT_ID }} ECR_REPOSITORY: ${{ vars.ECR_REPOSITORY }} ECS_SERVICE: ${{ vars.ECS_SERVICE }} ECS_CLUSTER: ${{ vars.ECS_CLUSTER }} jobs: deploy: name: Deploy runs-on: ubuntu-latest environment: production permissions: id-token: write contents: read steps: - name: Checkout uses: actions/checkout@v6 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v5 with: aws-region: ${{ env.AWS_REGION }} role-to-assume: arn:aws:iam::${{ env.AWS_ACCOUNT_ID }}:role/github-actions-ecs-role role-session-name: GitHubActionsECSDeployment - name: Login to Amazon ECR id: login-ecr uses: aws-actions/amazon-ecr-login@v2 - name: Get short commit hash run: echo "IMAGE_TAG=${GITHUB_SHA:0:7}" >> $GITHUB_ENV - name: Build, tag, and push image to Amazon ECR id: build-image env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} uses: docker/build-push-action@v6 with: context: . push: true tags: ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest,${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }} - name: Deploy to ECS Express Mode uses: aws-actions/amazon-ecs-deploy-express-service@v1 env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} with: service-name: ${{ env.ECS_SERVICE }} image: ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }} execution-role-arn: arn:aws:iam::${{ env.AWS_ACCOUNT_ID }}:role/ecsTaskExecutionRole infrastructure-role-arn: arn:aws:iam::${{ env.AWS_ACCOUNT_ID }}:role/ecsInfrastructureRoleForExpressServices cluster: ${{ env.ECS_CLUSTER }} container-port: 8080 environment-variables: | [ {"name": "ENV", "value": "Prod"} ] cpu: '1024' memory: '2048' health-check-path: /health min-task-count: 1 max-task-count: 4 auto-scaling-metric: AVERAGE_CPU auto-scaling-target-value: 70
当您将代码更改推送到主分支时, GitHub Actions 会自动生成新的容器映像,将其推送到 Amazon Elastic Container Registry,然后将其部署到您的 ECS 快速模式服务。这复制了您在 App Runner 上获得的自动部署体验。
ECS Express Mode 服务运行后,请按照迁移演练中的步骤 3—5 配置自定义域,使用 DNS 路由转移流量,然后完成迁移。