Fargate 시작 유형에 대한 Amazon ECS 작업 정의 차이 - Amazon Elastic Container Service

Fargate 시작 유형에 대한 Amazon ECS 작업 정의 차이

Fargate를 사용하려면 Fargate 시작 유형을 사용하도록 작업 정의를 구성해야 합니다. Fargate를 사용할 때 추가 고려 사항이 있습니다.

태스크 정의 파라미터

Fargate 시작 유형을 사용하는 태스크는 사용 가능한 Amazon ECS 태스크 정의 파라미터 중 일부를 지원하지 않을 수 있습니다. 전혀 지원되지 않는 파라미터도 있고 Fargate 작업에 다르게 작동하는 파라미터도 있습니다.

다음 태스크 정의 파라미터는 Fargate 태스크에서 유효하지 않습니다.

  • disableNetworking

  • dnsSearchDomains

  • dnsServers

  • dockerSecurityOptions

  • extraHosts

  • gpu

  • ipcMode

  • links

  • placementConstraints

  • privileged

  • maxSwap

  • swappiness

다음 태스크 정의 파라미터는 Fargate 태스크에서 유효하지만 유의해야 할 제한이 있습니다.

  • linuxParameters – 컨테이너에 적용되는 Linux 전용 옵션을 지정할 때 capabilities에 추가할 수 있는 기능은 CAP_SYS_PTRACE뿐입니다. devices, sharedMemorySizetmpfs 파라미터는 지원되지 않습니다. 자세한 내용은 Linux 파라미터 단원을 참조하십시오.

  • volumes – Fargate 태스크는 바인드 탑재 호스트 볼륨만 지원하므로 dockerVolumeConfiguration 파라미터는 지원되지 않습니다. 자세한 내용은 볼륨 단원을 참조하십시오.

  • cpu - AWS Fargate의 Windows 컨테이너의 경우 값은 1 vCPU보다 작을 수 없습니다.

  • networkConfiguration - Fargate 태스크에서는 항상 awsvpc 네트워크 모드가 사용됩니다.

태스크 정의가 Fargate으로 사용하는 데 유효한지 확인하려면 태스크 정의를 등록할 때 다음을 지정할 수 있습니다.

  • AWS Management Console에서 기능 필요 필드에 FARGATE를 지정합니다.

  • AWS CLI에서 --requires-compatibilities 옵션을 지정합니다.

  • Amazon ECS API에서 requiresCompatibilities 플래그를 지정합니다.

운영 체제 및 아키텍처

AWS Fargate에 대한 태스크 및 컨테이너 정의를 구성할 때 컨테이너가 실행하는 운영 체제를 지정해야 합니다. AWS Fargate에서 지원되는 운영 체제는 다음과 같습니다.

  • Amazon Linux 2

    참고

    Linux 컨테이너는 호스트 운영 체제의 커널 및 커널 구성만 사용합니다. 예를 들어 커널 구성에 sysctl 시스템 컨트롤이 포함됩니다. Linux 컨테이너 이미지는 모든 Linux 배포판의 파일 및 프로그램을 포함하는 기본 이미지로 만들 수 있습니다. CPU 아키텍처가 일치하면 모든 운영 체제의 모든 Linux 컨테이너 이미지에서 컨테이너를 실행할 수 있습니다.

  • Windows Server 2019 Full

  • Windows Server 2019 Core

  • Windows Server 2022 Full

  • Windows Server 2022 Core

AWS Fargate에서 Windows 컨테이너를 실행하는 경우 X86_64 CPU 아키텍처가 있어야 합니다.

AWS Fargate에서 Linux 컨테이너를 실행할 때 X86_64 CPU 아키텍처 또는 ARM 기반 애플리케이션용 ARM64 아키텍처를 사용할 수 있습니다. 자세한 내용은 64비트 ARM 워크로드에 대한 Amazon ECS 작업 정의 단원을 참조하십시오.

태스크 CPU 및 메모리

AWS Fargate용 Amazon ECS 태스크 정의를 사용하려면 태스크 수준에서 CPU와 메모리를 지정해야 합니다. Fargate 태스크에 대해 컨테이너 레벨에서 CPU와 메모리를 지정할 수도 있지만, 이 방법은 선택 사항입니다. 대부분의 사용 사례에서는 태스크 레벨에서 이러한 리소스를 지정해야 합니다. 유효한 태스크 레벨 CPU 및 메모리 조합은 아래 표와 같습니다. 작업 정의에서 메모리 값을 문자열(MiB 또는 GB 단위)로 지정할 수 있습니다. 예를 들어 메모리 값을 3072(MiB) 또는 3 GB(GB)로 지정할 수 있습니다. JSON 파일에서 CPU 값을 문자열(CPU 단위 또는 가상 CPU(vCPU))로 지정할 수 있습니다. 예를 들어 CPU 값을 1024(CPU 단위) 또는 1 vCPU(vCPU)로 지정할 수 있습니다.

