AWS Fargate,无服务器化容器解决方案

阅读数:40 2019 年 10 月 25 日 08:00

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 进行增删改查等数据库操作。

AWS Fargate,无服务器化容器解决方案

一、使用 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。

AWS Fargate,无服务器化容器解决方案

选择现有的 sample-app 的模板,网络模型选择 awsvpc 模式,在 Task Definition 中,你可以指定 Task 资源 CPU 和内存的大小。

AWS Fargate,无服务器化容器解决方案在这里,我们先不使用 ALB 负载均衡,后面的实验中我们会加上这部分内容。

AWS Fargate,无服务器化容器解决方案输入集群的名字,取名为 workshop。审核所有信息之后启动集群。

AWS Fargate,无服务器化容器解决方案 AWS Fargate,无服务器化容器解决方案等待几分钟时间,直至所有状态都变成“complete”。

AWS Fargate,无服务器化容器解决方案查看 Task 状态,从一开始的 PROVISIONING,到 PENDING,最后变成 RUNNING 状态。

AWS Fargate,无服务器化容器解决方案点击 Task ID 号: b956092f-4962-4342-bada-8e20802a6c44,在网络部分中可以看到网卡信息、私有 IP、公有 IP,以及 Mac 地址。

AWS Fargate,无服务器化容器解决方案在浏览器输入公有 IP 地址,可以查看到 httpd 所在的应用已经部署成功。

AWS Fargate,无服务器化容器解决方案二、启动 Cloud9 编码和提交代码

AWS Fargate,无服务器化容器解决方案 Cloud9 背后运行的环境是在一台 EC2 上面的,VPC 选择之前启动 ECS 集群自动创建的 VPC。

AWS Fargate,无服务器化容器解决方案AWS Fargate,无服务器化容器解决方案三、 创建容器镜像仓库(Docker Image Repository)

(1)创建容器仓库 Amazon ECR

AWS Fargate,无服务器化容器解决方案输入容器仓库 Amazon ECR 的名字

AWS Fargate,无服务器化容器解决方案 AWS Fargate,无服务器化容器解决方案(2)构建 Docker 镜像,首先打开 Cloud9 客户端,下载代码

git clone https://github.com/TerrificMao/fargate-workshop-app.git

AWS Fargate,无服务器化容器解决方案

cd fargate-workshop-app/

AWS Fargate,无服务器化容器解决方案 AWS Fargate,无服务器化容器解决方案(3)根据下载的 Dockerfile 构建成 docker image

docker build — tag 556776719183.dkr.ecr.us-east-1.amazonaws.com/workshop .

AWS Fargate,无服务器化容器解决方案(4)确认构建的 image 是否成功

docker images 556776719183.dkr.ecr.us-east-1.amazonaws.com/workshop

AWS Fargate,无服务器化容器解决方案(5)创建 DynamoDB 表,Table name 取名为 quotes,Primary partition key 取名为 ID。

