使用 Amazon ECS 平台分支 - AWS Elastic Beanstalk

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Amazon ECS 平台分支

本主題介紹執行於 Amazon Linux 2 的 Amazon ECS 平台分支及其取代的執行於 AL1 的多容器 Docker 平台分支 (也稱為 ECS 受管)。除非另有說明,否則本主題中的所有資訊均適用於兩個平台分支。

注意

2022 年 7 月 18 日,Elastic Beanstalk 已將所有以 Amazon Linux AMI (AL1) 為基礎的平台分支狀態設為已淘汰

從 AL1 上的多容器 Docker 遷移

如果您目前正在使用執行於 AL1 的已淘汰多容器 Docker 平台分支,可以遷移至執行於 AL2023 上的最新 ECS 平台分支。最新的平台分支可支援此已停用平台分支的所有功能。無需變更原始程式碼。如需詳細資訊,請參閱將執行於 Amazon Linux 的多容器 Docker 遷移至執行於 Amazon Linux 2023 的 ECS

ECS 受管 Docker 平台

Elastic Beanstalk 使用 Amazon Elastic Container Service (Amazon ECS) 來協調 ECS 受管 Docker 環境的容器部署。Amazon ECS 提供了工具,來管理執行 Docker 容器的執行個體叢集。Elastic Beanstalk 會負責處理 Amazon ECS 的工作,包括建立叢集、定義工作與執行。環境中的每個執行個體,均須執行由 Dockerrun.aws.json v2 檔案定義的相同容器組合。為了充分發揮 Docker 的功用,Elastic Beanstalk 可讓您建立環境,而您的 Amazon EC2 執行個體可在此環境中並列執行多個 Docker 容器。

下圖顯示範例 Elastic Beanstalk 環境,此環境設定了在 Auto Scaling 群組中的每個 Amazon EC2 執行個體上,各執行 3 個 Docker 容器:

注意

Elastic Beanstalk 為其所有平台提供了可擴展性功能,您可以使用這些功能來自訂應用程式的部署和執行。對於執行於 Amazon Linux 2 的 ECS 平台分支,這些功能的執行個體部署工作流程實作與其他平台有所差異。如需詳細資訊,請參閱執行於 Amazon Linux 2 和更新版本的 ECS 的執行個體部署工作流程

Dockerrun.aws.json file

容器執行個體 – 在 Elastic Beanstalk 環境中執行 ECS 受管 Docker 的 Amazon EC2 執行個體 – 需要名稱為 Dockerrun.aws.json 的組態檔案。此檔案為 Elastic Beanstalk 專用,可單獨使用,或是與原始碼套件中的原始碼與內容結合,用來在 Docker 平台上建立環境。

注意

使用第 1 版 Dockerrun.aws.json 格式,將單一 Docker 容器啟動至執行於 Amazon Linux AMI 的 Elastic Beanstalk 環境 (Amazon Linux 2 之前的版本)。環境以執行於 64 位元 Amazon Linux 的 Docker 平台分支為基礎,後者將於 2022 年 7 月 18 日淘汰。若要進一步了解 Dockerrun.aws.json v1 格式,請參閱 Docker 平台組態 - 不含 Docker Compose

第 2 版 Dockerrun.aws.json 格式新增了每個 Amazon EC2 執行個體執行多個容器的支援功能,但只能搭配 ECS 受管 Docker 平台使用。其格式與前一版有顯著差異。

如需關於更新格式的詳細資訊與範例檔案,請參閱 Dockerrun.aws.json v2

Docker 影像

Elastic Beanstalk 的 ECS 受管 Docker 平台需要預先建置映像,並將映像儲存於公有或私有的線上映像儲存庫。

注意

Elastic Beanstalk 上的 ECS 受管 Docker 平台,並不支援在部署時使用 Dockerfile 來建置自訂映像。請在建立 Elastic Beanstalk 環境之前,先建置您的映像,並將這些映像部署到線上儲存庫中。

根據 Dockerrun.aws.json v2 中的名稱來指定映像。請注意這些慣例:

  • Docker Hub 上官方儲存庫中的映像,使用的是單一名稱 (例如,ubuntumongo)。

  • Docker Hub 上的其他儲存庫中的映像要求使用組織名稱 (例如,amazon/amazon-ecs-agent)。

  • 其他線上儲存庫中的映像的名稱中,會再加上網域名稱 (例如,quay.io/assemblyline/ubuntu)。

若要設定 Elastic Beanstalk 驗證私有儲存庫,請在您的 Dockerrun.aws.json v2 檔案中加入 authentication 參數。

容器執行個體角色

Elastic Beanstalk 使用 Amazon ECS 最佳化 AMI 搭配在 Docker 容器中執行的 Amazon ECS 容器代理程式。此代理程式會與 Amazon ECS 進行通訊,來協調統籌容器的部署作業。為了與 Amazon ECS 進行通訊,每個 Amazon EC2 執行個體都必須在 IAM 中擁有對應的許可。當您在 Elastic Beanstalk 主控台中建立環境時,這些許可會連接至預設的執行個體設定檔

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ECSAccess", "Effect": "Allow", "Action": [ "ecs:Poll", "ecs:StartTask", "ecs:StopTask", "ecs:DiscoverPollEndpoint", "ecs:StartTelemetrySession", "ecs:RegisterContainerInstance", "ecs:DeregisterContainerInstance", "ecs:DescribeContainerInstances", "ecs:Submit*" ], "Resource": "*" } ] }

