[AWS] ECS - Fargate pratice step by step

Ref: AWS Fargate – 无服务器化容器解决方案

 

 

实践,走起来!


〇、热身

Amazon Virtual Private Cloud - 云上局域网 

在 AWS 云中预置一个逻辑隔离的部分,从而在自己定义的虚拟网络中启动 AWS 资源。 

完全掌控您的虚拟联网环境,包括选择自己的 IP 地址范围、创建子网以及配置路由表和网络网关。

Fargate天生与Amazon VPC、自动扩展(Auto Scaling)、弹性负载均衡(ELB)、身份及访问管理(IAM)角色和密钥管理集成起来。

如果使用 Fargate 启动类型,您只需将应用程序打包到容器中,指定 CPU 和内存需求,选择awsvpc网络模型IAM 策略,然后直接启动应用程序。

 

一、使用Fargate运行容器

Let's start --> sample-app

点击task id 看ip等详细信息。

 

二、代码管理

可使用Cloud9,与DBdynamic通信的代码,也即是container运行的服务代码。

const aws = require('aws-sdk');
const express = require('express');
const os = require('os');
const process = require('process');
const uuid = require('uuid');

const TABLE_NAME = 'quotes';
const DEFAULT_PORT = 8080;
const DEFAULT_REGION = 'us-east-1';

const app = express();
const documentClient = new aws.DynamoDB.DocumentClient({
  region: process.env.AWS_REGION || DEFAULT_REGION,
});

app.enable('trust proxy')
app.use(express.json())

app.use(function(req, res, next) {
  console.log(`[${req.ip}] ${req.method} ${req.path}`);
  next();
});

app.get('/quotes', function(req, res, next) {
  const params = {
    TableName: TABLE_NAME,
  };

  documentClient.scan(params).promise()
    .then((data) => res.json(data.Items))
    .catch(next);
});

app.put('/quotes', function(req, res, next) {
  if (!req.body.Text || !req.body.AttributedTo) {
    return res.status(400).json({Error: "Required fields: AttributedTo, Text"})
  }

  const id = uuid.v1();
  const params = {
    TableName: TABLE_NAME,
    Item: {
      ID: id,
      AttributedTo: req.body.AttributedTo,
      Text: req.body.Text,
    },
  };

  documentClient.put(params).promise()
    .then((data) => res.redirect(201, `/quotes/${id}`))
    .catch(next);
});

app.get('/quotes/:id', function(req, res, next) {
  const params = {
    TableName: TABLE_NAME,
    Key: {
      ID: req.params.id,
    },
  };

  documentClient.get(params).promise()
    .then((data) => data.Item ? res.json(data.Item) : res.status(404).end())
    .catch(next);
});

app.get('/', function(req, res, next) {
  res.json({Hostname: os.hostname()});
});

app.delete('/quotes/:id', function(req, res, next) {
 const params  = {
   TableName: TABLE_NAME,
   Key: {
     ID: req.params.id,
   },
};

 documentClient.delete(params).promise()
   .then((data) => res.status(200).end())
   .catch(next);
});

app.use(function(err, req, res, next) {
  console.log(err.stack);
  res.status(500).json({Error: err.message}).end();
});

process.on('SIGINT', () => process.exit(0));
process.on('SIGTERM', () => process.exit(0));

app.listen(process.env.PORT || DEFAULT_PORT);
View Code

 

三、 创建容器镜像仓库(Docker Image Repository)

 FROM node:8.9.4
 
 WORKDIR /app
 
 ENV PORT=80
 
 EXPOSE 80
 
 ADD index.js /app
 ADD package.json /app
 
 RUN npm install --silent
 
 CMD ["node", "index.js"]

80端口被nginx占用了,记得关掉。

docker run --detach --publish 80:80 --volume $HOME/.aws:/root/.aws 071223775107.dkr.ecr.us-east-1.amazonaws.com/workshop:latest

sudo nginx -s stop

* 端口打通后,可以在docker外部,通过80端口发送request,借助container中的程序访问DBdynamic,获得云上的内容。

$ curl -Ss http://127.0.0.1/ | jq
{
  "Hostname": "6ffe47365d6a"
}

 

* 往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"}'

 

* 数据库有了新的一条数据

$ curl -Ss http://127.0.0.1/quotes | jq
[
  {
    "ID": "9f762340-1e62-11eb-bf89-13a91610f125",
    "AttributedTo": "AWS China",
    "Text": "AWS Fargate workshop demo on AWS Global Virginia region,"
  }
]

 

四. 将docker image推送至AWS ECR

docker push上去。

 

五、创建Task Definition

(1)首先创建所需的AWS Role。

  

(2)选择“创建策略”

(3)配置Fargate访问DynamoDB时所需的策略。

(4)输入名字“WorkshopAppPolicy”,Policy创建成功

Policy创建好。

Role在Policy的基础上,继续创建好。

(5)创建Task Definitions - 搞定policy,就可以开始“正式配置” fargate了。

 

(6)选择Fargate启动类型

(7)选择Task memory (GB),比如0.5GB;选择Task CPU (vCPU),比如0.25vCPU。

(8)点击“Add Container”,增加一个自定义容器,输入具体信息

(9)使用自定义的docker image,增加container成功。 

 

六、创建应用层负载均衡ALB

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

在EC2下的左边栏找。

(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启动类型

1. 继续配置ECS的Server部分。

 

2. 现在之前创建的VPC和对应的子网,并启动自动分配IP。 

3. 配置ALB负载均衡,配置侦听端口和Target Group。

Container to load balance.

4. 暂时不选Auto Scaling

5. 配置完整,验证。

在ec2-->load balancer看到DNS Name。

使用命令行检查负载均衡器是否生效。

$ curl -Ss workshop-403334054.us-east-1.elb.amazonaws.com/quotes | jq
[
  {
    "ID": "9f762340-1e62-11eb-bf89-13a91610f125",
    "AttributedTo": "AWS China",
    "Text": "AWS Fargate workshop demo on AWS Global Virginia region,"
  }
]

 

End。

posted @ 2020-11-04 11:46  郝壹贰叁  阅读(529)  评论(0编辑  收藏  举报