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。审核所有信息之后启动集群。
等待几分钟时间,直至所有状态都变成“complete”。
查看 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 \
(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
当然,在测试阶段,可以赋予一个 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/
评论