使用建立 AWS Fargate 服務 AWS CDK - AWS Cloud Development Kit (AWS CDK) V2

這是 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 執行容器任務有兩種不同的方式:

  • 使用Fargate啟動類型,Amazon ECS 會為您管理執行容器的實體機器。

  • 使用EC2啟動類型,您可以在其中進行管理,例如指定自動調整比例。

在此範例中,我們將建立在面向網際網路的 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