等了很久,AWS Fargate昨天终于在中国区上线了。本文记录下Fargate的配置方法。

什么是AWS Fargate

AWS ECS有两种集群模式:EC2和Fargate。
EC2模式需要自己去创建维护整个集群。维护集群的成本比较高。
而Fargate可以让我们专注于应用本身的开发,不需要去管理后台的服务器。

使用Fargate

架构图

AWS Fargate 初体验 - 图1

准备工作,创建一个demo docker镜像

第一步,创建一个nodejs应用程序,代码很简单,就是express server返回一个200 status code。

  1. const express = require("express");
  2. const app = express();
  3. const port = 8088;
  4. const basePath = "/fargate-demo/";
  5. app.get(`${basePath}health`, (req, res) => {
  6. res.status(200).send({
  7. status: "up"
  8. });
  9. });
  10. app.listen(port, () => {
  11. console.log(`server is running on port ${port}`);
  12. });

第二步,创建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

AWS Fargate 初体验 - 图2

Fargate需要指定task memory以及task cpu

AWS Fargate 初体验 - 图3

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

AWS Fargate 初体验 - 图4

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

AWS Fargate 初体验 - 图5

原因是每个Fargate task都是独立的不需要考虑端口被占用的情况。
EC2是多个容器共享一台服务器,端口需要动态分配

创建服务

配置服务,启动类型选择Fargate

在第二步网络配置的时候:

  1. 选择集群VPC来运行服务
  2. 选择子网
  3. 安全组,创建一个新的,配置允许容器暴露端口能被负载均衡安全组访问,否则负载均衡器没办法路由到task
  4. 自动分配IP, 当2中的子网是公共子网的时候,需要设置为启用。私有子网的时候设置为禁用,但是需要在同一个VPC配置一个NAT在公有子网。原因是ENI需要访问互联网从ECR拉取镜像
  5. 配置负载均衡器,没啥好说的,和之前EC2模式时候一样

AWS Fargate 初体验 - 图6

AWS Fargate 初体验 - 图7

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

测试服务

AWS Fargate 初体验 - 图8