這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 已於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在此範例中,我們會示範如何建立在 Amazon Elastic Container Service (Amazon ECS) 叢集上執行 AWS Fargate 的服務,該叢集由面向網際網路的 Application Load Balancer 從 Amazon ECR 上的映像前端。
Amazon ECS 是高度可擴展、快速的容器管理服務,可讓您輕鬆地執行、停止和管理叢集上的Docker容器。您可以使用 Fargate 啟動類型啟動服務或任務,將叢集託管在由 Amazon ECS 管理的無伺服器基礎設施上。如需更多控制,您可以在使用 Amazon EC2 啟動類型管理的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體叢集上託管任務。
在此範例中,我們使用 Fargate 啟動類型來啟動某些服務。如果您已使用 AWS Management Console 來建立 Fargate 服務,則知道要遵循許多步驟來完成該任務。 AWS 有幾個教學課程和文件主題,會逐步引導您建立 Fargate 服務,包括:
此範例使用 建立類似的 Fargate 服務 AWS CDK。
此範例中使用的 Amazon ECS 建構模組可提供下列優點,協助您使用 AWS 服務:
-
自動設定負載平衡器。
-
自動開啟負載平衡器的安全群組。這可讓負載平衡器與執行個體通訊,而不必明確建立安全群組。
-
自動排序服務與連接至目標群組的負載平衡器之間的相依性,其中 會在建立執行個體之前 AWS CDK 強制執行建立接聽程式的正確順序。
-
在自動擴展群組上自動設定使用者資料。這會建立正確的組態,將叢集與 AMIs建立關聯。
-
及早驗證參數組合。這會更早地公開 AWS CloudFormation 問題,從而節省部署時間。例如,視任務而定,不適當設定記憶體設定很容易。先前,在部署應用程式之前,我們不會遇到錯誤。但現在 AWS CDK 可以偵測組態錯誤,並在合成應用程式時發出錯誤。
-
如果我們使用來自 Amazon ECR 的映像,則會自動新增 Amazon Elastic Container Registry (Amazon ECR) 的許可。
-
自動擴展。 AWS CDK 提供一種方法,讓我們在使用 Amazon EC2 叢集時可以自動擴展執行個體。當我們在 Fargate 叢集中使用執行個體時,會自動發生這種情況。
此外,當自動調整規模嘗試停止執行個體,但任務正在執行或排程在該執行個體上時, AWS CDK 可防止刪除執行個體。
先前,我們必須建立 Lambda 函數才能擁有此功能。
-
提供資產支援,讓我們可以在一個步驟中將來源從機器部署到 Amazon ECS。先前,若要使用應用程式來源,我們必須執行數個手動步驟,例如上傳至 Amazon ECR 和建立Docker映像。
重要
我們將使用的ApplicationLoadBalancedFargateService
建構包含許多 AWS 元件,其中有些元件如果保留在 AWS 帳戶中佈建,則會產生非微不足道的成本,即使我們不使用它們。如果您遵循此範例,請務必清除 (cdk destroy)。
建立 CDK 專案
我們從建立 CDK 專案開始。這是存放 AWS CDK 程式碼的目錄,包括 CDK 應用程式。
mkdir MyEcsConstruct cd MyEcsConstruct cdk init --language typescript
接下來,我們會執行應用程式並確認它建立空堆疊。
cdk synth
建立 Fargate 服務
有兩種不同的方式可以使用 Amazon ECS 執行容器任務:
-
使用
Fargate
啟動類型,其中 Amazon ECS 會管理我們執行容器的實體機器。 -
使用
EC2
啟動類型,我們在其中執行 管理,例如指定自動擴展。
在此範例中,我們將建立在 Amazon ECS 叢集上執行的 Fargate 服務,前方為面向網際網路的 Application Load Balancer。
我們將下列 AWS 建構程式庫模組匯入至堆疊檔案:
檔案: lib/my_ecs_construct-stack.ts
import * as ec2 from "aws-cdk-lib/aws-ec2";
import * as ecs from "aws-cdk-lib/aws-ecs";
import * as ecs_patterns from "aws-cdk-lib/aws-ecs-patterns";
在我們的堆疊中,我們新增下列程式碼:
const vpc = new ec2.Vpc(this, "MyVpc", {
maxAzs: 3 // Default is all AZs in region
});
const cluster = new ecs.Cluster(this, "MyCluster", {
vpc: vpc
});
// Create a load-balanced Fargate service and make it public
new ecs_patterns.ApplicationLoadBalancedFargateService(this, "MyFargateService", {
cluster: cluster, // Required
cpu: 512, // Default is 256
desiredCount: 6, // Default is 1
taskImageOptions: { image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample") },
memoryLimitMiB: 2048, // Default is 512
publicLoadBalancer: true // Default is true
});
接下來,我們會執行下列命令來驗證程式碼,以合成堆疊:
cdk synth
堆疊有數百行,因此我們不會在此顯示。堆疊應包含一個預設執行個體、一個私有子網路和三個可用區域的公有子網路,以及一個安全群組。
若要部署堆疊,我們會執行下列動作:
cdk deploy
AWS CloudFormation 會顯示部署我們的應用程式時所採取數十個步驟的相關資訊。
部署完成後,我們已成功建立 Fargate 支援的 Amazon ECS 服務來執行Docker映像。
清除
作為一般維護最佳實務,為了將不必要的成本降至最低,我們會在完成時刪除堆疊:
cdk destroy