亚马逊AWS官方博客
AWS Fargate – 无服务器化容器解决方案
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
(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 .
docker images 556776719183.dkr.ecr.us-east-1.amazonaws.com/workshop
(5)创建DynamoDB表,Table name取名为quotes,Primary partition key取名为ID。
首先安装 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
curl -Ss http://127.0.0.1/ | jq
(8)列出所有DynamoDB数据库里面的内容,此时显示是空的,因为里面还没有数据。
curl -Ss http://127.0.0.1/quotes | jq
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”}’
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,
(4)输入名字“WorkshopAppPolicy”,Policy创建成功
(7)选择Task memory (GB),比如0.5GB;选择Task CPU (vCPU),比如0.25vCPU。然后选择“Add container”。
(8)点击“Add Container”,增加一个自定义容器,输入具体信息
(9)使用自定义的docker image,增加container成功。
六、创建应用层负载均衡ALB
(1)选择应用层负载均衡ALB
(2)输入Load Balancer的名字“workshop”,选择对应的VPC。
(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启动类型
配置ALB负载均衡,配置侦听端口和Target Group。
curl -Ss http://workshop-1435838475.us-east-1.elb.amazonaws.com/quotes | jq
在浏览器输入ALB公网域名地址,可以通过Container查询到DynamoDB里面的内容。
使用HTTP PUT方式,新增一条信息,插入到DynamoDB
至此,Amazon ECS采用Fargate启动类型,已经在VPC内部部署了Container应用,Container对外暴露了ALB负载均衡地址,应用和DynaomDB数据库完成了交互,应用可以通过负载均衡直接对外访问。接下去,我们将介绍如何利用AWS开发运维相关的服务,基于Container进行持续集成和持续部署的方案。
八、基于容器的持续集成/持续部署方案
接下来我们将采用CodeCommmit托管代码,CodeBuild进行容器应用的构建,利用Amazon ECS进行容器编排调度和部署。整个流程如下所示
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。
"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
配置CodeBuild的环境变量,Name: REPOSITORY_URI,Value: 556776719183.dkr.ecr.us-east-1.amazonaws.com/workshop
看到保持成功信息,接着点击“下一步”。Build provider选择AWS CodeBuild进行构建。
部署方式选择Amazon ECS,输入之前创建的集群名字workshop以及Service名字。
不到一杯咖啡的时间,通过CodePipeline自动完成整个过程。
通过Postman测试新增加的delete方法,首先使用HTTP PUT新增一条记录到DynamoDB。
查看HTTP GET刚刚插入的里面的数据,记录返回的ID号: 46311760-3ac9-11e8-82b5-9ba0642ae25e。ID是DynamoDB数据库的主键,根据主键进行HTTP DELETE测试。
至此,通过CodeCommit, CodeBuild, CodePipeline, Amazon ECS在Fargate中部署的代码已经生效,对外暴露负载均衡AWS ALB,并成功与DynamoDB数据库完成了增删改查等基本操作。整个流程大致如下。
附: 解决微服务系统的服务发现,可以基于ECS + Route53方案,请参考:
https://aws.amazon.com/cn/blogs/china/ecsroute-53solve-micro-sevice-problem/