CPU 값 메모리 값 AWS Fargate에 지원되는 운영 체제
256(.25 vCPU) 512MiB, 1GB, 2GB Linux
512(.5 vCPU) 1GB, 2GB, 3GB, 4GB Linux
1024(1 vCPU) 2GB, 3GB, 4GB, 5GB, 6GB, 7GB, 8GB Linux, Windows
2048(2 vCPU) 4~16GB(1GB 증분) Linux, Windows
4096(4 vCPU) 8~30GB(1GB 증분) Linux, Windows
8192 (8 vCPU)
참고

이 옵션은 Linux 플랫폼 1.4.0 이상이 필요합니다.

16~60GB(4GB 증분) Linux
16384 (16vCPU)
참고

이 옵션은 Linux 플랫폼 1.4.0 이상이 필요합니다.

32~120GB(8GB 증분) Linux

태스크 네트워킹

AWS Fargate용 Amazon ECS 태스크에는 탄력적 네트워크 인터페이스를 각 태스크에 제공하는 awsvpc 네트워크 모드가 필요합니다. 이 네트워크 모드를 사용하여 태스크를 실행하거나 서비스를 생성할 때는 네트워크 인터페이스를 연결할 하나 이상의 서브넷과 네트워크 인터페이스에 적용할 하나 이상의 보안 그룹을 지정해야 합니다.

퍼블릭 서브넷을 사용하는 경우에는 네트워크 인터페이스에 퍼블릭 IP 주소를 제공할지를 결정합니다. 퍼블릭 서브넷의 Fargate 태스크가 컨테이너 이미지를 풀링하려면 인터넷에 대한 경로 또는 인터넷으로 요청을 라우팅할 수 있는 NAT 게이트웨이를 사용하여 태스크의 탄력적 네트워크 인터페이스에 퍼블릭 IP 주소를 할당해야 합니다. 프라이빗 서브넷의 Fargate 태스크가 컨테이너 이미지를 풀링하려면 인터넷으로 요청을 라우팅할 수 있는 NAT 게이트웨이가 서브넷에 있어야 합니다. Amazon ECR에서 컨테이너 이미지를 호스팅하면 인터페이스 VPC 엔드포인트를 사용하도록 Amazon ECR을 구성할 수 있습니다. 이 경우 태스크의 프라이빗 IPv4 주소는 이미지 풀링에 사용됩니다. Amazon ECR 인터페이스 엔드포인트에 대한 자세한 정보는 Amazon Elastic Container Registry 사용자 설명서Amazon ECR 인터페이스 VPC 엔드포인트(AWS PrivateLink)를 참조하세요.

다음은 Fargate 서비스에 대한 networkConfiguration 섹션 예제입니다.

"networkConfiguration": { "awsvpcConfiguration": { "assignPublicIp": "ENABLED", "securityGroups": [ "sg-12345678" ], "subnets": [ "subnet-12345678" ] } }

태스크 리소스 제한

AWS Fargate의 Linux 컨테이너에 대한 Amazon ECS 태스크 정의는 ulimits 파라미터를 지원하여 컨테이너에 대해 설정할 리소스 제한을 정의합니다.

AWS Fargate의 Windows용 Amazon ECS 태스크 정의는 컨테이너에 대해 설정할 리소스 제한을 정의하는 ulimits 파라미터를 지원하지 않습니다.

Fargate에 호스팅되는 Amazon ECS 작업은 nofile 리소스 제한 파라미터를 제외하고 운영 체제에서 설정한 기본 리소스 제한 값을 사용합니다. nofile 리소스 제한은 컨테이너가 사용할 수 있는 열린 파일 수에 대한 제한을 설정합니다. Fargate에서 기본 nofile 소프트 제한은 65535이고 하드 제한은 65535입니다. 두 제한의 값을 모두 최대 1048576으로 설정할 수 있습니다.

두 배로 늘어난 사용자 지정 nofile 제한을 정의하는 방법을 나타내는 예제 태스크 정의 코드 조각은 다음과 같습니다.

"ulimits": [ { "name": "nofile", "softLimit": 2048, "hardLimit": 8192 } ]

