在本單元中,您會使用 Amazon Elastic Container Service (Amazon ECS) 具現化 EC2 運算執行個體的受管叢集,並將映像部署為在叢集上執行的容器。開始建立

架構概觀

a. 用戶端
用戶端透過連接埠 80 向負載平衡器發出請求。

b. 負載平衡器
負載平衡器會針對全體所有可用的連接埠分發請求。

c. 目標群組
執行個體會登記於應用程式的目標群組。

d. 容器連接埠
每個容器會執行單一應用程式程序,其會將 node.js 叢集父項繫結至本身命名空間內的連接埠 80。

e. 容器化 node.js 巨型應用程式
Node.js 叢集父項負責將流量分發至整合型應用程式當中的工作者。此架構雖已容器化,但由於每個容器皆具有其餘容器的所有相同功能,因此仍具整合性質。

Amazon Elastic Container Service (Amazon ECS) 是可高度擴展、高效能的容器管理服務,可支援 Docker 容器,並讓您在 Amazon EC2 執行個體的受管叢集上輕鬆執行應用程式。 只需進行簡單的 API 呼叫,便可以啟動和停止啟用 Docker 的應用程式、查詢叢集的完整狀態,及使用許多熟悉的功能,包括安全群組、Elastic Load Balancing、EBS 磁碟區和 IAM 角色。

您可以使用 Amazon ECS 來根據資源需求及可用性需求,在叢集排程放置容器。還可以整合自己的排程器或第三方排程器,以符合商業或應用程式的特定要求。

使用 Amazon Elastic Container Service 無須另外付費。您要支付為存放和執行應用程式所建立的 AWS 資源 (例如,EC2 執行個體或 EBS 磁碟區) 費用。


依照以下的逐步指示,使用 Amazon ECS 部署 node.js 應用程式。 按一下各個步驟編號以展開區段。

