在本單元中,您會將 node.js 應用程式分解為數個互連服務,並將每個服務的映像推送至 Amazon ECR 存放庫。 開始建立

最終應用程式架構使用 Amazon Elastic Container Service 和 Application Load Balancer。 

架構概觀

a. 用戶端
用戶端透過連接埠 80 發出流量請求。

b. 負載平衡器
Application Load Balancer (ALB) 將外部流量路由至正確的服務。ALB 會偵測用戶端請求,並使用路由規則將請求引導至符合規則之目標群組的執行個體和連接埠。

c. 目標群組
每個服務皆有目標群組,其會持續追蹤執行該服務之每個容器的執行個體和連接埠。

d. 容器化服務
Amazon Elastic Container Service (Amazon ECS) 會將每個服務部署至全體 EC2 叢集的容器。每個容器僅處理單一功能。

損毀狀況隔離
即使是最優異的工程組織,也必然會在生產環境中遇到嚴重的損毀狀況。除了下列所有正常處理損毀狀況的標準最佳實務外,建立微服務也可限制此類損毀所帶來之衝擊。良好的微服務架構代表若服務的其中一個微小部分發生損毀,則僅有該服務部分會故障無法運作。服務的其他部分可繼續正常運作。

隔離的安全性
在整合型應用程式中,若有其中一項應用程式功能發生安全性違規 (例如出現允許遠端程式碼執行的漏洞),則您必須假定攻擊者可能亦已取得系統其他所有功能的存取權。此狀況具有危險性,舉例而言,若化身上傳功能發生安全性問題,最後會導致攻擊者透過使用者密碼入侵資料庫。使用 Amazon ECS 將功能隔離至微服務,可讓您為每個服務提供專屬的 IAM 角色,以安全存取 AWS 資源。若遵循微服務最佳實務,一旦發生攻擊者入侵單一服務的情況,則其僅能取得該服務資源的控制權,而無法同時透過其他服務存取其他資源,此外亦無法入侵這些服務。

獨立擴展
若將功能分解為微服務,則可獨立向上或向下擴展每項微服務類別所用的基礎設施數量與執行個體數目。這可讓您更輕鬆地衡量特定功能的成本、識別可能需要優先最佳化的功能,並在特定功能的資源需求失控時,確保其他服務維持可靠穩定的運作效能。

開發迅速
微服務可降低開發風險,讓您更加快速地建立團隊。在巨型應用程式中,增加新功能可能會影響該應用程式所包含的其他所有功能。開發人員必須謹慎考量任何新增程式碼所帶來的影響,並確保不會造成任何破壞。另一方面,適當的微服務架構會針對加入新服務的新功能,使用新的程式碼。開發人員可安心確保所有撰寫的程式碼完全不會實際影響到現有程式碼,除非明確撰寫兩個微服務之間的連結。

完成時間:20 分鐘

使用的服務:


依照以下的逐步指示來分解巨型應用程式。按一下各個步驟編號以展開區段。

break-the-monolith
  • 步驟 1. 佈建 ECR 存放庫

    在前兩個步驟中,您已使用單一服務和單一容器映像存放庫,將應用程式部署為巨型應用程式。若要將應用程式部署為三項微服務,您必須在 Amazon ECR 中佈建三個存放庫 (每項服務使用一個存放庫)。

    這三項服務為:

    1. 使用者
    2. 討論串
    3. 文章


    建立存放庫:

    • 導覽至 Amazon ECR 主控台
    • 選取 Create Repository
    • 存放庫名稱:
      • 使用者
      • 討論串
      • 文章
    • 記錄存放庫資訊: [account-id].dkr.ecr.[region].amazonaws.com/[service-name]

    針對每項微服務重複執行這些步驟。

    現在您應已於 Amazon ECR 具有四個存放庫。

    存放庫
  • 步驟 2. 使用 AWS 驗證 Docker (選用)

    若您最近剛完成本研習營的「第 1 單元」,則可跳過此步驟。

    • 執行 aws ecr get-login --no-include-email --region [region]
      範例:aws ecr get-login --no-include-email --region us-west-2
    • 將會顯示以 docker login -u AWS -p ... 為首的大型輸出訊息;複製此輸出訊息的完整內容,然後在終端機中執行。

    • 此時應會顯示 Login Succeeded

      ⚐ 注意:若此登入作業失敗,可能是由於新版 Docker 廢棄了 -e none 旗標所致。若要修正此問題,請將輸出訊息貼至文字編輯器、自輸出訊息末尾移除 -e none,然後在終端機中執行更新後的輸出訊息。

  • 步驟 3. 針對每個服務建立和推送映像

    在專案資料夾 amazon-ecs-nodejs-microservices/3-microservices/services 中,會具有每項服務的資料夾和檔案。請注意,每項微服務本質上是先前整合型服務的複製。

    您可比較每項服務與整合型 api 服務中的 db.json 檔案,了解系統如何專門化處理每項服務。先前的文章、討論串和使用者,皆會存放在單一資料庫檔案中。現在,每個項目皆會存放在其個別服務的資料庫檔案中。

    開啟終端機,並設定 GitHub 程式碼之 3-microservices/services 區段的路徑。~/amazon-ecs-nodejs-microservices/3-microservices/services

    建立並標記每個映像

    • 在終端機中,執行 docker build -t [service-name] ./[Service-name] 範例:docker build -t posts ./posts
    • 建立完成後,標記映像以將其推送至存放庫:docker tag [service-name]:latest [account-id].dkr.ecr.[Region].amazonaws.com/[service-name]:v1 範例:docker tag posts:latest [account-id].dkr.ecr.us-west-2.amazonaws.com/posts:v1
    • 執行 Docker 推送,以將映像推送至 ECR:docker push [account-id].dkr.ecr.[region].amazonaws.com/[service-name]:v1

    若您導覽至 ECR 存放庫,應會看見您的映像已標記為 v1。 

    ♻ 針對每個微服務映像重複執行這些步驟。 

    ⚐ 注意:務必建立並標記所有的三個映像。