写点什么

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

  • 2019 年 10 月 25 日
  • 本文字数:4345 字

    阅读完需:约 14 分钟

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。审核所有信息之后启动集群。




等待几分钟时间,直至所有状态都变成“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 \

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


2019 年 10 月 25 日 08:00805

评论

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

清华大牛带领20位大厂专家耗时三年整理出这份2000页Java进阶指南

Java~~~

Java MySQL 架构 面试 微服务

【前端 · 面试 】JavaScript 之你不一定会的基础题(一)

编程三昧

JavaScript html5 大前端 8月日更 事件冒泡

Golang中的Remove和RemoveAll的对比分析

liuzhen007

8月日更

占楼

IT蜗壳-Tango

8月日更

熬夜28天肝完这25W字的九大Java核心专题,连续拿下多个大厂offer

Java~~~

Java 架构 面试 JVM 架构师

2021年最佳VUE3 UI框架推荐

devpoint

Vue3 antd vue vue2 8月日更

毕业总结

方堃

求阿里大神整理的分布式核心笔记出炉了,GitHub刚发布就标星85k

Java~~~

Java 架构 面试 微服务 JVM

Nginx原理解析

杜少雄

nginx 8月日更

让GitHub低头!这份阿里内部的10W字Java面试手册到底有多强?

Java~~~

Java spring 面试 微服务 JVM

未来25年看隐私计算与区块链

CECBC

运营宠物类自媒体:明确受众和自己的定位

石头IT视角

网络攻防学习笔记 Day103

穿过生命散发芬芳

态势感知 网络攻防 8月日更

猎杀时刻!疯狂狩猎大厂offer,阿里高工总结698页Spring学习笔记

Java 编程 架构 面试 架构师

什么是分布式超媒体信息获取系统?

escray

学习 极客时间 如何落地业务建模 8月日更

优秀的求职者,是如何巧妙应对面试提问呢?

xcbeyond

面试 求职 8月日更

有状态算子和应用(七)

数据与智能

flink 算子 状态

Linux之ss命令

入门小站

Linux

架构实战营毕业总结

thewangzl

MinIO Client 使用(二)

耳东@Erdong

Minio client 8月日更 minio client

滴滴最看重的SpringCloud手册曾被疯狂转载,现在学还有用吗?

Java~~~

Java 架构 面试 微服务 Spring Cloud

【设计模式】责任链模式

Andy阿辉

C# 后端 设计模式 8月日更

【Redis 学习笔记】1、Redis 简介

村雨遥

8月日更

IntelliJ IDEA 如何在 Java 中进行快速注释

HoneyMoose

旗舰机怎么做隐私安全?荣耀Magic3有个答案

脑极体

Redis入门到超神 - 03 redis.conf配置文件详解

陈皮的JavaLib

redis 运维 8月日更

用区块链技术实现电力供给“三流合一”

CECBC

交易所市值管理机器人搭建,项目方市值管理软件源码

13823153121

前端之算法(二)选择和插入排序

Augus

8月日更

MySQL专栏(三)-->事务控制那些事

卢卡多多

MySQL 8月日更

在线HTTP/HTTPS协议GET,POST,RESTful接口测试

入门小站

Linux

AWS Fargate,无服务器化容器解决方案_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章