Help us learn about your current experience with the documentation. Take the survey.

部署到 Amazon Elastic Container Service

  • Tier: Free, Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

这份分步指南帮助您将托管在 GitLab.com 上的项目部署到 Amazon Elastic Container Service (ECS)

在本指南中,您首先使用 AWS 控制台手动创建一个 ECS 集群。然后创建并部署一个从 GitLab 模板创建的简单应用程序。

这些说明适用于 GitLab.com 和 GitLab Self-Managed 实例。请确保您的 runners 已配置

先决条件

  • 一个 AWS 账户。 使用现有 AWS 账户登录或创建新账户。
  • 在本指南中,您将在 us-east-2 区域创建基础设施。 您可以使用任何区域,但开始后不要更改。

在 AWS 上创建基础设施和初始部署

要从 GitLab 部署应用程序,您必须先在 AWS 上创建基础设施和初始部署。 这包括一个 ECS 集群 及相关组件,如 ECS 任务定义ECS 服务 和容器化应用程序镜像。

对于第一步,您从项目模板创建一个演示应用程序。

从模板创建新项目

使用 GitLab 项目模板开始。顾名思义,这些项目提供了基于一些知名框架构建的 基础应用程序。

  1. 在 GitLab 左侧边栏顶部,选择 Create new plus )和 New project/repository
  2. 选择 Create from template,您可以选择 Ruby on Rails、Spring 或 NodeJS Express 项目。在本指南中,使用 Ruby on Rails 模板。
  3. 为您的项目命名。在本示例中,命名为 ecs-demo。将其设为公开,以便您可以 利用 GitLab Ultimate 计划 中提供的功能。
  4. 选择 Create project

现在您已创建演示项目,必须将应用程序容器化并推送到容器注册表。

将容器化应用程序镜像推送到 GitLab 容器注册表

ECS 是一个容器编排服务,这意味着您必须在基础设施构建期间 提供容器化应用程序镜像。为此,您可以使用 GitLab Auto BuildContainer Registry

  1. 在左侧边栏,选择 Search or go to 并找到您的 ecs-demo 项目。

  2. 选择 Set up CI/CD。这将带您进入 .gitlab-ci.yml 创建表单。

  3. 将以下内容复制并粘贴到空的 .gitlab-ci.yml 中。这定义了 一个用于持续部署到 ECS 的流水线。

    include:
      - template: AWS/Deploy-ECS.gitlab-ci.yml
  4. 选择 Commit Changes。它会自动触发新的流水线。在此流水线中,build 作业将应用程序容器化并将镜像推送到 GitLab 容器注册表

  5. 访问 Deploy > Container Registry。确保应用程序镜像已 推送。

    GitLab 容器注册表中的容器化应用程序镜像。

现在您有了一个可以从 AWS 拉取的容器化应用程序镜像。接下来,您定义此应用程序镜像 在 AWS 中如何使用的规范。

production_ecs 作业会失败,因为 ECS 集群尚未连接。您可以稍后修复此问题。

创建 ECS 任务定义

ECS 任务定义 是关于 ECS 服务 如何启动应用程序镜像的规范。

  1. AWS 控制台 上转到 ECS > Task Definitions

  2. 选择 Create new Task Definition

    带有"Create new task definition"按钮的任务定义页面。

  3. 选择 EC2 作为启动类型。选择 Next Step

  4. ecs_demo 设置为 Task Definition Name

  5. 512 设置为 Task Size > Task memoryTask CPU

  6. 选择 Container Definitions > Add container。这将打开容器注册表单。

  7. web 设置为 Container name

  8. registry.gitlab.com/<your-namespace>/ecs-demo/master:latest 设置为 Image。 或者,您可以从 GitLab 容器注册表页面 复制并粘贴镜像路径。

    已完成的容器名称和镜像字段。

  9. 添加端口映射。将 80 设置为 Host Port,将 5000 设置为 Container port

    已完成的端口映射字段。

  10. 选择 Create

现在您有了初始任务定义。接下来,您创建实际的基础设施来运行 应用程序镜像。

创建 ECS 集群

ECS 集群ECS 服务 的虚拟组。它还与 EC2 或 Fargate 关联作为计算资源。

  1. AWS 控制台 上转到 ECS > Clusters

  2. 选择 Create Cluster

  3. 选择 EC2 Linux + Networking 作为集群模板。选择 Next Step

  4. ecs-demo 设置为 Cluster Name

  5. Networking 中选择默认的 VPC。 如果没有现有的 VPC,您可以保持原样以创建新的。

  6. 将 VPC 的所有可用子网设置为 Subnets

  7. 选择 Create

  8. 确保 ECS 集群已成功创建。

    ECS 集群已成功创建,所有实例正在运行。

现在您可以在下一步向 ECS 集群注册 ECS 服务。

请注意以下事项:

  • 可选地,您可以在创建表单中设置 SSH 密钥对。这允许您 SSH 到 EC2 实例进行调试。
  • 如果您不选择现有的 VPC,它默认会创建一个新的 VPC。如果 您的账户达到允许的最大互联网网关数量,这可能会导致错误。
  • 该集群需要一个 EC2 实例,这意味着它会根据 实例类型 向您收费。

创建 ECS 服务