조정할 수 있는 다른 리소스 제한에 대한 자세한 정보는 리소스 제한 섹션을 참조하세요.

로깅

이벤트 로깅

Amazon ECS는 수행한 작업을 EventBridge에 기록합니다. EventBridge용 Amazon ECS 이벤트를 사용하여 Amazon ECS 클러스터, 서비스 및 작업의 현재 상태에 관해 실시간에 가까운 알림을 받을 수 있습니다. 또한 이러한 이벤트에 응답하도록 작업을 자동화할 수 있습니다. 자세한 내용은 EventBridge를 사용하여 Amazon ECS 오류에 대한 응답 자동화 단원을 참조하십시오.

작업 수명 주기 로깅

Fargate에서 실행되는 작업은 타임스탬프를 게시하여 작업 수명 주기의 상태를 통해 작업을 추적합니다. AWS Management Console의 작업 세부 정보 및 AWS CLI 및 SDK의 작업 설명에서 타임스탬프를 확인할 수 있습니다. 예를 들어 타임스탬프를 사용하여 컨테이너 이미지를 다운로드하는 데 소요된 시간을 평가하고 컨테이너 이미지 크기를 최적화할지 아니면 Seekable OCI 인덱스를 사용할지 결정할 수 있습니다. 컨테이너 이미지 사례에 대한 자세한 내용은 Amazon ECS 컨테이너 이미지 모범 사례를 참조하세요.

애플리케이션 로깅

AWS Fargate용 Amazon ECS 태스크 정의는 로그 구성을 위해 awslogs, splunkawsfirelens 로그 드라이버를 지원합니다.

awslogs 로그 드라이버는 Amazon CloudWatch Logs로 로그 정보를 보낼 Fargate 태스크를 구성합니다. 다음은 awslogs 로그 드라이버가 구성되는 태스크 정의 조각을 보여줍니다.

"logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group" : "/ecs/fargate-task-definition", "awslogs-region": "us-east-1", "awslogs-stream-prefix": "ecs" } }

태스크 정의에서 awslogs 로그 드라이버를 사용하여 컨테이너 로그를 CloudWatch Logs로 보내는 방법에 대한 자세한 정보는 Amazon ECS 로그를 CloudWatch로 전송 섹션을 참조하세요.

태스크 정의의 awsfirelens 로그 드라이버에 대한 자세한 정보는 Amazon ECS 로그를 AWS 서비스 또는 AWS Partner로 전송 섹션을 참조하세요.

태스크 정의에서 splunk 로그 드라이버를 사용하는 방법에 대한 자세한 정보는 splunk 로그 드라이버 섹션을 참조하세요.

태스크 스토리지

Fargate에서 호스팅되는 Amazon ECS 태스크의 경우 다음과 같은 스토리지 유형이 지원됩니다.

Seekable OCI(SOCI)를 사용하여 컨테이너 이미지 지연 로딩

Linux 플랫폼 1.4.0 버전을 사용하는 Fargate 기반 Amazon ECS 작업은 Seekable OCI(SOCI)를 사용하여 작업을 더 빠르게 시작할 수 있습니다. SOCI를 사용하면 컨테이너가 이미지 풀에 몇 초만 소비하고 시작할 수 있으므로, 이미지가 백그라운드에서 다운로드되는 동안 환경 설정 및 애플리케이션 인스턴스화에 필요한 시간을 얻을 수 있습니다. 이를 지연 로딩이라고 합니다. Fargate가 Amazon ECS 작업을 시작하면 Fargate는 작업의 이미지에 대한 SOCI 인덱스가 있는지 자동으로 감지하여 전체 이미지가 다운로드될 때까지 기다리지 않고 컨테이너를 시작합니다.

SOCI 인덱스 없이 실행되는 컨테이너의 경우 컨테이너 이미지가 완전히 다운로드된 이후에 컨테이너가 시작됩니다. 이 동작은 Fargate의 다른 모든 플랫폼 버전과 Amazon EC2 인스턴스의 Amazon ECS 최적화 AMI에서 동일합니다.

Seekable OCI 인덱스

