這是 AWS CDK v2 開發人員指南。較舊的 CDK 第 1 版已於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用建立 AWS Fargate 服務 AWS CDK
本範例將引導您如何從 Amazon ECR 上的映像建立在 Amazon Elastic Container Service (Amazon ECS) 叢集上執行的 AWS Fargate 服務,該叢集由網際網路對向 Application Load Balancer 器前方執行的 Fargate 服務。
Amazon ECS 是具高可擴展性且快速的容器管理服務,可以在叢集上輕鬆執行、停用及管理 Docker 容器。您可以透過使用 Fargate 啟動類型啟動服務或任務,在由 Amazon ECS 管理的無伺服器基礎設施上託管叢集。如需更多控制權,您可以在使用 Amazon EC2 啟動類型管理的 Elastic Compute Cloud (Amazon EC2) 執行個體叢集上託管任務。
本教學課程說明如何使用 Fargate 啟動類型來啟動某些服務。如果您已使 AWS Management Console 用建立 Fargate 服務,您知道完成該工作需要遵循許多步驟。 AWS 有數個自學課程和文件主題,可引導您逐步建立 Fargate 服務,包括:
此範例會在 AWS CDK 程式碼中建立類似的 Fargate 服務。
本教學中使用的 Amazon ECS 建構可提供下列優點,協助您使用 AWS 服務:
-
自動設定負載平衡器。
-
自動為負載平衡器開啟安全群組。這可讓負載平衡器與執行個體通訊,而無需您明確建立安全群組。
-
自動排序服務與連接至目標群組的負載平衡器之間的相依性,在建立 AWS CDK 執行個體之前,會強制執行建立接聽程式的正確順序。
-
自動設定自動調整群組的使用者資料。這會建立正確的組態,將叢集與 AMI 產生關聯。
-
提早驗證參數組合。這會先前公開 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 映像。
如需詳細資訊,請參閱 ECS。
我們將使用的ApplicationLoadBalancedFargateService
結構包含許多 AWS
組件,其中一些組件如果保留在您的 AWS 帳戶中佈建,即使您不使用它們,也會產生非平凡的成本。完成此範例後,請務必清理 (cdk destroy)。
建立目錄並初始化 AWS CDK
讓我們先創建一個目錄來保存 AWS CDK 代碼,然後在該目錄中創建一個 AWS CDK 應用程序。
- TypeScript
-
mkdir MyEcsConstruct
cd MyEcsConstruct
cdk init --language typescript
- JavaScript
-
mkdir MyEcsConstruct
cd MyEcsConstruct
cdk init --language javascript
- Python
-
mkdir MyEcsConstruct
cd MyEcsConstruct
cdk init --language python
source .venv/bin/activate # On Windows, run '.\venv\Scripts\activate' instead
pip install -r requirements.txt
- Java
-
mkdir MyEcsConstruct
cd MyEcsConstruct
cdk init --language java
您現在可以將 Maven 項目導入到 IDE 中。
- C#
-
mkdir MyEcsConstruct
cd MyEcsConstruct
cdk init --language csharp
您現在可以在視覺工作室src/MyEcsConstruct.sln
中打開。
運行應用程序並確認它創建了一個空堆棧。
cdk synth
建立 Fargate 服務
使用 Amazon ECS 執行容器任務有兩種不同的方式:
在此範例中,我們將建立在面向網際網路的 Application Load Balancer 前方的 ECS 叢集上執行的 Fargate 服務。
將以下「 AWS 建構程式庫」模組匯入新增至指定的檔案。
- TypeScript
-
檔案: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";
- JavaScript
-
檔案:lib/my_ecs_construct-stack.js
const ec2 = require("aws-cdk-lib/aws-ec2");
const ecs = require("aws-cdk-lib/aws-ecs");
const ecs_patterns = require("aws-cdk-lib/aws-ecs-patterns");
- Python
-
檔案:my_ecs_construct/my_ecs_construct_stack.py
from aws_cdk import (aws_ec2 as ec2, aws_ecs as ecs,
aws_ecs_patterns as ecs_patterns)
- Java
-
檔案:src/main/java/com/myorg/MyEcsConstructStack.java
import software.amazon.awscdk.services.ec2.*;
import software.amazon.awscdk.services.ecs.*;
import software.amazon.awscdk.services.ecs.patterns.*;
- C#
-
檔案:src/MyEcsConstruct/MyEcsConstructStack.cs
using Amazon.CDK.AWS.EC2;
using Amazon.CDK.AWS.ECS;
using Amazon.CDK.AWS.ECS.Patterns;
將建構函式結尾的註解取代為下列程式碼。
- TypeScript
-
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
});
- JavaScript
-
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
});
- Python
-
vpc = ec2.Vpc(self, "MyVpc", max_azs=3) # default is all AZs in region
cluster = ecs.Cluster(self, "MyCluster", vpc=vpc)
ecs_patterns.ApplicationLoadBalancedFargateService(self, "MyFargateService",
cluster=cluster, # Required
cpu=512, # Default is 256
desired_count=6, # Default is 1
task_image_options=ecs_patterns.ApplicationLoadBalancedTaskImageOptions(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")),
memory_limit_mib=2048, # Default is 512
public_load_balancer=True) # Default is True
- Java
-
Vpc vpc = Vpc.Builder.create(this, "MyVpc")
.maxAzs(3) // Default is all AZs in region
.build();
Cluster cluster = Cluster.Builder.create(this, "MyCluster")
.vpc(vpc).build();
// Create a load-balanced Fargate service and make it public
ApplicationLoadBalancedFargateService.Builder.create(this, "MyFargateService")
.cluster(cluster) // Required
.cpu(512) // Default is 256
.desiredCount(6) // Default is 1
.taskImageOptions(
ApplicationLoadBalancedTaskImageOptions.builder()
.image(ContainerImage.fromRegistry("amazon/amazon-ecs-sample"))
.build())
.memoryLimitMiB(2048) // Default is 512
.publicLoadBalancer(true) // Default is true
.build();
- C#
-
var vpc = new Vpc(this, "MyVpc", new VpcProps
{
MaxAzs = 3 // Default is all AZs in region
});
var cluster = new Cluster(this, "MyCluster", new ClusterProps
{
Vpc = vpc
});
// Create a load-balanced Fargate service and make it public
new ApplicationLoadBalancedFargateService(this, "MyFargateService",
new ApplicationLoadBalancedFargateServiceProps
{
Cluster = cluster, // Required
DesiredCount = 6, // Default is 1
TaskImageOptions = new ApplicationLoadBalancedTaskImageOptions
{
Image = ContainerImage.FromRegistry("amazon/amazon-ecs-sample")
},
MemoryLimitMiB = 2048, // Default is 256
PublicLoadBalancer = true // Default is true
}
);
保存它並確保它運行並創建一個堆棧。
cdk synth
堆棧是數百行,所以我們不會在這裡顯示它。堆疊應包含一個預設執行個體、一個私有子網路和三個可用區域的公用子網路,以及一個安全群組。
部署堆疊。
cdk deploy
AWS CloudFormation 顯示部署應用程式時所採取的數十個步驟的相關資訊。
這就是創建一個 Fargate 端驅動的 Amazon ECS 服務來運行 Docker 映像是多麼容易。
清除
為避免意外 AWS 收費,請在完成此練習後銷毀 AWS CDK 堆疊。
cdk destroy