ECS 服务 是一个守护进程,用于基于 ECS 任务定义 创建应用程序容器。

  1. AWS 控制台 上转到 ECS > Clusters > ecs-demo > Services

  2. 选择 Deploy。这将打开服务创建表单。

  3. Launch Type 中选择 EC2

  4. ecs_demo 设置为 Task definition。这对应于 您之前创建的任务定义

  5. ecs_demo 设置为 Service name

  6. 1 设置为 Desired tasks

    所有输入字段已完成的页面。

  7. 选择 Deploy

  8. 确保创建的服务处于活动状态。

    运行中任务的活动服务。

AWS 控制台 UI 会不时变化。如果您在说明中找不到相关组件,请选择最接近的组件。

查看演示应用程序

现在,演示应用程序可以从互联网访问。

  1. AWS 控制台 上转到 EC2 > Instances

  2. 搜索 ECS Instance 以找到 ECS 集群创建的 相应 EC2 实例。

  3. 选择 EC2 实例的 ID。这将带您到实例详情页面。

  4. 复制 Public IPv4 address 并粘贴到浏览器中。现在您可以看到演示应用程序 正在运行。

    在浏览器中运行的演示应用程序。

在本指南中,配置 HTTPS/SSL。您只能通过 HTTP 访问应用程序 (例如,http://<ec2-ipv4-address>)。

从 GitLab 设置持续部署

现在您有一个在 ECS 上运行的应用程序,可以从 GitLab 设置持续部署。

创建新的 IAM 用户作为部署者

为了使 GitLab 能够访问您之前创建的 ECS 集群、服务和任务定义,您必须在 AWS 上 创建一个部署者用户:

  1. AWS 控制台 上转到 IAM > Users

  2. 选择 Add user

  3. ecs_demo 设置为 User name

  4. 启用 Programmatic access 复选框。选择 Next: Permissions

  5. Set permissions 中选择 Attach existing policies directly

  6. 从策略列表中选择 AmazonECS_FullAccess。选择 Next: TagsNext: Review

    已选择的 <code>AmazonECS_FullAccess</code> 策略。

  7. 选择 Create user

  8. 记录创建用户的 Access key IDSecret access key

不要在公共场所分享访问密钥。您必须将其保存在安全的地方。

在 GitLab 中设置凭证以让流水线作业访问 ECS

您可以在 GitLab CI/CD Variables 中注册访问信息。 这些变量会注入到流水线作业中,可以访问 ECS API。

  1. 在左侧边栏,选择 Search or go to 并找到您的 ecs-demo 项目。
  2. 转到 Settings > CI/CD > Variables
  3. 选择 Add Variable 并设置以下键值对。
    说明
    AWS_ACCESS_KEY_ID <部署者的访问密钥 ID> 用于验证 aws CLI。
    AWS_SECRET_ACCESS_KEY <部署者的秘密访问密钥> 用于验证 aws CLI。
    AWS_DEFAULT_REGION us-east-2 用于验证 aws CLI。
    CI_AWS_ECS_CLUSTER ecs-demo production_ecs 作业访问的 ECS 集群。
    CI_AWS_ECS_SERVICE ecs_demo production_ecs 作业更新集群的 ECS 服务。确保此变量作用域适当(productionstagingreview/*)。
    CI_AWS_ECS_TASK_DEFINITION ecs_demo production_ecs 作业更新的 ECS 任务定义。

对演示应用程序进行更改

更改项目中的文件,看看是否反映在 ECS 上的演示应用程序中:

  1. 在左侧边栏,选择 Search or go to 并找到您的 ecs-demo 项目。

  2. 打开 app/views/welcome/index.html.erb 文件。

  3. 选择 Edit

  4. 将文本更改为 You're on ECS!

  5. 选择 Commit Changes。这将自动触发新的流水线。等待其完成。

  6. 访问 ECS 集群上运行的应用程序。您应该看到 这个:

    在 ECS 上运行的应用程序,带有确认消息。

恭喜!您已成功设置到 ECS 的持续部署。

ECS 部署作业在退出前会等待部署完成。要禁用此行为, 将 CI_AWS_ECS_WAIT_FOR_ROLLOUT_COMPLETE_DISABLED 设置为非空值。

设置审查应用程序

要在 ECS 中使用审查应用程序:

  1. 设置新的 服务
  2. 使用 CI_AWS_ECS_SERVICE 变量设置名称。
  3. 将环境作用域设置为 review/*

一次只能部署一个审查应用程序,因为此服务由所有审查应用程序共享。

设置安全测试

配置 SAST

要在 ECS 中使用 SAST,将以下内容添加到您的 .gitlab-ci.yml 文件中:

include:
   - template: Jobs/SAST.gitlab-ci.yml

有关更多详细信息和配置选项,请参阅 SAST 文档

配置 DAST

要在非默认分支上使用 DAST设置审查应用程序 并将以下内容添加到您的 .gitlab-ci.yml 文件中:

include:
  - template: Security/DAST.gitlab-ci.yml

要在默认分支上使用 DAST:

  1. 设置新的 服务。此服务将用于部署临时 DAST 环境。
  2. 使用 CI_AWS_ECS_SERVICE 变量设置名称。
  3. 将作用域设置为 dast-default 环境。
  4. 将以下内容添加到您的 .gitlab-ci.yml 文件中:
include:
  - template: Security/DAST.gitlab-ci.yml
  - template: Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml

有关更多详细信息和配置选项,请参阅 DAST 文档

延伸阅读