等了很久,AWS Fargate昨天终于在中国区上线了。本文记录下Fargate的配置方法。
什么是AWS Fargate
AWS ECS有两种集群模式:EC2和Fargate。
EC2模式需要自己去创建维护整个集群。维护集群的成本比较高。
而Fargate可以让我们专注于应用本身的开发,不需要去管理后台的服务器。
使用Fargate
架构图

准备工作,创建一个demo docker镜像
第一步,创建一个nodejs应用程序,代码很简单,就是express server返回一个200 status code。
const express = require("express");const app = express();const port = 8088;const basePath = "/fargate-demo/";app.get(`${basePath}health`, (req, res) => {res.status(200).send({status: "up"});});app.listen(port, () => {console.log(`server is running on port ${port}`);});
第二步,创建dockerfile
FROM node:10.16.3-alpine
WORKDIR /usr/src/app
COPY package.json ./
COPY yarn.lock ./
RUN yarn install
COPY . .
EXPOSE 8088
CMD [ "node","index.js" ]
第三步,构建镜像,打标签
docker build -t xxxxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/fargate-poc:latest .
第四步,登录AWS ECR,推送镜像
$(aws ecr get-login --no-include-email --region cn-north-1)
docker push xxxxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/fargate-poc:latest
创建ECS集群
只需要指定cluster name就可以了,可以认为是一个空的集群
aws ecs create-cluster --cluster-name fargate-demo-cluster
创建任务定义
为了更直观,用控制台界面去创建,和EC2模式不同的主要有:
网络模式为 fargate为awsvpc,ec2为bridge

Fargate需要指定task memory以及task cpu

Fargate容器端口直接指定暴露出来的端口,而EC2需要有个动态mapping

日志配置选awslogs,把日志打印到cloudwatch里

原因是每个Fargate task都是独立的不需要考虑端口被占用的情况。
EC2是多个容器共享一台服务器,端口需要动态分配
创建服务
配置服务,启动类型选择Fargate
在第二步网络配置的时候:
- 选择集群VPC来运行服务
- 选择子网
- 安全组,创建一个新的,配置允许容器暴露端口能被负载均衡安全组访问,否则负载均衡器没办法路由到task
- 自动分配IP,
当2中的子网是公共子网的时候,需要设置为启用。私有子网的时候设置为禁用,但是需要在同一个VPC配置一个NAT在公有子网。原因是ENI需要访问互联网从ECR拉取镜像 - 配置负载均衡器,没啥好说的,和之前EC2模式时候一样


最后一路下一步,服务就创建成功了。
测试服务

