使用创建 AWS Fargate 服务 AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

这是 AWS CDK v2 开发者指南。较旧的 CDK v1 于 2022 年 6 月 1 日进入维护阶段,并于 2023 年 6 月 1 日终止支持。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用创建 AWS Fargate 服务 AWS CDK

此示例将向您介绍如何创建在亚马逊弹性容器服务 (Amazon ECS) Service 集群上运行的 AWS Fargate 服务,该集群前面是来自亚马逊 ECR 上映像的面向互联网的应用程序负载均衡器。

Amazon ECS 是一项高度可扩展的快速容器管理服务,它可轻松运行、停止和管理群集上的 Docker 容器。您可以使用 Fargate 启动类型启动服务或任务,将集群托管在由 Amazon ECS 管理的无服务器基础设施上。为了获得更多控制权,您可以在使用亚马逊 EC2 启动类型管理的亚马逊弹性计算云 (Amazon EC2) 实例集群上托管任务。

本教程向您展示如何使用 Fargate 启动类型启动某些服务。如果您使用创建了 Fargate 服务,那么您就知道要完成该任务需要遵循许多步骤。 AWS Management Console AWS 有几个教程和文档主题可以指导你创建 Fargate 服务,包括:

此示例在代码中创建了一个类似的 Fargate 服务。 AWS CDK

本教程中使用的 Amazon ECS 结构通过提供以下好处来帮助您使用 AWS 服务:

  • 自动配置负载均衡器。

  • 自动为负载均衡器打开安全组。这使负载均衡器无需您明确创建安全组即可与实例通信。

  • 自动排序服务与附加到目标组的负载均衡器之间的依赖关系,其中 AWS CDK 强制执行在创建实例之前创建监听器的正确顺序。

  • 自动配置自动伸缩组的用户数据。这将创建正确的配置以将集群关联到 AMI。

  • 尽早验证参数组合。这样可以更早地暴露 AWS CloudFormation 问题,从而节省部署时间。例如,根据任务的不同,很容易错误配置内存设置。以前,在部署应用程序之前,您不会遇到错误。但是现在,当你合成应用程序时, AWS CDK 可以检测到配置错误并发出错误。

  • 如果您使用来自亚马逊 ECR 的图片,则会自动添加亚马逊弹性容器注册表 (Amazon ECR) Container Registry 的权限。

  • 自动缩放。 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

您现在可以在 Visual Studio src/MyEcsConstruct.sln 中打开了。

运行应用程序并确认它创建了一个空堆栈。

cdk synth

创建 Fargate 服务

使用 Amazon ECS 运行容器任务有两种不同的方法:

  • 使用Fargate启动类型,其中 Amazon ECS 为您管理运行容器的物理机。

  • 使用EC2启动类型,您可以在其中进行管理,例如指定自动缩放。

在本示例中,我们将创建一个在面向互联网的应用程序负载均衡器前面的 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