亚马逊AWS官方博客
Global to China 跨国企业使用 AWS DevOps 和 CloudFormation 服务进行容器化应用的跨境开发和部署方案
背景
很多跨国企业在将他们部署在亚马逊云科技海外区域的容器化应用复制到中国区北京和宁夏区域的时候,会希望拥有一套完整的跨中国和海外两个 AWS Partition 的持续集成(CI)和持续部署(CD)的 DevOps 方案。比如在开发团队推出的新的容器镜像的时候,会希望借助同一套 DevOps 方案同步部署到海外区域以及中国北京或者宁夏区域。基于这个背景,本文介绍了如何使用亚马逊云科技 DevOps 例如 AWS CodePipeline 等相关服务,IaC(Infra as Code/基础设施即代码),如 AWS CloudFormation 等相关服务以及亚马逊云科技官方解决方案 DTH(Data Transfer Hub),打造从海外进行开发,集成,最后分别在海外区域和中国区域进行部署的全套 DevOps 流程。
解决方案
我们将会使用亚马逊云科技 CodePipeline 进行 DevOps 流程的搭建,CodePipeline 是一种持续集成与持续交付服务,可以实现快速而可靠的应用程序和基础设施更新。CodePipeline 可以直接从 AWS CodeCommit、GitHub、Amazon ECR 或 Amazon S3 提取源代码,在 AWS CodeBuild 中运行构建和单元测试,最后 CodePipeline 可使用 AWS CodeDeploy、Amazon Elastic Container Service(Amazon ECS)或 AWS Fargate 部署代码。您还可以对 AWS CloudFormation 操作进行建模,从而在发布流程中预置、更新或删除 AWS 资源。
对于镜像跨境传输,我们将会使用 DTH(Data Transfer Hub)方案进行传输。DTH 是一个安全,可靠,可扩展和可追踪的数据传输解决方案,提供一致的用户体验,使您可以轻松地创建和管理不同数据类型,从不同的来源到 Amazon Web Services 云原生服务的传输任务。当此解决方案启动后,您可以在几分钟内开始数据传输任务。同时我们将对 DTH 的方案底层进行改动,使之能够通过事件触发镜像跨境实时复制。
架构图
架构主要包含下面 4 部分:
- 在海外区域和中国区域同时使用 Amazon ECR,AWS Fargate 来搭建容器应用所需镜像库和应用部署的环境
- 在海外区域使用 AWS CodePipeline 来完成容器应用在海外区域的开发、集成和部署
- 在海外区域使用 DTH 的解决方案,来完成 ECR 镜像的跨 AWS Partition 传输
- 在中国区域使用由 ECR 事件触发的 CodePipeline 服务,部署镜像到中国区域 AWS Fargate 服务中
同时整体架构都可以使用 AWS CloudFormtion 来进行部署。
实现步骤
前提条件
- 准备亚马逊云科技海外区域和中国区域账号
- 本地安装 Git,AWS CLI,CDK
- 从 GitHub下载示例代码 https://github.com/yuhenghub/AWS-Cross-Border/,本示例代码包含一套上述架构图中的主要服务的 CloudFormation 代码和一套网站应用代码
部署流程概述
- 使用 CloudFormation 在亚马逊云科技海外和中国区分别部署 ECR 和 Fargate 服务,同时使用 CloudFormation 在海外区域部署 CodePipeline 及相关组件包括 CodeCommit,CodeBuild 和 CodeDeploy。
- 使用海外区域 CodeCommit 服务作为代码仓库,从线下推送应用代码到代码仓库,同时在 CodePipeline 中添加单元测试。
- 在完成单元测试以后,使用海外区域 CodeBuild 服务,基于源代码生成镜像文件(Docker Image)并推送到相应海外区域 ECR。
- 在镜像文件完成推送之后,使用海外区域 CodeDeploy 将镜像文件部署在海外区域 AWS Fargate 服务中。
- 使用 CloudFormation 在亚马逊云科技海外区域部署 Data Transfer Hub 方案,创建 ECR 跨 AWS Partition 传输任务,然后对 Data Transfer Hub 的方案服务底层代码进行修改,使之从原先的定时触发更改为根据 ECR 的 Event 触发,从而实现容器镜像发布/更新的实时跨境传输。
- 在亚马逊云科技中国区域部署由特定 ECR 事件触发的 CodePipeline 服务,部署镜像到中国区域 AWS Fargate 服务中。
- 最后,我们对第 2 步中的应用代码进行更改,一键触发海外 CodePipeline,DTH 传输,中国区域 CodePipeline,测试海外区域和中国区域进行部署的 DevOps 流程。
详细步骤
1. 使用 CloudFormation 来部署 AWS CodePipeline 和 Amazon ECR
1.1 使用 CloudFormation 在海外区域部署 CodePipeline 相关服务
在源代码中找到 app-cdk 文件夹,在本地命令行中切换到 app-cdk 目录,执行下面命令:
1.2 使用 CloudFormation 部署 ECR,使用上面同样的方式执行命令
2. 测试代码仓库
在本地基于克隆好的代码建立本地 Git 库,然后连接上一步由 CloudFortmation 创建的 CodeCommit 远程仓库,将本地代码 Push 到 CodeCommit。推送完成后可以在 CodeCommit 看到代码目录。
3. 测试持续集成服务
在 my-app 文件中,我们定义了示例应用的源代码和 DockerFile,同时在 test 文件夹中基于 Python 写了一套 Pytest 测试文件。在代码中使用 buildspec_test.yml 文件来定义 codebuild 单元测试的配置。当代码成功通过单元测试时,会来到下一个- stage: Docker Builder,我们使用 buildspec_docker.yml 来配置这个 stage。
4.1 测试持续部署 CD 服务
使用 CloudFormation 在海外区域部署 Fargate 服务, 部署完成之后可以看到 ECR 中我们的 Docker Image 已经成功部署到了 Fargate 服务中。点击部署资源里面的 ALB,找到 DNS Name,并使用浏览器打开就可以看到部署完的应用。
4.2 更新应用前端代码
在 Start building on AWS Today 字样后加上 Again! 执行 Push 代码操作,Codepipeline 会被 Push 操作触发一次执行,单元测试和更新镜像的动作会再进行执行,同时在 CD 阶段,CodeDeploy 将更新过的的镜像文件部署在 AWS Fargate 服务中。
5.1 部署 DTH 方案
访问 https://aws.amazon.com/cn/solutions/implementations/data-transfer-hub/,选择在海外 AWS 区域启动方案,如下图:
记录 AdminUsenamer 和密码,以及部署任务完成时的 PortalUrL,参考下图:
5.2 创建 DTH 公共镜像传输任务
点击 PortalUrl 地址,使用 AdminUsenamer 和密码登录 DTH 应用
根据提示填写所有选项,尤其是中国区亚马逊云科技账号以及储存 AK/SK 到 Secret Manger 进行使用。
5.3 创建 DTH ECR 镜像跨境传输任务
从亚马逊云科技海外区域的 ECR 传输镜像到中国区 ECR,可以新建 ECR 传输任务,选择 Amazon ECR。
根据要求填写所有信息。
5.4 更改 DTH ECR 镜像跨境传输任务代码
在创建好 ECR 传输任务之后,进入 CloudFormation 服务页面,可以发现一个新的 Stack: DTH-ECR-XXXX,点击并选择资源,然后输入“event”进行搜索, 点击 Event:Rule 所对应的资源。
进入后选择 Edit 对 Rule 进行编辑,在 Detail 页面选择 “Rule with an event pattern”,点击下一步。
在 Event Pattern 界面按照下图进行配置,然后点击下一步直到保存。
5.5 测试 DTH ECR 实时传输任务
执行海外区域的 Codepipeline 生成 ECR 的新 Image,成功以后触发 DTH 的 ECR 传输任务,等待一段时间之后在中国区域检查任务传输情况。
6. 在中国区域使用 ECR 事件触发 CodePipeline 部署镜像到中国区域 AWS Fargate 服务中
6.1 中国区部署 CodePipeline
创建 CodePipeline 使用 ECR 作为 source provider,选择海外传输到本地的 ECR repo。
6.2 添加 CodeBuild Stage
完成上一步配置之后,我们需要特别添加一个 CodeBuild Stage,是因为 CodePipeline 部署 Fargate 的 action 需要一个 imagedefinitions.json 的文件,而 CodePipeline 的 ECR 事件只会生成一个 imageDetail.json 文件,两者存在一定的格式差异,所以这里我们需要添加一个 CodeBuild Stage,完成文件格式的转化。转化代码如下所示,我们新建一个 BuildSpec 文件,根据该文件创建 CodeBuild Stage。
6.3 添加 Deploy Action,指向中国区 Fargate,如下图所示进行配置
7. 变更测试端到端流程
7.1 更新网站应用源代码
将下面 HTML 页面主题从“Start building on AWS Today Again!”内容更改为”Let‘s Build Cross Border DevOps!”,并 push 代码
7.2 提交代码触发海外 CodePipeline 运行
7.3 CodePipeline 完成 Unit Test Stage,Docker Build Stage 和 Fargate Deploy Stage
打开海外区域 ELB 所对应的应用 URL(us-east-1),发现标题内容已经更新,证明应用已经成功部署在亚马逊云科技海外区域(us-east-1)。
7.4 检查 DTH 跨境 ECR 镜像传输情况
分别打开海外区域和中国区域的 ECR 可以看到,DTH 已经通过事件触发将新的 Image 传输到中国区域 ECR,如图可以看到用了大概 41 秒将 27.8 MB 的示例网站应用镜像传输至国内(US-Virginia 14:54:01) ->(Ningxia 14:54:42)。
7.5 中国区域 ECR Event 触发中国区域 CodePipeline 完成部署
打开中国区域 CodePipeline 界面如下,等待 Pipeline 执行完成。
7.6 检查国内应用更新
在 Pipeline 执行完成后,打开国内 ELB 所对应 URL,如图所示,国内的网页(cn-northwest-1)的内容已经更新,证明应用已经成功部署在亚马逊云科技中国区域(cn-northwest-1)。
总结
本文介绍了如何使用 AWS CodePipeline 和 DTH 搭建容器化应用的跨境的 DevOps 流程,大家可以使用 GitHub 连接中的 CloudFormation 代码进行部署测试。对于多个镜像同时跨境部署,可以创建多条 CodePipeline 以及多个 DTH ECR Task 分别根据每个 Image 的发布/更新触发传输, 或者选择进一步更改 DTH 中代码针对每个 image 触发的事件进行队列存储触发对应跨境传输复制(Skopeo Copy),同时在中国区域建立每个 Image 相应的 CodePipeline。完成搭建后即可实现多镜像的海外源代码开发,集成,中国区域和海外区域同时进行容器应用部署的全套 DevOps 流程。