를 사용하여 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 ECR의 이미지에서 인터넷 연결 애플리케이션 로드 밸런서가 앞에 있는 Amazon Elastic Container Service (Amazon ECS) 클러스터에서 실행되는 AWS Fargate 서비스를 생성하는 방법을 안내합니다.

Amazon ECS는 클러스터에서 Docker 컨테이너를 손쉽게 실행, 중지 및 관리할 수 있게 해주는 컨테이너 관리 서비스로서 확장성과 속도가 뛰어납니다. Fargate 시작 유형을 사용하여 서비스 또는 작업을 시작하여 Amazon ECS에서 관리하는 서버리스 인프라에서 클러스터를 호스팅할 수 있습니다. 제어를 강화하려면 Amazon EC2 시작 유형을 사용하여 관리하는 Amazon Elastic Compute Cloud (Amazon EC2) 인스턴스 클러스터에서 작업을 호스팅할 수 있습니다.

이 자습서에서는 Fargate 시작 유형을 사용하여 일부 서비스를 시작하는 방법을 보여줍니다. 를 사용하여 Fargate 서비스를 만들어 본 적이 있다면 해당 작업을 수행하기 위해 따라야 할 단계가 많다는 것을 알고 계실 것입니다. AWS Management Console AWS 에는 Fargate 서비스를 만드는 과정을 안내하는 다음과 같은 몇 가지 자습서 및 설명서 항목이 있습니다.

이 예제는 유사한 Fargate 서비스를 코드로 생성합니다. AWS CDK

이 자습서에서 사용하는 Amazon ECS 구조는 다음과 같은 이점을 제공하여 AWS 서비스를 사용하는 데 도움이 됩니다.

  • 로드 밸런서를 자동으로 구성합니다.

  • 로드 밸런서를 위한 보안 그룹을 자동으로 엽니다. 이렇게 하면 보안 그룹을 명시적으로 생성하지 않고도 로드 밸런서가 인스턴스와 통신할 수 있습니다.

  • 대상 그룹에 연결된 서비스와 로드 밸런서 간의 종속성을 자동으로 정렬합니다. 대상 그룹에서는 인스턴스가 생성되기 전에 리스너를 생성하는 올바른 순서를 AWS CDK 적용합니다.

  • 자동 스케일링 그룹의 사용자 데이터를 자동으로 구성합니다. 이렇게 하면 클러스터를 AMI에 연결할 수 있는 올바른 구성이 생성됩니다.

  • 파라미터 조합을 조기에 검증합니다. 이렇게 하면 AWS CloudFormation 문제가 조기에 노출되므로 배포 시간이 절약됩니다. 예를 들어 작업에 따라 메모리 설정을 잘못 구성하기 쉽습니다. 이전에는 앱을 배포하기 전까지는 오류가 발생하지 않았습니다. 하지만 이제는 잘못된 구성을 감지하여 앱을 AWS CDK 합성할 때 오류를 발생시킬 수 있습니다.

  • Amazon ECR의 이미지를 사용하는 경우 Amazon Elastic Container 레지스트리 (Amazon ECR) 에 대한 권한을 자동으로 추가합니다.

  • 자동으로 크기를 조정합니다. Amazon EC2 클러스터를 사용할 때 인스턴스를 자동 확장할 수 있는 방법을 AWS CDK 제공합니다. 이는 Fargate 클러스터의 인스턴스를 사용할 때 자동으로 발생합니다.

    또한 는 자동 크기 조정이 인스턴스를 종료하려고 하는데 해당 인스턴스에서 작업이 실행 중이거나 예약 중인 경우 인스턴스가 삭제되지 AWS CDK 않도록 합니다.

    이전에는 이 기능을 사용하려면 Lambda 함수를 생성해야 했습니다.

  • 자산 지원을 제공하므로 머신의 소스를 Amazon ECS로 한 번에 배포할 수 있습니다. 이전에는 애플리케이션 소스를 사용하려면 Amazon ECR에 업로드하고 Docker 이미지를 생성하는 등 몇 가지 수동 단계를 수행해야 했습니다.

자세한 내용은 ECS를 참조하십시오.

중요

앞으로 사용할 ApplicationLoadBalancedFargateService 구성에는 수많은 AWS 구성 요소가 포함되며, 그중 일부는 사용하지 않더라도 AWS 계정에 프로비저닝된 상태로 두면 비용이 많이 듭니다. 이 예제를 완료한 후에는 반드시 cleanup () 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 src/MyEcsConstruct.sln Studio에서 열 수 있습니다.

앱을 실행하고 빈 스택이 생성되는지 확인합니다.

cdk synth

Fargate 서비스 만들기

Amazon ECS로 컨테이너 작업을 실행하는 두 가지 방법이 있습니다.

  • Amazon ECS가 컨테이너가 실행되는 물리적 머신을 대신 관리하는 Fargate 시작 유형을 사용하십시오.

  • 자동 크기 조정 지정과 같은 관리를 수행하는 EC2 시작 유형을 사용하십시오.

이 예제에서는 인터넷에 연결된 Application Load Balancer가 앞에 있는 ECS 클러스터에서 실행되는 Fargate 서비스를 생성해 보겠습니다.

다음 AWS Construct Library 모듈 가져오기를 표시된 파일에 추가합니다.

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

스택은 수백 줄에 달하므로 여기서는 보여주지 않겠습니다. 스택에는 기본 인스턴스 1개, 3개의 가용 영역에 대한 프라이빗 서브넷 및 퍼블릭 서브넷, 보안 그룹이 포함되어야 합니다.

스택을 배포합니다.

cdk deploy

AWS CloudFormation 앱을 배포할 때 거치는 수십 단계에 대한 정보를 표시합니다.

따라서 Docker 이미지를 실행하기 위한 Fargate 기반 Amazon ECS 서비스를 만드는 것이 얼마나 쉬운지 알 수 있습니다.

정리

예상치 못한 AWS 요금이 부과되지 않도록 하려면 이 연습을 완료한 후 AWS CDK 스택을 폐기하십시오.

cdk destroy