前面的章節,都是一台EC2或個別的Container去執行應用程式,雖然網站可以正常運作,但實際情況的時候,可能是網站有眾多人瀏覽,若只用一台很高規格的機器去運行維護網站,無形中就提高成本花費,且也有機會造成網站掛掉。
此篇,會接觸到AWS的新服務Elastic Load Balancing(ELB)之Application Load Balancer(ALB),流量只能走Layer 7的協議,去訪問網站,也可以達到負載分流,讓每個機器可以有效的平均使用。
按照慣例也是會採用CDK去建置,這邊會用昨日建置好的Fargate去attach ALB
ALB可以設定Listener要透過HTTP或HTTPS協議,並設定規則訪問到Target Group,在Target Group可以去設定目標機器或Container。
Users -----------> ALB -----------> Target Group (EC2, ECS, Fargate)
在使用ALB的時候,會需要有兩個以上的Subnet,所以需要建立新的Subnet
建立ALB
alb = elbv2.ApplicationLoadBalancer(self, "CDK-ALB",
vpc=vpc,
internet_facing=True,
vpc_subnets=ec2.SubnetSelection(
subnets=[public_subnet, public_subnet2]
),
security_group=sg,
load_balancer_name="cdkALB"
)
Internet_facing: True為可以對外使用
建立Target group,以及訪問協議
tg = elbv2.ApplicationTargetGroup(
self,
"CDK-TG",
port= 80,
protocol=elbv2.ApplicationProtocol.HTTP,
vpc=vpc
)
增加ALB Listener的規則,並加入Target group
listener = alb.add_listener(
"Listener",
port=80,
protocol=elbv2.ApplicationProtocol.HTTP,
default_target_groups=[tg]
)
listener.add_target_groups(
"CDK-addTG",
target_groups=[tg]
)
在Fargate Service加入新的Subnet,且在Target group加入機器或Container,最後輸出ALB DNS
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=4
)
tg.add_target(svc)
core.CfnOutput(self, "PublicDNS", value="http://" + listener.load_balancer.load_balancer_dns_name)
前面章節也是可以在EC2或ECS前面加入ALB去做到流量的分流,也讓網站可以穩定的運行