写点什么

借助 GitHub Actions 将容器应用程序持续交付到 AWS Fargate

  • 2019-11-21
  • 本文字数:4411 字

    阅读完需:约 14 分钟

借助 GitHub Actions 将容器应用程序持续交付到 AWS Fargate

11 月 14 日,在 GitHub Universe 2019 大会的第二天主题演讲中,Amazon Web Services 宣布我们已将四个新的 适用于 Amazon ECS 和 ECR 的 GitHub Actions 开源化。 借助这些 GitHub Actions,开发人员和开发运营工程师可以在 GitHub 上的代码存储库中轻松设置持续交付管道,从而将容器工作负载部署到 Amazon Elastic Container Service (Amazon ECS) 和 AWS Fargate.



GitHub 与 Amazon Web Services 合作开发了最初的四个开源 GitHub Actions 以及一个入门工作流,其目的是为了让用户可以简单、安全、快速地部署来自 GitHub 存储库的容器化应用程序。团队、项目和组织不同,其 CI/CD 管道和发布流程也将各异。我们希望 GitHub Marketplace 中的这些开源 Actions 和入门工作流模板,能够成为一个起点,为软件工程师团队提供启发,帮助他们构建自己的组件,并根据他们的容器化应用程序自定义他们的 CI/CD 工作流。


随着客户提出更多的反馈、问题和 pull 请求,我们将继续改进这些开源组件,以更好地满足客户的需求。


在下文中,我们将讨论为何以及如何可以使用容器、ECR、ECS 和 GitHub Actions 来构建 CI/CD 管道,从而部署容器化的持续软件开发工作负载,帮助提高软件开发团队的效率。

为何要使用容器?

作为软件开发者,我们都希望使用尽可能与目标生产系统类似的开发和测试环境。 如果开发环境不能准确反映目标生产环境的配置和规模,在开发人员的笔记本电脑上测试代码时将很难预见按生产规模运行时将会出现的错误,这可能会拖累我们的工作。


Java 的著名设计目标是“一次编写,到处运行”,其实是开发一个统一的代码库,可以不加更改地在从智能手表到大型机在内的任何设备上运行,而非在开发人员的电脑上开发和测试将会在任何目标基础设施中运行的应用程序。它不是为了便携而便携,而是追求_规模_的便携性:如果我在较小规模的系统中开发和测试应用程序,当我根据真实生产需求扩展和缩减时,它不应出现崩溃。


虚拟机、JVM、SaaS 和容器等创新(在一定程度上)都是为了解决这种规模的便携性挑战而诞生。由于 AWS 等云平台为客户提供了极高的规模弹性,确保规模的便携性对于开发人员而言变得更加重要。


容器是将业务应用程序和相关的库都囊括在一个容器镜像中,这个容器镜像可以根据生产的需要复制到任意数量的实例中。对于应用程序代码而言,每个实例都与在开发人员工作站上开发和测试代码时使用的环境一模一样。规模的便携性降低了代码的脆弱性。

为何要选择 ECR?

大多数的真实应用程序都由若干松散耦合的系统组成,这些系统常被称为服务或微服务,旨在根据生产需求的变化独立扩展(例如,Web 子系统的扩展速率可能需要与消息队列子系统不同)。各种子系统往往是在不同的技术堆栈上独立开发和测试的:Web 子系统可能基于 node.js 堆栈,而消息队列子系统则使用 Java 和 Kafka。在这种情况下,通过不同的容器镜像将它们容器化将更高效、更安全,提供更高性能。容器化后,我们需要扫描漏洞,管理这些容器镜像在容器存储库中的各种版本。在 AWS 中,我们可以使用 Amazon ECR 来作为容器镜像的存储库。

为何选择 Fargate 上的 ECS?

如果您需要通过一个具有多个 EC2 实例的集群来启动、配置、扩展、联网和保护多个容器,那么您将需要使用 Amazon ECS 或 Amazon EKS 等容器编排服务。如果您不想承担集群资源利用率管理等管理开销,只想按您的规格启动、配置、扩展、联网和保护您的容器,那么可以考虑无服务器计算方案:AWS Fargate。


为何要选择持续集成和持续交付?

如何构建将在应用程序的整个持续开发生命周期内部署代码更改的管道? 如何确保各独立开发人员团队每天发布到源代码存储库、形成新镜像的代码更改可以如实启动,不会导致整个应用程序的崩溃? 例如,当某个开发人员在我们的 GithHub 存储库上提出了一个 Pull 请求时,如果能在审查代码前就知道合并此 Pull 请求是否会导致构建崩溃,那将无比完美。


一旦我们确信代码更改将不会导致任何破坏,并且确实会实现需要的改进,我们会想要部署它,无需任何人运行容易出错且枯燥无味的手动命令。

为何选择 GitHub Actions?