AWS Fargate,无服务器化容器解决方案(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

AWS Fargate,无服务器化容器解决方案(7)测试应用

curl -Ss http://127.0.0.1/ | jq

AWS Fargate,无服务器化容器解决方案(8)列出所有 DynamoDB 数据库里面的内容,此时显示是空的,因为里面还没有数据。

curl -Ss http://127.0.0.1/quotes | jq

AWS Fargate,无服务器化容器解决方案(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”}’

AWS Fargate,无服务器化容器解决方案(10)再次列出所有数据库里面的内容,可以显示内容了

curl -Ss http://127.0.0.1/quotes | jq

AWS Fargate,无服务器化容器解决方案四. 将 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

AWS Fargate,无服务器化容器解决方案五、创建 Task Definition

(1)首先创建所需的 AWS Role,选择 Elastic Container Service,再选择 Elastic Container Service Task,

AWS Fargate,无服务器化容器解决方案(2)选择“创建策略”

AWS Fargate,无服务器化容器解决方案(3)配置 Fargate 访问 DynamoDB 时所需的策略。

AWS Fargate,无服务器化容器解决方案(4)输入名字“WorkshopAppPolicy”,Policy 创建成功

AWS Fargate,无服务器化容器解决方案AWS Fargate,无服务器化容器解决方案(5)创建 Task Definitions

AWS Fargate,无服务器化容器解决方案(6)选择 Fargate 启动类型

AWS Fargate,无服务器化容器解决方案 AWS Fargate,无服务器化容器解决方案(7)选择 Task memory (GB),比如 0.5GB;选择 Task CPU (vCPU),比如 0.25vCPU。然后选择“Add container”。

AWS Fargate,无服务器化容器解决方案(8)点击“Add Container”,增加一个自定义容器,输入具体信息

AWS Fargate,无服务器化容器解决方案点击“Create”

AWS Fargate,无服务器化容器解决方案(9)使用自定义的 docker image,增加 container 成功。

AWS Fargate,无服务器化容器解决方案六、创建应用层负载均衡 ALB

(1)选择应用层负载均衡 ALB

AWS Fargate,无服务器化容器解决方案(2)输入 Load Balancer 的名字“workshop”,选择对应的 VPC。

AWS Fargate,无服务器化容器解决方案(3)创建 ALB 的安全组

AWS Fargate,无服务器化容器解决方案(4)由于 Fargate 底层不需要考虑计算资源,所以 Target Type 不需要选择 instance,而是选择 ip。

AWS Fargate,无服务器化容器解决方案(5)注册 Targets 这块先不选择,可以利用 ECS 为我们去管理 Target Group。

AWS Fargate,无服务器化容器解决方案(6)ALB 创建成功,记录DNS Name,比如: workshop-1435838475.us-east-1.elb.amazonaws.com

AWS Fargate,无服务器化容器解决方案七、创建 services 选择 Fargate 启动类型

AWS Fargate,无服务器化容器解决方案 AWS Fargate,无服务器化容器解决方案现在之前创建的 VPC 和对应的子网,并启动自动分配 IP。

AWS Fargate,无服务器化容器解决方案配置 ALB 负载均衡,配置侦听端口和 Target Group。

AWS Fargate,无服务器化容器解决方案暂时不选 Auto Scaling

AWS Fargate,无服务器化容器解决方案启动成功

AWS Fargate,无服务器化容器解决方案使用命令行检查负载均衡器是否生效

curl -Ss http://workshop-1435838475.us-east-1.elb.amazonaws.com/quotes | jq

AWS Fargate,无服务器化容器解决方案在浏览器输入 ALB 公网域名地址,可以通过 Container 查询到 DynamoDB 里面的内容。

AWS Fargate,无服务器化容器解决方案或者可以选择常用的 Postman 进行调试

AWS Fargate,无服务器化容器解决方案使用 HTTP PUT 方式,新增一条信息,插入到 DynamoDB

AWS Fargate,无服务器化容器解决方案查看 HTTP PUT 的执行结果

AWS Fargate,无服务器化容器解决方案再次查看结果

AWS Fargate,无服务器化容器解决方案从控制台检查 DynamoDB 中的内容

AWS Fargate,无服务器化容器解决方案至此,Amazon ECS 采用 Fargate 启动类型,已经在 VPC 内部部署了 Container 应用,Container 对外暴露了 ALB 负载均衡地址,应用和 DynaomDB 数据库完成了交互,应用可以通过负载均衡直接对外访问。接下去,我们将介绍如何利用 AWS 开发运维相关的服务,基于 Container 进行持续集成和持续部署的方案。

八、基于容器的持续集成 / 持续部署方案

接下来我们将采用 CodeCommmit 托管代码,CodeBuild 进行容器应用的构建,利用 Amazon ECS 进行容器编排调度和部署。整个流程如下所示

AWS Fargate,无服务器化容器解决方案首先创建 CodeCommit 代码仓库,取名 workshop

AWS Fargate,无服务器化容器解决方案 Event type 可以先不填写。

AWS Fargate,无服务器化容器解决方案利用命令行将代码推送到 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 Fargate,无服务器化容器解决方案刷新 AWS CodeCommit 的控制台,发现代码已经上传。

AWS Fargate,无服务器化容器解决方案接下去创建 CodePipeline。在创建 CodePipeline 之前,先创建所需要的 Role,选择 CodeBuild。

AWS Fargate,无服务器化容器解决方案复制如下 Policy 的内容,注意将 resource 内容替换成自己 Account ID。

AWS Fargate,无服务器化容器解决方案{

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

AWS Fargate,无服务器化容器解决方案 AWS Fargate,无服务器化容器解决方案当然,在测试阶段,可以赋予一个 Admin 的权限。(选做)

AWS Fargate,无服务器化容器解决方案 AWS Fargate,无服务器化容器解决方案接着创建 CodePipeline

AWS Fargate,无服务器化容器解决方案 AWS Fargate,无服务器化容器解决方案 AWS Fargate,无服务器化容器解决方案配置 CodeBuild

AWS Fargate,无服务器化容器解决方案 AWS Fargate,无服务器化容器解决方案配置CodeBuild 的环境变量,Name: REPOSITORY_URI,Value: 556776719183.dkr.ecr.us-east-1.amazonaws.com/workshop

AWS Fargate,无服务器化容器解决方案看到保持成功信息,接着点击“下一步”。Build provider 选择 AWS CodeBuild 进行构建。

AWS Fargate,无服务器化容器解决方案部署方式选择 Amazon ECS,输入之前创建的集群名字 workshop 以及 Service 名字。

AWS Fargate,无服务器化容器解决方案AWS Fargate,无服务器化容器解决方案 AWS Fargate,无服务器化容器解决方案至此,CodePipeline 创建完毕。

AWS Fargate,无服务器化容器解决方案客户端更改代码

AWS Fargate,无服务器化容器解决方案推送至 AWS CodeCommit 仓库

AWS Fargate,无服务器化容器解决方案 CodePipeline 自动检测到代码更新

AWS Fargate,无服务器化容器解决方案自动进入到代码构建阶段

AWS Fargate,无服务器化容器解决方案自动使用 Amazon ECS 部署 Fargate

AWS Fargate,无服务器化容器解决方案不到一杯咖啡的时间,通过 CodePipeline 自动完成整个过程。

AWS Fargate,无服务器化容器解决方案通过 Postman 测试新增加的 delete 方法,首先使用 HTTP PUT 新增一条记录到 DynamoDB。

AWS Fargate,无服务器化容器解决方案查看 HTTP GET 刚刚插入的里面的数据,记录返回的 ID 号: 46311760-3ac9-11e8-82b5-9ba0642ae25e。ID 是 DynamoDB 数据库的主键,根据主键进行 HTTP DELETE 测试。

AWS Fargate,无服务器化容器解决方案执行 HTTP DELETE 接口

AWS Fargate,无服务器化容器解决方案刷新 DynamoDB 控制台

AWS Fargate,无服务器化容器解决方案此时记录被成功删除。

AWS Fargate,无服务器化容器解决方案至此,通过 CodeCommit, CodeBuild, CodePipeline, Amazon ECS 在 Fargate 中部署的代码已经生效,对外暴露负载均衡 AWS ALB,并成功与 DynamoDB 数据库完成了增删改查等基本操作。整个流程大致如下。

AWS Fargate,无服务器化容器解决方案

附: 解决微服务系统的服务发现,可以基于 ECS + Route53 方案,请参考:

https://aws.amazon.com/cn/blogs/china/ecsroute-53solve-micro-sevice-problem/

!
复制代码
### 毛郸榕
AWS 解决方案架构师。负责基于 AWS 的云计算方案的架构设计,同时致力于 AWS 云服务在国内和全球的应用和推广,毕业于北京航空航天大学云计算专业,硕士,毕业后直接加入 AWS 中国。在大规模并发后台架构、物联网、DevOps 以及 Serverless 无服务器架构等领域有着广泛的设计与实践经验。

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布