今天來介紹 ECS 使用 Fargate 它是一個由 AWS 直接管理 Container 的服務,之前介紹的 EC2 使用 ECS 需要自己管理 Host 的部分,使用了 Fargate 連 Host 都不用自己管理了,聽起來是不是很吸引人呢 ヽ(●´∀`●)ノ
使用 Fargate 除了 Host 不用自己管理之外還有什麼好處呢?另外一個是 ECS agent 的部分,在之前的文章沒有介紹到其實 EC2 如果要跑 ECS 上面會跑有 ECS 的 Agent 而這個版本常常會更新(如左下角),如果更新就需要用右上角的 Update agent 去更新,在更新的時候其實 ECS 會把目前這台機器上所有的 Container 移走那可能就需要自己注意會不會有服務不穩定的問題,如果使用 Fargate 就不用擔心這件事情,因為 AWS 會處理好這件事情
如果自己維護 ECS host 還會遇到像是一台機器可能有 100 vCPU 而我們今天全部的 ECS conatiner 只用到了 80 vCPU 剩下的 20 vCPU 還是需要付費的,而使用 Fargate 就沒有這個問題,因為 Fargate 計價是直接計算 vCPU 與記憶體計價的,用多少拿多少減少資源浪費
其實也不能說沒有好處,因為如果我們有特別需求需要進入 Host 查看東西或是自己有更多的調教 Host 方法這樣在 Fargate 機器上就沒有辦法實作,所以基本上還是看有需求決定應該怎麼選擇機器
就算使用 Fargate 我們還是需要一個 Cluster 來管理我們的 Fargate 機器
const cluster = new ecs.Cluster(this, "EcsCluster", { vpc });
Fargate 需要定義自己的 Task Definition 與昨天的 EC2 一樣需要先定義 Task Definition
const taskDefinition = new ecs.FargateTaskDefinition(this, "TaskDef");
今天的測試一樣使用 amazon/amazon-ecs-sample
來當測試腳本
const container = taskDefinition.addContainer("WebContainer", {
image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample"),
memoryLimitMiB: 512,
});
container.addPortMappings({
containerPort: 80,
});
把剛剛定義好的 Cluster 與 Task Definition 組合成一個 Service
const fatgetService = new ecs.FargateService(this, "FargateService", {
cluster,
taskDefinition,
});
為了測試需要我們還是設定一個 ALB 好讓我們在外面可直接戳 DNS 拿到結果
const lb = new elbv2.ApplicationLoadBalancer(this, "LB", {
vpc,
internetFacing: true,
});
const listener = lb.addListener("Listener", { port: 80 });
listener.addTargets("ECS", {
port: 80,
targets: [fatgetService],
});
我們可以看一下如果是使用 Fargate 的 task 就不會在 ECS Instances 的地方看到任何機器囉!
其實整個程式量真的很少大概 30 行就可以起一個可以用的 Web 服務而且是高可用性的真的很簡單 ~
const vpc = new ec2.Vpc(this, "Vpc", { maxAzs: 3, natGateways: 1 });
const cluster = new ecs.Cluster(this, "EcsCluster", { vpc });
const taskDefinition = new ecs.FargateTaskDefinition(this, "TaskDef");
const container = taskDefinition.addContainer("WebContainer", {
image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample"),
memoryLimitMiB: 512,
});
container.addPortMappings({
containerPort: 80,
});
const fatgetService = new ecs.FargateService(this, "FargateService", {
cluster,
taskDefinition,
});
const lb = new elbv2.ApplicationLoadBalancer(this, "LB", {
vpc,
internetFacing: true,
});
const listener = lb.addListener("Listener", { port: 80 });
listener.addTargets("ECS", {
port: 80,
targets: [fatgetService],
});
最後我們還是測試一下 ALB 的結果,可想而知一定也是正常拉 XD
今天教大家實作 Fargate 機器,其實如果是小團隊我滿推薦使用 Fargate 的因為他的價錢其實跟實際開一台一樣等級的機器差不多,而且可以減少很多麻煩事 XD ~
文章內容主要是網路或是程式開發類型的文章
本文同步刊載於 Clarence 部落格:Day 22 - CDK 建置 Amazon Elastic Container Service(ECS) Service - Fargate
「AWS CDK 完全學習手冊:打造雲端基礎架構程式碼 IaC」
本書改編並延伸自第 12 屆 iT 邦幫忙鐵人賽獲得 DevOps 組冠軍的《用 CDK 定義 AWS 架構》系列文章,以簡單、好讀的行文風格詳述技術細節,並提供完整的程式碼範例與說明,一步一步帶領新手從零開始踏上 AWS CDK 技術達人之路。有興趣的朋友歡迎至天瓏書局選購!