【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

借助 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:00799

评论

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

新力量,新希望|明道云伙伴大会2022秋圆满落幕

明道云

二面美团,有惊无险已拿offer,不得不说“太难了”

钟奕礼

Java 程序员 java编程 Java 面试题

“天翼云杯”厦门软件开发大赛开赛 为开发者提供“沃土”

Geek_2d6073

腾讯云大神亲码“redis深度笔记”,不讲一句废话,全是精华

钟奕礼

Java 程序员 java面试 java编程

JS有哪些变态语法,你知道吗?

千锋IT教育

行业分析| 智慧消防对讲

anyRTC开发者

人工智能 监控 消防 调度 快对讲

SpringBoot邮件发送demo

@下一站

编程 email Java core 11月月更

涨薪跳槽利器!清华大佬总结的Java核心突击讲,一应俱全

钟奕礼

Java java程序员 java面试 java编程

把Mybatis Generator生成的代码加上想要的注释

京东科技开发者

maven IDEA 代码注释 MyBatis标签 Generator

云计算:基于互联网的超级计算

Finovy Cloud

云计算 云渲染

京东二面:MySQL 主从延迟,读写分离 7 种解决方案

钟奕礼

Java 程序员 java面试 java编程

热门资讯:超大规模数字产业生态正在加快构建!

优秀

数字化转型

DevOps制品管理——软件“工业革命”的里程碑式改革

嘉为蓝鲸

DevOps 制品管理

【iOS逆向与安全】frida-trace命令大全

小陈

iOS逆向 ios安全 Frida ios 开发

嘉为科技彭一宽:组织度量,先做造钟人,再做报时人

嘉为蓝鲸

DevOps 度量

鲲鹏开发者创享日杭州站:你想知道的所有精彩都在这里了

Geek_2d6073

Serverless 架构下的 AI 应用开发

阿里巴巴云原生

阿里云 Serverless 云原生

双机热备与集群的区别分析-行云管家

行云管家

高可用 双机热备 双机

Jenkins + Docker 一键自动化部署 Spring Boot 项目

小小怪下士

Java Docker jenkins springboot

如何平衡客户和用户的诉求冲突?

QualityFocus

产品经理 需求 产品需求

LeetCode题解:938. 二叉搜索树的范围和,递归,JavaScript,详细注释

Lee Chen

JavaScript 算法 LeetCode

2022年中国母婴新消费市场专题分析

易观分析

母婴 消费市场

【C语言】return 关键字

謓泽

11月月更

百度APP iOS端内存优化实践-内存管控方案

百度Geek说

android 后端 内存管理 企业号十月 PK 榜

源自双11混部实战,Koordinator 如何保障应用服务质量?

阿里技术

云原生 混部技术

当Kubernetes遇见Macvlan——网络互通

陆云

南京等保测评公司有哪些?一共有几家?

行云管家

等保测评 等保备案 等保整改 南京等保测评

PID和TID的区别

源字节1号

APP开发 低代码开发 小程序开发 网站开发

新版阿里神级“高并发”教程《基础+实战+源码+面试+架构》

钟奕礼

Java java面试 java编程 程序员、

AI机器学习模型部署的典型策略

Baihai IDP

人工智能 AI MLOps 模型部署

一步一图带你深入理解 Linux 物理内存管理

bin的技术小屋

内存 内存管理 Linux Kenel 内核 内核源码

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