Fargate不是发糕不能吃

Fargate吃不到

ECS Fargate是一个Serverless的服务,Serverless顾名思义就是无服务器,不用花时间去管理EC2,由AWS去分配Fargate的资源并维护host,相比之下,ECS则可以连进EC2 host做参数设定,以及docker exec进到container debug。主要还是取决应用场景。

运作原理

Fargate也是会由Cluster、Service和Task三者组成服务。

ECS EC2 mode与Fargate mode在CDK上,会有很多相似之处,主要差别会在於,EC2以及EBS上的设定,而Fargate mode就不需要做EC2 & EBS的设定。此篇,subnet的设定会以Day15的方式去建置

VPC设定,由自己去设定public subnet,这边不会用到private subnet,所以将NAT参数设成0

vpc = ec2.Vpc(self, "VPC", 
        cidr="10.0.0.0/16",
        enable_dns_hostnames=True,
        enable_dns_support=True,
        max_azs=0,
        nat_gateways=0)

Public Subnet设定,参数如同前面章节一样

public_subnet = ec2.Subnet(self, "public-subnet1", 
        availability_zone="us-east-2a",
        cidr_block="10.0.10.0/24",
        vpc_id=vpc.vpc_id,
        map_public_ip_on_launch=True)
        public_subnet.add_default_internet_route(gateway_id=vpc.internet_gateway_id, gateway_attachment=vpc)

增加Security Group的设定,但只允许HTTP protocol对外,因为Fargate把Host封装起来,我们是无法访问,所以就无需增加SSH rules

sg = ec2.SecurityGroup(self, "CDK-SG", 
        vpc=vpc,
        description="cdk create security group",
        security_group_name="cdkSG")

sg.add_ingress_rule(peer=ec2.Peer.any_ipv4(), connection=ec2.Port.tcp(80), description="cdk allow anywhere about HTTP protocol")

Cluster选择Fargate的形式

cluster = ecs.Cluster(self, "Fargate-Cluster",
        enable_fargate_capacity_providers=True,
        vpc=vpc)

定义Fargate Task,在设定CPU和Memory的时候,Memory必须为2倍的CPU。在设计应用程序的时候,也需要给予足够多的Memory,因为应用程序在执行的时候,若Memory不足很容易造成,程序崩溃。

task = ecs.FargateTaskDefinition(self, "fargate-task", 
        cpu=1024,
        memory_limit_mib=2048,
        )

将Task加入Container

task.add_container(id="app",
        image=ecs.ContainerImage.from_registry("johnson860312/awswebdb"),
        container_name="mycontainer",
        port_mappings=[
            ecs.PortMapping(container_port=80,
            host_port=80,
            protocol=ecs.Protocol.TCP)
        ],
        cpu=128,
        memory_reservation_mib=256
        )

最後再由Service去做Task的执行使用,设定Public IP以及在哪个Subnet上

svc = ecs.FargateService(self, "fargate-svc",
            task_definition=task,
            cluster=cluster,
            security_groups=[sg],
            assign_public_ip=True,
            vpc_subnets=ec2.SubnetSelection(
                subnets=[public_subnet, public_subnet2]
            ),
            desired_count=3
        )

结果

https://ithelp.ithome.com.tw/upload/images/20211001/20140172ICafb54wmi.png
https://ithelp.ithome.com.tw/upload/images/20211001/20140172RHkWIkeeCu.png

结论

上述的做法就可以快速建立Fargate,并将想要应用程序执行在Container,并在browser上访问


<<:  第16车厢-提示我一下嘛!bootstrap-tooltip应用篇

>>:  Day16 PHP的常用函数-1:数学、字符串函数

Day15 - 在 Next.js 做 JWT 验证,使用既有的 Backend API - PART 1

NextAuth + JWT authentication 虽然 Next.js 的定位是一个全端框...

[Day19] 参数(上)

前面讲 函式 function 时提到参数,回头看自己打的文章发现错误的地方修正了一下。 Param...

[Day 09] 用HttpClientFactory实践WebAPI服务 - 升级永丰API至.Net Core

如果有从永丰银行API那边下载过C#版的丰收款QPay.SampleCode,应该能发现他们目前的专...

InnoDB统计资料是如何收集的

innodb以表为单位来搜集统计资料,分为两种资料 基於磁碟的永久性统计资料。顾名思义存在磁碟,服务...

Proxmox VE 虚拟机管理操作 (二)

虚拟机的建置与操作已经来到基本使用的程度了,对於各种应用修改与尝试後可能伴随虚拟机被搞砸的风险。 ...