[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。