如果您的代码存储库位于 GitHub 上,使用 GitHub Actions 将可以非常方便地执行 CI/CD 管道。它提供 Pull(提出 Pull 请求时)和 Push(将提交内容推送到您的存储库)等操作挂钩 (action hook)。这些操作挂钩可以相互连接,从而在出现某个操作 (Action) 时,将会在 GitHub 中运行相应的工作流。一个工作流由多个操作组成。


我们已将 github.com/aws-actions 的下列操作开源化:



此外我们在 GitHub Marketplace 中还提供了一个入门工作流,您可以根据需要对此工作流进行自定义以及在此基础上构建。


下面我们将逐一介绍这些操作,了解它们的原理!

分步详解

第 1 步:安装和配置 AWS CLI


请遵循设置 AWS CLI 的说明并使用您的身份进行配置。


第 2 步:配置 Amazon ECR


您可以使用与以下类似的命令创建一个 ECR 存储库,其中存储库的名称为 my-ecr-repo,区域为 us-west-2


aws ecr create-repository --repository-name my-ecr-repo --region us-west-2


更多选项请参阅 ECR 入门指南


第 3 步:创建任务定义文件


为您的项目创建一个目录:


mkdir FargateActionDemo && cd./FargateActionDemo


创建任务定义文件 task-def.json:下面是一个示例任务定义:``


Json


{    "family": "sample-fargate",    "networkMode": "awsvpc",    "containerDefinitions": [        {            "name": "fargate-app",            "image": "httpd:2.4",            "portMappings": [                {                    "containerPort": 80,                    "hostPort": 80,                    "protocol": "tcp"                }            ],            "essential": true,            "entryPoint": [                "sh",    "-c"            ],            "command": [                "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' >  /usr/local/apache2/htdocs/index.html && httpd-foreground\""            ]        }    ],    "requiresCompatibilities": [        "FARGATE"    ],    "cpu": "256",    "memory": "512"}
复制代码


第 4 步:设置 Fargate 服务


要设置 Fargate 服务,首先需要确保您的 AWS 用户具有需要的权限。您可以使用 Amazon ECS First Run Wizard Permissions 示例 IAM 策略中规定的权限。然后需要确保您的账户中具有一个 ecsTaskExecutionRole IAM 角色。您按照 Amazon ECS 任务执行 IAM 角色指南的说明来创建该角色。最后需要确保您已经创建了一个 VPC 和安全组。有关更多信息,请参阅教程:为您的集群创建带有公有和私有子网的 VPC


注册任务定义:


aws ecs register-task-definition --region us-west-2 --cli-input-json file://$HOME/FargateActionDemo/task-def.json
复制代码


创建 ECS 集群:


aws ecs create-cluster --region us-west-2 --cluster-name default
复制代码


创建 Fargate 服务:


aws ecs create-service --region us-west-2 --service-name fargate-service --task-definition sample-fargate:1 --desired-count 2 --launch-type "FARGATE" --network-configuration "awsvpcConfiguration={subnets=[subnet-abcd1234],securityGroups=[sg-abcd1234]}"
复制代码


第 5 步:配置 GitHub 存储库


从浏览器中创建存储库;在此例中,我们将存储库命名为“FargateActionDemo”。



然后提交并将任务定义推送到该存储库中:


git init


git add taskdef.json


git commit -m "first commit"


git remote add origin [](mailto:git@github.com):saptak/FargateActionDemo.git


git push -u origin master


第 6 步:配置密钥


在存储库 Settings 部分的 Secrets 中,使用某个 IAM 用户的凭证(可以从 AWS 控制台获取)配置下面的两个 Secrets


AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY
复制代码



第 7 步:添加 GitHub Actions 工作流推送以进行部署


进入存储库的 Actions 选项卡找到入门工作流。



选择 Set up this workflow 以将它添加到存储库。这时此工作流文件将会添加到存储库的 .github/workflows 文件夹。


第 8 步:配置工作流文件


首先将工作流中 aws-region 的值替换为您的存储库所在的区域。在上面的第 2 步中,我们指定 us-west-2 为我们的区域。


aws-region: us-west-2


然后将工作流中 ECR_REPOSITORY 的值替换为您的存储库的名称。在上面的第 2 步中,我们将存储库命名为 my-ecr-repo


ECR_REPOSITORY: my-ecr-repo


然后将工作流中 task-definition 的值替换为您的任务定义的文件名。在第 4 步中,我们提交并推送了我们的任务定义文件 task-def.json


task-definition: task-def.json


然后将工作流中容器名称的值替换为您在第 4 步任务定义的 containerDefinition 部分指定的容器名称。我们已将容器命名为 fargate-app


container-name: fargate-app


将工作流中 service 的值替换为第 4 步中分配的服务名称。


service: fargate-service