break-the-monolith
  • 步驟 1. 使用 AWS CloudFormation 啟動 ECS 叢集

    首先,您會建立一個部署於 Application Load Balancer 後方的 Amazon ECS 叢集。

    1. 導覽至 AWS CloudFormation 主控台
    2. 選取 Create Stack。
    3. 選取 'Upload a template to Amazon S3',然後從位於 amazon-ecs-nodejs-microservice/2-containerized/infrastructure/ecs.yml 的 GitHub 專案選擇 ecs.yml 檔案;選取 Next
    4. 針對堆疊名稱,輸入 BreakTheMonolith-Demo。將其他參數名稱維持相同:
      1. Desired Capacity = 2
      2. InstanceType = t2.micro
      3. MaxSize = 2
    5. 選取 Next
    6. 您無須修改此頁面上的任何選項。選取「Next (下一步)」。
    7. 勾選位於下個頁面底部的方塊,然後選取 Create。您會看見顯示橘色 CREATE_IN_PROGRESS 的堆疊。您可選取畫面右上方的重新整理按鈕,以檢查進度。此程序所需時間通常不到 5 分鐘。
    建立堆疊

    ⚐ 注意:您也可以使用 AWS CLI 來部署 AWS CloudFormation 堆疊。只要將您的區域新增至此程式碼,然後從電腦上 amazon-ecs-nodejs-microservices/3-microservices 資料夾的終端機中執行即可。

    $ aws cloudformation deploy \
       --template-file infrastructure/ecs.yml \
       --region <region> \
       --stack-name Nodejs-Microservices \
       --capabilities CAPABILITY_NAMED_IAM
  • 步驟 2. 檢查叢集是否已在執行中

    檢查叢集
    • 按一下進入叢集,選取 'Tasks' 標籤,此時會發現沒有任何任務處於執行中。
    任務
    • 選取 'ECS Instances' 標籤,您會看見 AWS CloudFormation 範本建立的兩個「EC2 執行個體」。
    ECS 執行個體
  • 步驟 3. 撰寫任務定義

    任務定義會告知 Amazon ECS 如何在全體叢集部署應用程式容器。

    • 導覽至 Amazon ECS 主控台左側的 'Task Definitions' 功能表。
    • 選取 Create new Task Definition。
    • Task Definition Name = api.
    • 選取 Add Container。
    • 指定下列參數。
      • 若未定義參數,請將其留空或使用預設設定:Container name = api image = [account-id].dkr.ecr.[region].amazonaws.com/api:v1 (此為先前步驟中 ECR 存放庫映像的 URL)。
      • 確認標籤 :v1 符合您在單元 1 中使用的數值,以標記和推送映像。Memory = Hard limit: 256 Port mappings = Host port:0, Container port:3000 CPU units = 256
    • 選取 Add。
    • 選取 Create。
    • Your Task Definition 現在將顯示於主控台。
    任務定義
  • 步驟 4. 設定 Application Load Balancer:目標群組

    Application Load Balancer (ALB) 可讓服務接受內送流量。ALB 會自動將流量路由至叢集中執行的容器執行個體,並使用這些執行個體做為目標群組

    檢查 VPC 名稱:若您不是第一次使用此 AWS 帳戶,則您可能具有多個 VPC。請務必使用正確的 VPC 來設定「目標群組」。

    • 導覽至 EC2 主控台的 Load Balancer 區段
    • 您應會發現 Load Balancer 已具有命名的示範。
    • 選取核取方塊以查看 Load Balancer 詳細資訊。
    • 記下位於詳細資訊頁面的 VPC 屬性值。
    vpc 屬性

    設定 ALB 目標群組

    • 導覽至 EC2 主控台的 Target Group 區段
    • 選取「Create target group (建立目標群組)」。
    • 設定「目標群組」(若未在此處指定目標群組,請勿修改預設值):
      • Name = api
      • Protocol = HTTP
      • Port = 80
      • VPC = 選取符合在先前步驟中所用 Load Balancer 的 VPC。此項目最「不」可能是預設 VPC。
      • 進階運作狀態檢查設定:Healthy threshold = 2 Unhealthy threshold = 2 Timeout = 5 Interval = 6。
    • 選取 Create。
    建立目標群組
  • 步驟 5. 設定 Application Load Balancer:接聽程式

    接聽程式會檢查 ALB 的內送連線請求。

    新增接聽程式至 ALB

    • 導覽至 EC2 主控台的 Load Balancer 區段
    • 您應會發現 Load Balancer 已具有命名的示範。
    • 選取核取方塊以查看 Load Balancer 詳細資訊。
    • 選取「Listeners (接聽程式)」標籤。
    • 選取 「Create Listener (建立接聽程式)」:
      • Protocol = HTTP
      • Port = 80
      • Default target group = api
    • 按一下 Create。
    ALB 接聽程式
  • 步驟 6. 部署巨型應用程式即服務

    您現會將巨型應用程式即服務部署至叢集。

    • 導覽至 Amazon ECS 主控台左側的 'Clusters' 功能表。
    • 選取您的叢集:BreakTheMonolith-Demo-ECSCluster
    • 在服務標籤下方,選取 Create。
    • 設定服務 (請勿修改任何預設值):Service name = api Number of tasks = 1
    • 選取 Configure ELB:
      • ELB Type = Application Load Balancer。
      • 針對 IAM 角色,選取 BreakTheMonolith-Demo-ECSServiceRole
      • 選取 Load Balancer ELB name = demo。
      • 選取 Add to ELB。
    • 將服務新增至目標群組:
      • Listener port = 80:HTTP
      • Target group name = 選取您的群組:api
    • 選取「Save (儲存)」。
    部署服務
    • 選取「Create Service (建立服務)」。
    • 選取「View Service (檢視服務)」。
    選用設定

    做得好!您現在已有執行中的服務。容器可能需要一分鐘時間登記為運作良好並開始接收流量。

  • 步驟 7. 測試巨型應用程式

    檢查是否可從網際網路使用服務並進行偵測,以驗證部署作業。

    尋找服務 URL

    • 導覽至 EC2 主控台的 Load Balancers 區段。
    • 選取負載平衡器示範。
    • 將 DNS 名稱複製並貼至瀏覽器。
    • 您應會看見 'Ready to receive requests' 訊息。


    查看服務的每個部分:
    node.js 應用程式會根據 URL,將流量路由至每個工作者。若要查看工作者,只要將工作者名稱 api/[worker-name] 新增至「DNS 名稱」的結尾即可,例如:

    • http://[DNS 名稱]/api/users
    • http://[DNS 名稱]/api/threads
    • http://[DNS 名稱]/api/posts

    您也可以在 URL 末尾新增記錄號碼,以向下切入至特定記錄。例如:http://[DNS 名稱]/api/posts/1http://[DNS 名稱]/api/users/2

    使用者示範