到目前為止我們都只開一個 container instance 跟兩個 task,這樣雖然有兩個 task 可以分擔工作,但都只在一台 EC2 instance 上,如果這台 EC2 instance 掛掉,整個 application 就掛掉了QQ
為了有更好的 availability,在有機器甚至機房出問題時我們的 application 能維持運作,今天我們要把架構改成經典的 High Availability(HA)架構!(本日程式碼)
首先,在另一個 AZ ap-northeast-1c 建立一個 private subnet:
resource "aws_subnet" "private_1c" {
vpc_id = aws_vpc.vpc.id
assign_ipv6_address_on_creation = false
availability_zone = "${var.region}c"
cidr_block = "172.16.101.0/24"
enable_dns64 = false
enable_resource_name_dns_a_record_on_launch = false
enable_resource_name_dns_aaaa_record_on_launch = false
map_public_ip_on_launch = false
private_dns_hostname_type_on_launch = "ip-name"
tags = {
Name = "my-app-private-1c"
}
tags_all = {
Name = "my-app-private-1c"
}
}
resource "aws_route_table_association" "private_1c" {
route_table_id = aws_default_route_table.main.id
subnet_id = aws_subnet.private_1c.id
}
讓 auto scaling group 把 EC2 instance 開到兩個 private subnet 上,修改 aws_autoscaling_group.asg
的 vpc_zone_identifier
:
vpc_zone_identifier = [aws_subnet.private_1a.id, aws_subnet.private_1c.id]
接下來把 auto scaling group 的 desired capacity 調成 2、ECS service task 的 desired count 調成 4:
resource "aws_autoscaling_group" "asg" {
desired_capacity = 2
min_size = 2
max_size = 2
...(ignore other attribute)
}
resource "aws_ecs_service" "service" {
desired_count = 4
...(ignore other attribute)
}
觀察 EC2 instance 跟 task:
兩個 EC2 instance 分別開在兩個 AZ 的 private subnet:
ECS cluster 的 infrastructure 可以看到兩個 container instance 各有 2 個 running task:
這樣,我們完成 High Availability 了。
(迷之音:就這樣??)
對,就這樣。
前面把 container、auto scaling group 跟 ALB 設置好 (拜~託~前面鋪梗鋪了那麼久!) ,要達到 HA 只要在多個 AZ 啟動 EC2 instance、讓 container 執行在上面就可以了。在兩個 AZ 的情況下,即使有一個 AZ 掛掉,我們的 application 依然能夠提供服務,只是一小段時間內能夠處理的流量會降低。
如果兩個 AZ 不夠,可以把 ap-northeast-1d 也加進來,一樣新增 public 跟 private subnet、讓 ALB 連上 public subnet、把 EC2 instance 開進 private subnet 就可以了。
這樣的 high availability 是限制在單一 region 中的。如果整個 region 掛掉,那當然我們的 application 還是會掛掉。要處理這種狀況就要把 HA 層級往上提升到跨 region,可能是讓另一個 region 有備援的 infrastructure,也可能是直接有個也在運作中的 application,要做到什麼程度端看需求跟 $$ 而定。(本系列文不會講到那裡去XD)
現在的架構就是個經典 HA 架構啦~多了一個 AZ 會開 EC2 instance 跟跑 container: