iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0

到目前為止我們都只開一個 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.asgvpc_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:

https://ithelp.ithome.com.tw/upload/images/20231006/2016067177mb0kPsqd.png

兩個 EC2 instance 分別開在兩個 AZ 的 private subnet:

https://ithelp.ithome.com.tw/upload/images/20231006/20160671RuS6apsafi.png

https://ithelp.ithome.com.tw/upload/images/20231006/20160671iGUkQw74nY.png

ECS cluster 的 infrastructure 可以看到兩個 container instance 各有 2 個 running task:

https://ithelp.ithome.com.tw/upload/images/20231006/20160671EthAiD05Cz.png

這樣,我們完成 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:

https://ithelp.ithome.com.tw/upload/images/20231006/20160671fqqG8a2Jo6.png


上一篇
Day 25 ECS Rolling Deployment 流程與 min/max 參數
下一篇
Day 27 加上 CDN
系列文
AWS ECS + Gitlab + Laravel + Terraform 從入門到摔坑30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言