1. 想想看如何在 EC2 上部署 Container
如果我們想要使用 AWS EC2 來部署 Container 的話,我們可行的做法大概如下
- 創建一個 VPC
- 在 VPC 裡創建兩個以上的 public subnet,分別放到 2 個 Availability Zone
- 創建 EC2 instance template 並在 user data 裡為 EC2 instance 安裝 Docker 以後拉下程式的 Docker Image,然後運行 Container,一個 EC2 instance 會運行多個 Container
- 創建 EC2 Auto Scaling Group 和 Load Balancer 將流量導到這些 EC2 Instance
但是我們該如何在每個 EC2 Instance 裡放入這些 Container,我們會需要 container orchestration 來進行管理,也就是容器編排,這就談到我們今天的主角了 “AWS ECS”,以上流程建立出來的架構大概會是這樣
2. AWS Fargate
看完上面的架構心都涼了,明明只想部署個 Container 怎麼這麼困難,這時候 AWS Fargate 來拯救你了,AWS Fargate 是一個服務讓你用 Serverless 的方式來使用 AWS ECS ,基本上它幫你把要管理 EC2 的任務拿走了,所以使用的架構圖就會變成這樣
你可以看到 Container 一樣分布在兩個 AZ 底下,Container 一樣被 ECS 管理,但是你看不到 EC2,因為 Fargate 已經這層抽象化了,這樣你就可以專注開發上了
使用 Fargate,你只需要定義 Container 運行時需要的東西就好:
- 你要用的 Docker Image
- 你要分配多少記憶體
- 你要幾顆 CPU
- Network: Container 要向外開哪個 port
- IAM 權限
2.1 相關名詞解釋
在開始實作前我們有些專有名詞需要知道,這些專有名詞其實來自 ECS
- Cluster: 可以想成是一個界定的範圍內的 infrastructure 用來部署你的 Container,你可以在任何 VPC 下定義 Cluster,你可以選擇要將 Container 部署在哪些 subnet 底下,Fargate 會幫你管理 Cluster
- Service 和 Task: Service 將 Task 部署你到你的 Cluster 裡,Task 是一層用來運行 Container 的 Wrapper
- Container Definition: 用來定義 Container 一些執行時的相關設定,ex: image memory, port
- Task Definition: 也用來定義 Container 一些執行時的相關設定,ex: IAM 等
- Service: 定義你要跑幾個 Container、、Load Balancer
一層一層向外設定
2.2 實作:用 Fargate 部署一個 Nginx Container
到 ECS 頁面後選擇下 Get Started
- 定義 Container Definition 和 Task definition
選擇 Nginx 點 Next 就好,AWS 預設 Task Definition 名稱是 first-run-task-definition
- 定義 Service
一樣,不需要更改,直接下一步就好,預設的 Security Group 已經開啟 80 port 了
- 定義 Cluster
這邊我將 Cluster 名稱改成 nginx-test-cluster,方便等一下辨認
- 最後看一下沒問題就按下 Create
- 等 Task 的狀態變為 Running 後,我們就可以連到剛剛創建的 Nginx Container 了
將 Public IP 貼到瀏覽器就可以看到 Nginx 的 html 了