亚马逊AWS官方博客

从零开始搭建您的CI/CD Pipeline(下)

在上文中我们介绍了基于利用 Github作为代码仓库,并使用CodeBuild进行项目构建的方式和流程。在本文中,我将介绍如何通过CodeDeploy 对上文中的项目通过蓝/绿部署的方式部署到ECS集群中。同时我们还将通过CodePipeline服务把CI及CD的部分集成到一起。

Step 6: 创建您的应用程序负载均衡器和目标组

在本章节中我们将创建一个负载均衡器和两个目标组。稍后在创建 Amazon ECS 服务时,我们会使用该负载均衡器和目标组值。在本示例中,我们选择Application Load Balancer。在本例中,我们将使用Internet-facing的负载均衡器,请把您的ALB放置在公有子网中,且需要跨两个或以上不同可用区。有关负载均衡器和目标组的更多信息,请参阅什么是应用程序负载均衡器

创建Amazon EC2 应用负载均衡器

  1. 登录 AWS 管理控制台,打开 Amazon EC2 控制台,您也可以通过 https://console.aws.amazon.com/ec2/进行访问。
  2. 在导航窗格中,选择负载均衡器
  3. 选择创建负载均衡器
  1. 选择Application Load Balancer,然后点击创建
  2. 负载均衡器名称中,输入符合命名规则的名称。
  3. 模式中,选择面向互联网
  4. IP地址类型中,选择ipv4。
  5. 网络映射中选择相应的VPC,在映射中选取相应的可用区,并在对应可用区中选择一个公有子网。如下图所示:

选择相应的安全组,并在安全组规则中开放80端口。更多关于安全组的配置请参考:您的 VPC 的安全组

9. 在侦听器和路由下为您的负载均衡器配置侦听器端口。

  • 在负载均衡器协议下,选择 HTTP。在负载均衡器端口下,输入 80。
  • 默认操作下选择创建目标组,在该页面中选择目标类型中选择实例。然后根据页面引导选择相应的VPC,该VPC应该和我们此前创建的Application Load Balancer隶属于相同的VPC。

为您的负载均衡器创建第二个目标组

基于ECS的蓝绿部署需要两个目标组,此时我们来创建第二个目标组。

  1. 打开 Amazon EC2 控制台,在导航窗格中,选择目标群组
  2. 选择创建目标组
  3. 按照与创建第一个目标组相同的方式进行第二个目标组的创建.

Step 7: 创建ECS服务

  1. 创建一个JSON 文本,命名为create-service.json. 示例内容如下:
{
    "taskDefinition": "<your-task-name:revision>",
    "cluster": "<your-cluster-name>",
    "loadBalancers": [
        {
            "targetGroupArn": "<your-target-group-arn>",
            "containerName": "<your-container-name>",
            "containerPort": 80
        }
    ],
    "desiredCount": 1,
    "launchType": "EC2",
    "schedulingStrategy": "REPLICA",
    "deploymentController": {
        "type": "CODE_DEPLOY"
    }
}
  • 替换占位符<your-task-name:revision>中的内容。这部分内容来源于Step4中创建的任务定义,您可以在控制台中找到ECS服务,在ECS导航栏中找到任务定义选项,点击我们刚才创建的任务定义就可以看到该字段的内容。在本例中内容如下:”taskDefinition”: “eureka:7″。
  • 替换占位符<your-cluster-name>中的内容。集群名称是步骤1中我们设定的集群名称。
  • targetGroupArn来源于Step6中创建的目标组,您可以在EC2控制台中找到负载均衡导航栏,点击目标群组,在右侧页面看到您的所有目标组,选择您在Step6中创建的第一个目标组,并查看到它的Arn,填写至targetGroupArn字段。
  • containerName来源于Step2中创建的镜像存储库,本例中的镜像名称如下:”containerName”: “eureka”

2. 运行create-service 命令来创建ECS服务,您可以输入自己的服务名称来替代占位符部分的内容。

aws ecs create-service --service-name <your-service-name> --cli-input-json file://create-service.json

Step 8: 创建CodeDeploy 应用和部署组(基于ECS平台)

我们需要为当前的ECS服务创建一个CodeDeploy应用和部署组,以上组件在我们部署ECS服务时会被使用。同时,我们还会用到此前步骤中创建的目标组等组件。

创建一个CodeDeploy应用

  1. 打开CodeDeploy控制台,选择应用程序,点击创建应用程序
  2. 输入应用程序的名称,本例中名称为eurekaapp。在计算平台下拉框中选择Amazon ECS。
  3. 点击创建应用程序。

