部署到 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 项目模板开始。顾名思义,这些项目提供了基于一些知名框架构建的 基础应用程序。
- 在 GitLab 左侧边栏顶部,选择 Create new( )和 New project/repository。
- 选择 Create from template,您可以选择 Ruby on Rails、Spring 或 NodeJS Express 项目。在本指南中,使用 Ruby on Rails 模板。
- 为您的项目命名。在本示例中,命名为
ecs-demo。将其设为公开,以便您可以 利用 GitLab Ultimate 计划 中提供的功能。 - 选择 Create project。
现在您已创建演示项目,必须将应用程序容器化并推送到容器注册表。
将容器化应用程序镜像推送到 GitLab 容器注册表
ECS 是一个容器编排服务,这意味着您必须在基础设施构建期间 提供容器化应用程序镜像。为此,您可以使用 GitLab Auto Build 和 Container Registry。
-
在左侧边栏,选择 Search or go to 并找到您的
ecs-demo项目。 -
选择 Set up CI/CD。这将带您进入
.gitlab-ci.yml创建表单。 -
将以下内容复制并粘贴到空的
.gitlab-ci.yml中。这定义了 一个用于持续部署到 ECS 的流水线。include: - template: AWS/Deploy-ECS.gitlab-ci.yml -
选择 Commit Changes。它会自动触发新的流水线。在此流水线中,
build作业将应用程序容器化并将镜像推送到 GitLab 容器注册表。 -
访问 Deploy > Container Registry。确保应用程序镜像已 推送。
现在您有了一个可以从 AWS 拉取的容器化应用程序镜像。接下来,您定义此应用程序镜像 在 AWS 中如何使用的规范。
production_ecs 作业会失败,因为 ECS 集群尚未连接。您可以稍后修复此问题。
创建 ECS 任务定义
ECS 任务定义 是关于 ECS 服务 如何启动应用程序镜像的规范。
-
在 AWS 控制台 上转到 ECS > Task Definitions。
-
选择 Create new Task Definition。
-
选择 EC2 作为启动类型。选择 Next Step。
-
将
ecs_demo设置为 Task Definition Name。 -
将
512设置为 Task Size > Task memory 和 Task CPU。 -
选择 Container Definitions > Add container。这将打开容器注册表单。
-
将
web设置为 Container name。 -
将
registry.gitlab.com/<your-namespace>/ecs-demo/master:latest设置为 Image。 或者,您可以从 GitLab 容器注册表页面 复制并粘贴镜像路径。 -
添加端口映射。将
80设置为 Host Port,将5000设置为 Container port。 -
选择 Create。
现在您有了初始任务定义。接下来,您创建实际的基础设施来运行 应用程序镜像。
创建 ECS 集群
ECS 集群 是 ECS 服务 的虚拟组。它还与 EC2 或 Fargate 关联作为计算资源。
-
在 AWS 控制台 上转到 ECS > Clusters。
-
选择 Create Cluster。
-
选择 EC2 Linux + Networking 作为集群模板。选择 Next Step。
-
将
ecs-demo设置为 Cluster Name。 -
在 Networking 中选择默认的 VPC。 如果没有现有的 VPC,您可以保持原样以创建新的。
-
将 VPC 的所有可用子网设置为 Subnets。
-
选择 Create。
-
确保 ECS 集群已成功创建。
现在您可以在下一步向 ECS 集群注册 ECS 服务。
请注意以下事项:
- 可选地,您可以在创建表单中设置 SSH 密钥对。这允许您 SSH 到 EC2 实例进行调试。
- 如果您不选择现有的 VPC,它默认会创建一个新的 VPC。如果 您的账户达到允许的最大互联网网关数量,这可能会导致错误。
- 该集群需要一个 EC2 实例,这意味着它会根据 实例类型 向您收费。
创建 ECS 服务
ECS 服务 是一个守护进程,用于基于 ECS 任务定义 创建应用程序容器。
-
在 AWS 控制台 上转到 ECS > Clusters > ecs-demo > Services
-
选择 Deploy。这将打开服务创建表单。
-
在 Launch Type 中选择
EC2。 -
将
ecs_demo设置为 Task definition。这对应于 您之前创建的任务定义。 -
将
ecs_demo设置为 Service name。 -
将
1设置为 Desired tasks。 -
选择 Deploy。
-
确保创建的服务处于活动状态。
AWS 控制台 UI 会不时变化。如果您在说明中找不到相关组件,请选择最接近的组件。
查看演示应用程序
现在,演示应用程序可以从互联网访问。
-
在 AWS 控制台 上转到 EC2 > Instances
-
搜索
ECS Instance以找到 ECS 集群创建的 相应 EC2 实例。 -
选择 EC2 实例的 ID。这将带您到实例详情页面。
-
复制 Public IPv4 address 并粘贴到浏览器中。现在您可以看到演示应用程序 正在运行。
在本指南中,未配置 HTTPS/SSL。您只能通过 HTTP 访问应用程序
(例如,http://<ec2-ipv4-address>)。
从 GitLab 设置持续部署
现在您有一个在 ECS 上运行的应用程序,可以从 GitLab 设置持续部署。
创建新的 IAM 用户作为部署者
为了使 GitLab 能够访问您之前创建的 ECS 集群、服务和任务定义,您必须在 AWS 上 创建一个部署者用户:
-
在 AWS 控制台 上转到 IAM > Users。
-
选择 Add user。
-
将
ecs_demo设置为 User name。 -
启用 Programmatic access 复选框。选择 Next: Permissions。
-
在 Set permissions 中选择
Attach existing policies directly。 -
从策略列表中选择
AmazonECS_FullAccess。选择 Next: Tags 和 Next: Review。 -
选择 Create user。
-
记录创建用户的 Access key ID 和 Secret access key。
不要在公共场所分享访问密钥。您必须将其保存在安全的地方。
在 GitLab 中设置凭证以让流水线作业访问 ECS
您可以在 GitLab CI/CD Variables 中注册访问信息。 这些变量会注入到流水线作业中,可以访问 ECS API。
- 在左侧边栏,选择 Search or go to 并找到您的
ecs-demo项目。 - 转到 Settings > CI/CD > Variables。
- 选择 Add Variable 并设置以下键值对。
键 值 说明 AWS_ACCESS_KEY_ID<部署者的访问密钥 ID>用于验证 awsCLI。AWS_SECRET_ACCESS_KEY<部署者的秘密访问密钥>用于验证 awsCLI。AWS_DEFAULT_REGIONus-east-2用于验证 awsCLI。CI_AWS_ECS_CLUSTERecs-demoproduction_ecs作业访问的 ECS 集群。CI_AWS_ECS_SERVICEecs_demoproduction_ecs作业更新集群的 ECS 服务。确保此变量作用域适当(production、staging、review/*)。CI_AWS_ECS_TASK_DEFINITIONecs_demoproduction_ecs作业更新的 ECS 任务定义。
对演示应用程序进行更改
更改项目中的文件,看看是否反映在 ECS 上的演示应用程序中:
-
在左侧边栏,选择 Search or go to 并找到您的
ecs-demo项目。 -
打开
app/views/welcome/index.html.erb文件。 -
选择 Edit。
-
将文本更改为
You're on ECS!。 -
选择 Commit Changes。这将自动触发新的流水线。等待其完成。
-
访问 ECS 集群上运行的应用程序。您应该看到 这个:
恭喜!您已成功设置到 ECS 的持续部署。
ECS 部署作业在退出前会等待部署完成。要禁用此行为,
将 CI_AWS_ECS_WAIT_FOR_ROLLOUT_COMPLETE_DISABLED 设置为非空值。
设置审查应用程序
要在 ECS 中使用审查应用程序:
- 设置新的 服务。
- 使用
CI_AWS_ECS_SERVICE变量设置名称。 - 将环境作用域设置为
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:
- 设置新的 服务。此服务将用于部署临时 DAST 环境。
- 使用
CI_AWS_ECS_SERVICE变量设置名称。 - 将作用域设置为
dast-default环境。 - 将以下内容添加到您的
.gitlab-ci.yml文件中:
include:
- template: Security/DAST.gitlab-ci.yml
- template: Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml有关更多详细信息和配置选项,请参阅 DAST 文档。
延伸阅读
- 如果您对更多持续部署到云感兴趣,请参阅 cloud deployments。
- 如果您想快速在项目中设置 DevSecOps,请参阅 Auto DevOps。
- 如果您想快速设置生产级环境,请参阅 the 5 Minute Production App。