Seekable OCI(SOCI)는 컨테이너 이미지를 느리게 로드하여 컨테이너를 더 빠르게 시작할 수 있는 AWS에서 개발된 오픈 소스 기술입니다. SOCI는 기존 컨테이너 이미지 내에 파일의 인덱스(SOCI 인덱스)를 생성하는 방식으로 작동합니다. 이 인덱스를 사용하면 전체 이미지를 다운로드하기 전에 컨테이너 이미지에서 개별 파일을 추출할 수 있으므로 컨테이너를 더 빠르게 시작할 수 있습니다. SOCI 인덱스는 컨테이너 레지스트리 내의 이미지와 동일한 리포지토리에 아티팩트로 저장되어야 합니다. 인덱스는 이미지 내용의 신뢰할 수 있는 출처이므로 신뢰할 수 있는 출처의 SOCI 인덱스만 사용해야 합니다. 자세한 내용은 컨테이너 이미지 지연 로딩을 위한 Seekable OCI 소개를 참조하세요.

고려 사항

Fargate가 SOCI 인덱스를 사용하여 작업에서 컨테이너 이미지를 느리게 로드하도록 하려면 다음 사항을 고려합니다.

  • Linux 플랫폼 버전 1.4.0에서 실행되는 작업만 SOCI 인덱스를 사용할 수 있습니다. Fargate 기반 Windows 컨테이너를 실행하는 작업은 지원되지 않습니다.

  • X86_64 또는 ARM64 CPU 아키텍처에서 실행되는 작업은 지원됩니다.

  • 작업 정의의 컨테이너 이미지는 각 이미지와 동일한 컨테이너 레지스트리에 SOCI 인덱스를 가져야 합니다.

  • 작업 정의의 컨테이너 이미지는 호환 가능한 이미지 레지스트리에 저장되어야 합니다. 호환 가능한 레지스트리 목록은 다음과 같습니다.

    • Amazon ECR 프라이빗 레지스트리

  • gzip 압축을 사용하거나 압축되지 않은 컨테이너 이미지만 지원됩니다. zstd 압축을 사용하는 컨테이너 이미지는 지원되지 않습니다.

  • 250 MiB 압축된 크기보다 큰 컨테이너 이미지를 사용하여 지연 로딩을 시도하는 것이 좋습니다. 크기가 작은 이미지를 로드하는 데 걸리는 시간이 줄어들 가능성은 거의 없습니다.

  • 지연 로딩으로 인해 작업 시작 시간이 달라질 수 있으므로 Elastic Load Balancing의 상태 확인 유예 기간과 같은 다양한 제한 시간을 변경해야 할 수 있습니다.

  • 컨테이너 이미지가 지연 로드되지 않게 하려면 컨테이너 레지스트리에서 SOCI 인덱스를 삭제합니다. 작업의 컨테이너 이미지가 고려 사항 중 하나를 충족하지 않는 경우 컨테이너 이미지가 기본 방법으로 다운로드됩니다.

Seekable OCI 인덱스 생성

컨테이너 이미지 로드를 지연하려는 경우 SOCI 인덱스(메타데이터 파일)를 생성하여 컨테이너 이미지와 함께 컨테이너 이미지 리포지토리에 저장해야 합니다. SOCI 인덱스를 생성하고 푸시하기 위해 GitHub의 오픈 소스 soci-snapshotter CLI 도구를 사용할 수 있습니다. 또는 CloudFormation AWS SOCI Index Builder를 배포할 수 있습니다. 컨테이너 이미지가 Amazon ECR로 푸시될 때 SOCI 인덱스를 자동으로 생성하여 푸시하는 서버리스 솔루션입니다. 솔루션 및 설치 단계에 대한 자세한 내용은 GitHub의 CFN AWS SOCI Index Builder를 참조하세요. CloudFormation AWS SOCI Index Builder는 SOCI 시작을 자동화하는 방법이며, 오픈 소스 soci 도구를 사용하면 인덱스 생성과 관련된 유연성이 향상되고 지속적 통합 및 지속적 배포(CI/CD) 파이프라인에 인덱스 생성을 통합할 수 있습니다.

참고

이미지에 대한 SOCI 인덱스를 생성하려면 soci-snapshotter를 실행 중인 컴퓨터의 containerd 이미지 저장소에 이미지가 있어야 합니다. 이미지가 Docker 이미지 저장소에 있는 경우 이미지를 찾을 수 없습니다.

작업에서 지연 로딩을 사용했는지 확인

SOCI를 사용하여 작업이 지연 로드되었는지 확인하려면 작업 내에서 작업 메타데이터 엔드포인트를 확인합니다. 작업 메타데이터 엔드포인트 버전 4를 쿼리하면 쿼리하는 컨테이너의 기본 경로에 Snapshotter 필드가 있습니다. 또한 /task 경로에 각 컨테이너에 대한 Snapshotter 필드가 있습니다. 이 필드의 기본값은 overlayfs이며 SOCI를 사용하는 경우 이 필드는 soci로 설정됩니다.