終於要進入這 30 天的核心服務 ECS 了!
ECS 全名為 Elastic Container Service,是讓我們可以在上面執行 container 的 service,是這 30 天我們要使用的 container 服務。
AWS ECS 有三個 layer:
Capacity:跑 container 的 infrastructure,可以使用 AWS EC2 instance、Fargate 以及地端的 VM 三種,我們這 30 天會用到的是 EC2 instance。
Controller:deploy 及管理跑在 container 的 application 的軟體
Provisioning:操作 controller 的操作介面,例如 web console、AWSCLI、AWS SDK、AWS CDK 等等,我們主要會用 AWS 的 web console 跟後面會提到的 Terraform
要用 ECS 執行各種 task 或 service,application 必須是 container 化的~~(好像說了句廢話?)~~——做好擁有 code、執行環境與 library 等等的 image,這個 image 可以用來啟動執行 application 的 container。
以使用 EC2 instance 作為 capacity 來說,有 image 後要定義 task definition 表示想執行的工作,接著建立 ECS cluster 並把執行 container 的 EC2 instance 註冊進去,最後建立 service 或 task 在 EC2 instance 上啟動 container 執行 application。
接下來讓我們從 ECS cluster 開始吧~
(補充說明:AWS 跟 Gitlab 的 UI 介面常常修改,截圖可能跟你實際看到的不一樣,但基本上參數是差不多的,如果畫面不同請大家自己找一下相同的參數。)
ECS cluster 是個集合 task、service 以及與 task 執行相關 resource 的 group。
首先進到 ECS 的 Clusters 頁面:
點選右上角 Create cluster:
設定好 cluster 的名稱。Networking 會決定 task 跟 service 執行在哪裡,我們選擇前面建立的 VPC 跟 subnet。
接下來 Infrastructure 預設會支援 Fargate。Fargate 是 serverless 的 infrastructure,AWS 會管理、讓我們不用管底下執行 task 的 EC2 instance,我們只需要管理執行起來的 task 或 service 本身。如果使用 EC2 instance 作為 infrastructure,我們要自己管理跑 task 跟 service 的 EC2 instance 以及執行的 task 跟 service,我們主要會用這個 infrastructure。最後一個選項是 External instance,讓我們可以用其他機器來執行 task 跟 service,這 30 天不會用到所以不選~
選好 EC2 instance 的作業系統、機器數量(Desired capacity)的上下限、instance type 以及 ssh 連線的 key pair,AWS 就會幫我們自動建立 Auto Scaling Group。其他設定留預設值,點 Create。
cluster 建立好會看到:
現在新版介面會用一個 CloudFormation stack 產生 cluster 及 auto scaling 相關的 resource 並且把 cluster 跟 EC2 auto scaling group 連結起來。這讓 ECS 可以依據 infrastructure 資源使用量以及 task/service 的需求動態調整 auto scaling group 內的 EC2 instance 數量——如果 EC2 instance 不足以滿足 task/service 的需求,ECS 會叫 auto scaling group 多開 EC2 instance。反之,如果資源利用率太低,ECS 就叫 auto scaling group 減少 EC2 instance 以降低成本。
可以到 CloudFormation 的 stacks 找對應的 stack(通常會叫 Infra-ECS-Cluster-[CLUSTER_NAME]-XXXXX
)看看它建立了些什麼(話說舊介面沒有用 CloudFormation 來建立 ECS cluster,網頁按完根本不知道它到底做了什麼QQ):
既然 AWS web console 直接幫我們把 auto scaling group 建好了,我們來啟動一台 EC2 instance 讓它成為 ECS cluster 可以使用的 infrastructure 資源吧!
使用前我們先了解一下 AWS EC2 Auto Scaling Group 是什麼~~~(不能吃)~~
EC2 Auto Scaling Group(縮寫 ASG)讓使用者可以用適當數量的 EC2 instance 來運行 application,我們可以指定 ASG 裡最少必須有幾台 EC2 instance、最多不能超過幾台(maximum)以及一開始想要幾台(desired)。之後利用不同的規則讓 Auto Scaling Group 自動增減 EC2 instance 的數量,像是如果 EC2 instance 的 CPU loading 超過 75%,就要多啟動 instance 來分擔 loading(scale out)。如果 instance loading 小於 10%,便減少 instance 數量降低成本(scale in)。
這是 Auto Scaling Group 示意圖 (source),它最少必須維持一台 EC2 instance(minimum size)、最多只能開到四台(maximum size),一開始指定開兩台(desired capacity)來執行 application。實心的方框是目前啟動的 EC2 instance,虛線的則是 Auto Scaling Group 依據 loading 及規則在需要時會啟動的 EC2 instance。這三個參數的大小關係要符合 Minimum capacity <= Desired capacity <= Maximum capacity。
Auto Scaling Group 會啟動怎麼樣的 EC2 instance 呢?它會開什麼作業系統?會開多大台?開在哪個 subnet 裡?又有多少硬碟空間?總不是隨便亂生的吧?這就用到 Launch Template 了~
Launch Template 是啟動 EC2 instance 的模板,裡面有 AMI、instance type、硬碟、網路等等相關參數。以 Launch Template 啟動 EC2 instance,instance 各項參數就是由 Launch Template 內的參數決定的。Auto Scaling Group 會有一個 Launch Template,ASG 的 EC2 instance 便是以這個 Launch Template 啟動的。
到 EC2 Auto Scaling Group 頁面,點選剛剛建立的 auto scaling group,通常會叫作 Infra-ECS-Cluster-[CLUSTER_NAME]-xxxxxx-ECSAutoScalingGroup-xxxxxxxxx
。進入 auto scaling group 後點選 Details 的 Edit:
把 Desired Capacity 調成 1(注意三者的大小關係):
update 後到 instance management tab,稍等一下會看到開啟的 EC2 instance:
然後我們到 ECS cluster 的 infrastructure 應該要看到 container instance……
嗯,空的。(這就是 devops 的日常~^_^)
出了什麼問題呢?連進 EC2 instance 看看吧~讓我們看看 EC2 instance 的 IP:
呃,沒有 public IP address,真棒。
為什麼沒有呢?檢查一下它所在的 subnet 的設定:
subnet 預設不會給 public IP address,AWS 自動幫我們生的 launch template 也沒有指定要給 public IP address,自然就不會有囉~現在我們先把 auto scaling group 的 desired capacity 調成 0 來關掉目前開的 EC2 instance,接著修改 subnet 的 auto-assign public IPv4 address 設定。
進到 subnet 選擇 Actions 中的 Edit subnet settings:
將 Enable auto-assign public IPv4 address 打勾後儲存。
再到 auto scaling group 把 desired capacity 調成 1。
EC2 instance 開好後,到 ECS cluster 看發現有 container instance 了:
可喜可賀!
欸不是啊,為什麼???我們讓 EC2 instance 有 public IP 是為了要連進去看看怎麼沒有進到 ECS cluster 啊,怎麼莫名其妙解決原本的問題了???
好的~回頭仔細看看 Container Instance 的文件 ,裡面提到:
Container instances need access to communicate with the Amazon ECS service endpoint. This can be through an interface VPC endpoint or through your container instances having public IP addresses.
Container instance 需要透過 interface VPC endpoint 或者 instance 有 public IP address 才能跟 ECS service endpoint 溝通。這說明了為什麼我們在其他設定都沒有改變、只是讓 EC2 instance 有 public IP address 就能讓它向 cluster 註冊了。
今天我們建立了 ECS cluster 並且用 Auto Scaling Group 啟動 EC2 instance,觀察它成為 ECS cluster 的 container instance。順便體驗 devops 的日常生活~(以為會動卻不會動、莫名其妙就修好東西)
最後提醒:記得 auto scaling group 的 desired capacity 要調回 0 關機器唷!