[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);
三、 创建容器镜像仓库(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。

浙公网安备 33010602011771号