先前介紹的使用 Auto Scaling Group 的基本單位為 EC2,也就是當我們偵測的目標增加或減少時,擴展或是縮減的單位都是 EC2 實例,但這對於實際佈署而言,單位大了一點,這不只會影響佈署的成本,也影響反應的時間,接下來我們試著以容器 (Container) 為我們擴縮的單位。下圖為我們要實作的環境, ELB是需要對外開放所以放在公有子網,考慮容錯,所以跨兩個可用區,而 ECS Cluster 因為需要與外界存取,所以也放在公有子網,如果考慮安全的話可以放在私有子網,但需要增加 NAT Instance或是NAT Gateway。
圖 01、具有自動擴展功能的應用程式架構-以 Container 為基礎
基礎環境指的是網路環境、容器的內容以及負載均衡器。接下來的操作其實跟 ASG 步驟縮放政策 Step scaling policies - Day15 類似,可以參照該網址,但為方便起見我們還是操作一遍
接下來我們要規畫的是如何讓一群容器來協助應用,所以先建立一個叢集,主要是說明需要多少實體來裝容器 (ECS 叢集),接著指定容器要如何運作 (task definition) ,最後是把任務指定給叢集來執行 (Create Service)。在 task definition 中要特別注意兩件事,首先是一個實例可以執行多個容器,但每個容器都是執行網頁伺服器的服務,也就是常駐在 port 80 的服務,所以我們就沒辦法像先前執行的方式用 docker run -t -i -p 80:80 ithome-container
,因為主機的埠號是變動的,這一個部分, AWS 是夠過 ALB 來克服,因為ALB是應用層級的,所以它可以根據應用請求 (HTTP request)來做分配,幫開發者解決這個問題;第二個問題其實也是因為第一個問題所衍生的,正常來說,開發者會設定安全組 (Security Group)來進行安全管控,但從 ALB 到 EC2 之間的連線埠號是不確定的,那要如何做安全控管,這時候我們就可以運用安全組套疊的特性,也就是在安全組 2 (Security group 2) 中允許所有來自安全組 1 (Security group 1) 的連線,請參閱圖 01。
圖 02、新增叢集
我們選擇 EC2 Linux + Networking
圖 03、選擇叢集樣板
Instance configuration
Cluster name: ithomeCluster
EC2 instance type: t2.micro
EC2 Ami Id: Amazon Linux 2
Root EBS Volume Size (GiB): 30
Key pair: ithome
圖 04、叢集實例組態
Networking
VPC : vpc-0bb7004b67556d0da (172.16.0.0/16) | ithomeVPC
Subnets :
subnet-06f56dccb2a9cfcf0
(172.16.0.64/26) | ithome public subnet 2 - ap-southeast-1b
subnet-0f1df807467b642f6
(172.16.0.0/26) | ithome public subnet 1 - ap-southeast-1a
Auto assign public IP: Enabled
Security group: ithomeClusterSG
CloudWatch Container Insights: Enable Container Insights
圖 05、叢集網路組態
要特別注意的是,目前為止,我們只是透過 ECS 來幫忙建立一個 EC2 的叢集系統,所以它自動幫我們產生了兩個服務:啟動組態 (Launch configuration) EC2ContainerService-ithomeCluster-EcsInstanceLc-xxxxxxxxxxxxx 跟自動擴縮群組 (Auto Scaling group) EC2ContainerService-ithomeCluster-EcsInstanceAsg-xxxxxxxxxxxxx ,可以透過下圖發現。
圖 06、ECS 叢集組態
而這兩個服務是由 ECS 呼叫 Amazon CloudFormation 來生成的,可以進入 CloudFormation 主控台(點選左上方的服務,輸入 CloudFormation 即可),可以看到由 ECS cluster 所生成的 EC2ContainerService-ithomeCluster,點選 Resources 就可以看到所建立的兩個資源:EcsInstanceAsg、EcsInstanceLc
圖 07、CloudFormation 資源
來到 EC2 主控台,按下左手邊的 Auto Scaling Groups,就可以看到由 CloudFormation 所建立的自動擴縮群組 EC2ContainerService-ithomeCluster-EcsInstanceAsg-xxxxxxxxxxxxx,而點選這個擴縮群組後就可以發現它的組態就是剛剛 ECS Cluster 中所做的設定,並且已經自動連結啟動組態 EC2ContainerService-ithomeCluster-EcsInstanceLc-xxxxxxxxxxxxx,
圖 08、自動擴縮群組組態
檢查完這些後,回到 Amazon ECS 主控台,點選左手邊的 Clusters,選取剛剛建立的 ithomeCluster,請務必注意 Registered container instances 是否有值,如果為 0,就表示這個從叢集內沒有對應的 EC2 實例,這樣是沒辦法進行下一步的,所以務必要確認,這個叢集是否有可以提供服務的 EC2 實例。
圖 09、確認叢集內的 EC2 實例是否執行
後續還有些步驟,明天繼續。
References