如果您建立自己的執行個體設定檔,可以連接 AWSElasticBeanstalkMulticontainerDocker 受管雲則,以確保許可隨時保持於最新狀態。如需在 IAM 中建立原則與角色的相關說明,請參閱 IAM 使用者指南中的建立 IAM 角色

由 Elastic Beanstalk 建立的 Amazon ECS 資源

當您使用 ECS 受管 Docker 平台來建立環境時,Elastic Beanstalk 會在建置環境的同時,自動建立和設定數個 Amazon Elastic Container Service 資源,同時建置相關環境。執行此操作時,它會在每個 Amazon EC2 執行個體上建立必要的容器。

  • Amazon ECS 叢集 – 會將 Amazon ECS 中的容器執行個體整編為叢集。搭配 Elastic Beanstalk 使用時,一律會針對每個 ECS 受管 Docker 環境建立一個叢集。

  • Amazon ECS 工作定義 – Elastic Beanstalk 會使用您專案中的 Dockerrun.aws.json v2 來產生 Amazon ECS 工作的定義,此定義可用來設定環境中的容器執行個體。

  • Amazon ECS 工作 – Elastic Beanstalk 會與 Amazon ECS 進行通訊,在環境中的每個執行個體上執行工作,來統籌容器的部署。在可擴展環境中,Elastic Beanstalk 會在執行個體每次新增到叢集時,起始新的工作。在極少數的情況中,您可能需要為容器和映像增加預留的空間。請參閱 設定 Docker 環境 一節來進一步了解。

  • Amazon ECS 容器代理程式 – 在您環境執行個體上的 Docker 容器中執行的代理程式。代理程式會輪詢 Amazon ECS 服務和等待工作執行。

  • Amazon ECS 資料磁碟區 – Elastic Beanstalk 會將磁碟區的定義 (除了您在 Dockerrun.aws.json v2 中所定義的磁碟區以外) 加入工作定義中,以便於收集日誌。

    Elastic Beanstalk 會在容器執行個體上建立日誌磁碟區 (每個容器一個),路徑為 /var/log/containers/containername。這些磁碟區會命名為 awseb-logs-containername,並提供給容器來進行掛載。關於掛載這些磁碟區的方法,詳細資訊請參閱 容器定義格式

使用多個 Elastic Load Balancing 接聽程式

您可以在 ECS 受管 Docker 環境中設定多個 Elastic Load Balancing 接聽程式,針對不透過預設 HTTP 通訊埠執行的代理程式或其他服務,支援傳入的資料流。

在您的原始碼套件中建立 .ebextensions 資料夾,然後新增副檔名為 .config 的檔案。下列範例顯示用來建立 Elastic Load Balancing 接聽程式的組態檔案,此接聽程式會監聽 8080 埠。

.ebextensions/elb-listener.config

option_settings: aws:elb:listener:8080: ListenerProtocol: HTTP InstanceProtocol: HTTP InstancePort: 8080

如果您的環境在您建立的自訂 Amazon Virtual Private Cloud (Amazon VPC) 中執行,則 Elastic Beanstalk 會處理其餘的工作。在預設 VPC 中,您需要設定執行個體的安全群組,來允許從負載平衡器傳入。新增第二個組態檔案,來加入安全群組的傳入規則:

.ebextensions/elb-ingress.config

Resources: port8080SecurityGroupIngress: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]} IpProtocol: tcp ToPort: 8080 FromPort: 8080 SourceSecurityGroupName: { "Fn::GetAtt": ["AWSEBLoadBalancer", "SourceSecurityGroup.GroupName"] }

如需組態檔案格式的詳細資訊,請參閱 新增和自訂 Elastic Beanstalk 環境資源選項設定

除了在 Elastic Load Balancing 組態中新增接聽程式,以及在安全群組中開啟通訊埠之外,您還需要在 Dockerrun.aws.json v2 的 containerDefinitions 區段中,將主機執行個體上的通訊埠對應到 Docker 容器上的通訊埠。下列的摘錄顯示了範例:

"portMappings": [ { "hostPort": 8080, "containerPort": 8080 } ]

關於 Dockerrun.aws.json v2 檔案格式的詳細資訊,請參閱 Dockerrun.aws.json v2

失敗的容器部署

如果 Amazon ECS 的工作失敗,則您 Elastic Beanstalk 環境中的一個或多個容器將不會開始執行。因為 Amazon ECS 工作失敗,所以 Elastic Beanstalk 不會還原多容器環境。如果容器無法在您的環境中啟動,請從 Elastic Beanstalk 主控台重新部署目前的版本或先前可正常運作的版本。

若要部署現有的版本
  1. 在您環境的區域中開啟 Elastic Beanstalk 主控台。

  2. 按一下應用程式名稱右方的 Actions (動作),然後按一下 View application versions (檢視應用程式版本)

  3. 選擇應用程式的版本,然後按一下 Deploy (部署)