创建CodeDeploy部署组

  1. 打开刚才创建好的应用页面,点击创建部署组
  2. 根据引导输入部署组的名称,本例中名称为dev.
  3. 输入服务角色部分,选择一个角色来让CodeDeploy可以访问ECS服务。如果不存在该角色,需要新创建一个CodeDeploy服务角色。关于如何创建角色,请参考以下步骤:
    • 打开IAM服务的控制台:https://console.aws.amazon.com/iam/
    • 在控制台左侧选项卡里选择角色
    • 选择创建角色
    • 在选择一个使用案例中,选择CodeDeploy – ECS。 点击下一步:权限标签, 并使用默认的规则。
    • 点击下一步:标签
    • 点击下一步:审核
    •  输入角色名称(例如, CodeDeployECSRole), 并完成创建.
  4. 环境配置中,选择下拉框中对应的ECS集群名称,ECS服务名称.
  5. 负载均衡器部分,选取我们此前创建的负载均衡器,并在生产监听器的下拉框中选择侦听端口,本例中为“HTTP:80”。
  6. 在目标组1和目标组2中分别选择我们此前创建的两个目标组。
  7. 根据您的需要进行部署设置。
  8. 点击创建部署组

Step 9: 创建appspec.yaml文件并上传至Github

创建appspec.yaml文件

appspec.yaml文件用于 CodeDeploy 部署。如果您想知道更多关于CodeDeploy如何使用 appspec.yaml 文件的信息(包括示例),请参阅 CodeDeploy AppSpec 文件参考

本例中我们首先创建名为 appspec.yaml 的文件,其内容如下所示。注意:对于 TaskDefinition,不要更改<TASK_DEFINITION> 占位符文本。此值会在Code Pipeline运行时更新。

本例中的范本如下:

version: 0.0
Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: <TASK_DEFINITION>
        LoadBalancerInfo:
          ContainerName: "eureka"
          ContainerPort: 80

将appspec.yaml推送到您的 Github存储库。

您的文件在github的仓库中目录结构应如下所示:

/my-demo-repo
	 |--src/… 		
         |-- taskdef.json
         |-- buildspec.yml
         |-- Dockerfile
         |-- appspec.yaml

Step 10: 创建部署管道

本章节中,我们需要通过如下方式创建部署管道

    1. 进入CodePipeline控制台 http://console.aws.amazon.com/codesuite/codepipeline/home.
    2. 选择创建流水线
    3. 输入Pipeline名称, 本例中的Pipeline名称为eureka。
    4. 服务角色中选择新服务角色,并点击下一步
    5. 的部分,本例选择Github1作为数据源,按照页面提示连接至Github并点击连接后的确认按钮。选择对应的存储库名称和分支名称。点击下一步
    6. 构建部分,在构建提供程序下拉框中选择AWS Codebuild
      • 区域部分选择选择对应的AWS区域,本例中我们的区域为us-west-2。
      • 项目名称部分,点击输入栏即可自动弹出我们刚才创建好的CodeBuild项目,本例中项目名称为eureka。
      • 构建类型选择为默认的单次构建,点击前往CodePipeline
    7. 进入部署环节,部署部分设置如下:
      • 部署提供程序中选择Amazon ECS (Blue/Green)。并根据提示选择我们刚创建的Codedeploy应用,如下图所示:

      • 在Amazon ECS 任务定义,  选择 BuildArtifact,名称为taskdef.json.
      • 在AWS CodeDeploy AppSpec 文件中,选择 BuildArtifact,名称为appspec.yaml.
      • 点击下一步.

8. 选择创建流水线按钮,进行Pipeline的创建。

截止到当前,我们已经完成了基于EC2部署的ECS集群CI/CD通道的创建。您可以尝试修改代码,并触发管道的运行,并验证您的服务是否可以成功部署。

结论

在以上两篇博文中,您学习了如何以 Github作为代码仓库,通过CodeBuild进行代码构建,并最终通过CodeDeploy ECS集群上执行蓝/绿部署。同时,我们通过CodePipeline为项目设置了完整的 CI/CD 管道,以便在每次项目代码发生变化的时候自动触发编译和部署流程,帮助减少您的总体部署时间。除此之外,Code系列还会保存您的构建和部署记录,方便您在项目维护过程中进行回溯和查阅。

本篇作者

丁杰

AWS 解决方案架构师,8年以上大型移动互联网研发及技术管理经验,资深云计算行业从业者。对EDA行业上云以及针对云上架构进行优化设计有深入理解。了解云计算及半导体行业技术发展变革方向,能针对云服务特点在行业解决方案上有前瞻性布局