最后,将工作流中 cluster 的值替换为第 4 步中分配的集群名称。我们已将集群命名为 default


cluster: default


提交所有更改并推送到 GitHub 存储库。


此简单的工作流开始运行后,您可以根据自己的需要编辑工作流文件以进行工作流自定义。


第 9 步:测试部署工作流


要进行测试,请对 task-def.json 文件稍作修改。提交并推送更改。然后切换到存储库的 Actions 选项卡,这时您应会看到此工作流正在运行:


小结

容器是一个十分强大的机制,通过它可以开发能够弹性扩展的应用程序。持续集成和持续交付管道可以在迭代式的容器化应用程序开发生命周期中,将容易出错的容器构建、推送和部署工作自动化。这有利于减少能够避免的因代码更改导致的故障,从而减轻客户和工程师的烦恼。我们很高兴能继续与客户和开源社区携手,在不断成长的容器世界里进一步创新。


欢迎提出问题、提交 Pull 请求并启动我们的 GitHub 存储库,为我们提供反馈


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/github-actions-aws-fargate/


2019-11-21 08:00938

评论

发布
暂无评论
发现更多内容

年底考勤管理汇总难?织信OA管理系统无缝对接外部应用助你解决

优秀

低代码 考勤管理 OA管理系统

RocketMQ Streams:将轻量级实时计算引擎融合进消息系统

阿里巴巴中间件

阿里云 RocketMQ 云原生 中间件

接口文档自动更改?百度程序员开发效率MAX的秘诀

百度Geek说

百度 前端 工具 后端 软件开发

开源社庄表伟:开源要出圈了,推坑文化、沉浸式养鱼塘,社区建设心法了解一下 I OpenTEKr 大话开源 Vol.5

OpenTEKr

大话开源

为什么说绿色区块链是未来金融范式的必要底层?

CECBC

作业帮检索服务基于 Fluid 的计算存储分离实践

阿里巴巴中间件

云计算 云原生 中间件 存储分离 Fluid

百度智能云产业智能化新生态,新在哪里?

百度开发者中心

人工智能

LabVIEW图像增强算法(基础篇—5)

不脱发的程序猿

机器视觉 图像处理 LabVIEW 图像增强算法

使用Kubernetes部署应用

Rayzh

Kubernetes 云原生

腾讯云分布式数据库TDSQL在东吴证券新一代核心交易系统中成功落地

腾讯云数据库

tdsql 国产数据库

Java中的深拷贝和浅拷贝

Ayue、

深拷贝

性能工具之代码级性能测试工具ContiPerf

zuozewei

单元测试 性能测试 测试工具 12月日更

首个国产分布式数据库调研:TDSQL产品技术及服务能力排名

腾讯云数据库

tdsql 国产数据库

Spring Cloud Alibaba 2.2.7 版本正式发布

阿里巴巴中间件

云计算 开源 微服务 中间件 spring cloud ali

一周信创舆情观察(12.20~12.26)

统小信uos

迷雾中的自动化测试体系建设

CODING DevOps

自动化测试 接口测试 业务驱动测试

设计消息队列存储消息数据的MySQL 表格

Steven

架构实战营

ARMS 应用安全-你的应用运行时的隐形安全卫士

阿里巴巴中间件

云原生 中间件 RASP Arms

『SphereEx 年终贺礼』专注为用户提供更好的使用体验

SphereEx

开源 ShardingSphere 一键部署 SphereEx-Boot 开源公司

TDengine在水电厂畸变波形分析及故障预判系统中的应用

TDengine

数据库 大数据 tdengine 物联网 时序数据库

KubeCon China 2021 阿里云专场来了!这些首日亮点不容错过

阿里巴巴中间件

阿里云 云原生 中间件 cncf KubeCON

不用任何框架,Java 就能实现定时任务的 3 种方法!

CRMEB

高效工作?畅快游戏?来开发者Meetup探索AI技术新玩法

OpenI启智社区

人工智能 飞桨领航团

以 Kubernetes 的方式来运行极狐GitLab Runner

极狐GitLab

一年又要过去了!盘点2021年区块链的6个关键词

CECBC

Kubernetes常见组件

Rayzh

Docker Kubernetes 云原生

Cube 技术解读 | Cube 小程序技术详解

阿里巴巴终端技术

小程序 ios android 移动开发 客户端

中科柏诚:加速银行数字化转型的新引擎

联营汇聚

游戏用户LTV预测实践

bilibili游戏技术

阿里云王志坤:强劲可靠、无处不在的云,为创新保驾护航

阿里云弹性计算

弹性计算 年度峰会

突破底层基础架构瓶颈,揭秘TDSQL存储核心技术

腾讯云数据库

tdsql 国产数据库

借助 GitHub Actions 将容器应用程序持续交付到 AWS Fargate_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章