AWS Fargate 是可以与 Amazon ECS结合使用的技术,让您在运行容器时不需要管理服务器或集群。使用 AWS Fargate,你不需要搭建控制平面,只需选择合适的实例类型,或配置应用程序堆栈的所有其它部分,比如网络、扩展、服务发现、负载均衡,安全组、权限或密钥管理。你只需要构建容器镜像,定义希望它如何运行、在何处运行,并为实际需要的资源付费。Fargate天生与Amazon VPC、自动扩展(Auto Scaling)、弹性负载均衡(ELB)、身份及访问管理(IAM)角色和密钥管理集成起来。AWS花了很多时间让Fargete随时可用于生产环境,制定了确保正常运行时间达到99.99%的服务级别协议(SLA),符合支付卡行业数据安全标准(PCI)、服务组织控制(SOC)、ISO和《健康保险可携性及责任性法案》(HIPAA)等法规或标准。
目前,Amazon ECS 具有两种模式:Fargate 启动类型和 EC2 启动类型。如果使用 Fargate 启动类型,您只需将应用程序打包到容器中,指定 CPU 和内存需求,选择awsvpc网络模型和 IAM 策略,然后直接启动应用程序。如果使用EC2 启动类型,您可以对运行容器应用程序的基础设施进行更精细的服务器级控制。Amazon ECS负责跟踪集群中的所有 CPU、内存及其他资源,并根据您指定的资源要求查找最适合运行容器的服务器。无论你使用Kubernetes、Mesos、Rancher、Nomad、ECS还是其他任何系统,有了Fargate,唯一要管理的是仅仅是应用程序本身的逻辑。AWS Fargate终于让容器在云计算的环境里发挥地淋漓尽致。
本文所涉及到的内容主要是围绕着AWS Fargate 启动类型,我们将演示如何使用AWS Cloud9进行代码编辑和提交,配合CodeCommit、CodeBuild、CodePipeline、Amazon ECS,基于Fargate进行容器应用的持续集成和持续部署,对外暴露ALB负载均衡,Fargate与DynamoDB进行增删改查等数据库操作。
一、使用Fargate运行容器
Fargate可以自定义CPU和内存大小的计算资源,但不需要维护和管理底层的计算实例资源。接下来我们将使用Amazon ECS集群,并用AWS Fargate启动类型来运行容器。 点击: https://console.aws.amazon.com/ecs/home?region=us-east-1#/firstRun ,如下图所示,一个ECS集群可以启动多个Service,一个Service可以定义多个Task Definition,一个Task里面可以跑一个或者多个Container。
选择现有的sample-app的模板,网络模型选择awsvpc模式,在Task Definition中,你可以指定Task资源CPU和内存的大小。
在这里,我们先不使用ALB负载均衡,后面的实验中我们会加上这部分内容。
输入集群的名字,取名为workshop。审核所有信息之后启动集群。
查看Task状态,从一开始的PROVISIONING,到PENDING,最后变成RUNNING状态。
点击Task ID号: b956092f-4962-4342-bada-8e20802a6c44,在网络部分中可以看到网卡信息、私有IP、公有IP,以及Mac地址。
在浏览器输入公有IP地址,可以查看到httpd所在的应用已经部署成功。
二、启动Cloud9编码和提交代码
Cloud9背后运行的环境是在一台EC2上面的,VPC选择之前启动ECS集群自动创建的VPC。
三、 创建容器镜像仓库(Docker Image Repository)
(1)创建容器仓库Amazon ECR
输入容器仓库Amazon ECR的名字
(2)构建Docker镜像,首先打开Cloud9客户端,下载代码
git clone https://github.com/TerrificMao/fargate-workshop-app.git
cd fargate-workshop-app/
(3)根据下载的Dockerfile构建成docker image
docker build — tag 556776719183.dkr.ecr.us-east-1.amazonaws.com/workshop .
(4)确认构建的image是否成功
docker images 556776719183.dkr.ecr.us-east-1.amazonaws.com/workshop
(5)创建DynamoDB表,Table name取名为quotes,Primary partition key取名为ID。
(6)测试生成的docker image
首先安装 jq,jq 是一款命令行下处理 JSON 数据的开软软件,我们将用它查看返回结果。
sudo yum install -y jq
–detach代表容器将会运行在后台模式,–publish指定容器暴露80端口,–volume将AWS配置挂载到容器,使得应用可以访问AWS credentials,最后是docker镜像的地址,在前面创建Amazon ECR时生成。
docker run –detach –publish 80:80 –volume $HOME/.aws:/root/.aws \
556776719183.dkr.ecr.us-east-1.amazonaws.com/workshop
(7)测试应用
curl -Ss http://127.0.0.1/ | jq
(8)列出所有DynamoDB数据库里面的内容,此时显示是空的,因为里面还没有数据。
curl -Ss http://127.0.0.1/quotes | jq
(9)往DynamoDB里面增加一条数据
curl -Ss http://127.0.0.1/quotes -X PUT -H “Content-Type: application/json” -d ‘{“Text”:”AWS Fargate workshop demo on AWS Global Virginia region,”,”AttributedTo”:”AWS China”}’
(10)再次列出所有数据库里面的内容,可以显示内容了
curl -Ss http://127.0.0.1/quotes | jq
四. 将docker image推送至AWS ECR
首先登录到ecr
aws ecr get-login –no-include-email –region us-east-1
使用docker push推送
docker push 556776719183.dkr.ecr.us-east-1.amazonaws.com/workshop
五、创建Task Definition
(1)首先创建所需的AWS Role,选择Elastic Container Service,再选择Elastic Container Service Task,
(2)选择“创建策略”
(3)配置Fargate访问DynamoDB时所需的策略。
(4)输入名字“WorkshopAppPolicy”,Policy创建成功
(5)创建Task Definitions
(6)选择Fargate启动类型
(7)选择Task memory (GB),比如0.5GB;选择Task CPU (vCPU),比如0.25vCPU。然后选择“Add container”。
(8)点击“Add Container”,增加一个自定义容器,输入具体信息
点击“Create”
(9)使用自定义的docker image,增加container成功。
六、创建应用层负载均衡ALB
(1)选择应用层负载均衡ALB
(2)输入Load Balancer的名字“workshop”,选择对应的VPC。
(3)创建ALB的安全组
(4)由于Fargate底层不需要考虑计算资源,所以Target Type不需要选择instance,而是选择ip。
(5)注册Targets这块先不选择,可以利用ECS为我们去管理Target Group。
(6)ALB创建成功,记录DNS Name,比如: workshop-1435838475.us-east-1.elb.amazonaws.com
七、创建services选择Fargate启动类型
现在之前创建的VPC和对应的子网,并启动自动分配IP。
配置ALB负载均衡,配置侦听端口和Target Group。
暂时不选Auto Scaling
启动成功
使用命令行检查负载均衡器是否生效
curl -Ss http://workshop-1435838475.us-east-1.elb.amazonaws.com/quotes | jq
在浏览器输入ALB公网域名地址,可以通过Container查询到DynamoDB里面的内容。
或者可以选择常用的Postman进行调试
使用HTTP PUT方式,新增一条信息,插入到DynamoDB
查看HTTP PUT的执行结果
再次查看结果
从控制台检查DynamoDB中的内容
至此,Amazon ECS采用Fargate启动类型,已经在VPC内部部署了Container应用,Container对外暴露了ALB负载均衡地址,应用和DynaomDB数据库完成了交互,应用可以通过负载均衡直接对外访问。接下去,我们将介绍如何利用AWS开发运维相关的服务,基于Container进行持续集成和持续部署的方案。
八、基于容器的持续集成/持续部署方案
接下来我们将采用CodeCommmit托管代码,CodeBuild进行容器应用的构建,利用Amazon ECS进行容器编排调度和部署。整个流程如下所示
首先创建CodeCommit代码仓库,取名workshop
Event type可以先不填写。
利用命令行将代码推送到CodeCommit
git config –global credential.helper ‘!aws codecommit credential-helper $@’
git config –global credential.UseHttpPath true
git remote set-url origin https://git-codecommit.us-east-1.amazonaws.com/v1/repos/workshop
git push origin master
刷新AWS CodeCommit的控制台,发现代码已经上传。
接下去创建CodePipeline。在创建CodePipeline之前,先创建所需要的Role,选择CodeBuild。
复制如下Policy的内容,注意将resource内容替换成自己Account ID。
{
Json
"Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr:CompleteLayerUpload", "ecr:UploadLayerPart", "ecr:InitiateLayerUpload", "ecr:BatchCheckLayerAvailability", "ecr:PutImage" ], "Resource": "arn:aws:ecr:us-east-1:556776719183:repository/workshop" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "ecr:GetAuthorizationToken", "Resource": "*" } ]}输入policy的名字WorkshopBuildPolicy
当然,在测试阶段,可以赋予一个Admin的权限。(选做)
接着创建CodePipeline
配置CodeBuild
配置CodeBuild的环境变量,Name: REPOSITORY_URI,Value: 556776719183.dkr.ecr.us-east-1.amazonaws.com/workshop
看到保持成功信息,接着点击“下一步”。Build provider选择AWS CodeBuild进行构建。
部署方式选择Amazon ECS,输入之前创建的集群名字workshop以及Service名字。
至此,CodePipeline创建完毕。
客户端更改代码
推送至AWS CodeCommit仓库
CodePipeline自动检测到代码更新
自动进入到代码构建阶段
自动使用Amazon ECS部署Fargate
不到一杯咖啡的时间,通过CodePipeline自动完成整个过程。
通过Postman测试新增加的delete方法,首先使用HTTP PUT新增一条记录到DynamoDB。
查看HTTP GET刚刚插入的里面的数据,记录返回的ID号: 46311760-3ac9-11e8-82b5-9ba0642ae25e。ID是DynamoDB数据库的主键,根据主键进行HTTP DELETE测试。
执行HTTP DELETE接口
刷新DynamoDB控制台
此时记录被成功删除。
至此,通过CodeCommit, CodeBuild, CodePipeline, Amazon ECS在Fargate中部署的代码已经生效,对外暴露负载均衡AWS ALB,并成功与DynamoDB数据库完成了增删改查等基本操作。整个流程大致如下。
附: 解决微服务系统的服务发现,可以基于ECS + Route53方案,请参考:
https://aws.amazon.com/cn/blogs/china/ecsroute-53solve-micro-sevice-problem/
AWS技术峰会 2018将于8月9日在北京国家会议中心隆重拉开帷幕。在13:00 – 17:30于一层多功能厅C将会有物联网分论坛,在本论坛中,您将了解 AWS 的 IoT 服务,及聆听 AWS 用户分享基于 AWS 的智能家居、全球智能化物联网及工业互联方面的经验和实践。
想和我们一起#所建不凡#?快来注册#AWS技术峰会2018,前20名注册的小伙伴将可获得 $50亚马逊优惠券,抓住机会,赶快注册吧!https://awssummit.cn?tc=1s016B2uQi
共同学习,写下你的评论
评论加载中...
作者其他优质文章