5 분 소요

들어가며

컨테이너 기반 애플리케이션을 AWS에서 운영하다 보면 다음과 같은 고민을 하게 됩니다:

  • EC2 인스턴스를 직접 관리하는 것이 부담스러움
  • 클러스터 크기 조정과 패킹 최적화가 복잡함
  • 서버 유형 선택과 용량 계획이 어려움
  • 인프라 관리보다 애플리케이션 개발에 집중하고 싶음

이런 문제들을 해결하기 위해 AWS Fargate를 사용할 수 있습니다. Fargate는 Amazon ECS에서 서버나 클러스터를 관리할 필요 없이 컨테이너를 실행할 수 있게 해주는 서버리스 컨테이너 실행 기술입니다1. 이 글에서는 ECS Fargate의 구성 요소와 작동 방식을 자세히 살펴보고자 합니다.

ECS Fargate란?

기본 개념

AWS Fargate는 Amazon ECS에 사용할 수 있는 서버리스 컴퓨팅 엔진으로, EC2 인스턴스의 서버나 클러스터를 관리할 필요 없이 컨테이너를 실행할 수 있게 해줍니다. Fargate를 사용하면 가상 머신의 클러스터를 프로비저닝, 구성 또는 조정할 필요가 없습니다.

Fargate의 주요 특징

  1. 서버리스: 인프라 관리 불필요, 컨테이너만 실행
  2. 자동 스케일링: 애플리케이션 요구사항에 따라 자동으로 확장/축소
  3. 격리: 각 태스크는 자체 격리 경계를 가지며 다른 태스크와 리소스를 공유하지 않음
  4. 간편한 시작: 컨테이너 패키징 → CPU/메모리 지정 → 네트워킹 정의 → 실행
  5. 다양한 플랫폼: Linux(Amazon Linux 2, Bottlerocket) 및 Windows 지원

Fargate vs EC2 비교

특징 EC2 Fargate
인프라 관리 직접 관리 필요 AWS가 관리
클러스터 구성 수동 구성 자동 구성
용량 계획 직접 계획 자동 처리
서버 유형 선택 필요 불필요
격리 컨테이너 레벨 태스크 레벨 (완전 격리)
비용 인스턴스 시간 기준 태스크 실행 시간 기준

태스크 정의 (Task Definition)

태스크 정의란?

태스크 정의는 컨테이너가 어떻게 실행될지 정의하는 JSON 문서입니다. Fargate를 사용하려면 requiresCompatibilities 파라미터를 FARGATE로 설정해야 합니다.

기본 태스크 정의 구조

{
  "family": "my-fargate-task",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "256",
  "memory": "512",
  "containerDefinitions": [
    {
      "name": "my-container",
      "image": "nginx:latest",
      "portMappings": [
        {
          "containerPort": 80,
          "protocol": "tcp"
        }
      ],
      "essential": true,
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/my-fargate-task",
          "awslogs-region": "ap-northeast-2",
          "awslogs-stream-prefix": "ecs"
        }
      }
    }
  ]
}

필수 파라미터

1. requiresCompatibilities

Fargate를 사용하려면 반드시 FARGATE로 설정해야 합니다:

"requiresCompatibilities": ["FARGATE"]

2. networkMode

Fargate는 awsvpc 네트워크 모드만 지원합니다:

"networkMode": "awsvpc"

3. CPU와 Memory

Fargate는 특정 CPU/메모리 조합만 지원합니다. 유효한 조합은 다음과 같습니다:

CPU (vCPU) CPU (단위) Memory 옵션 (MB) Memory 옵션 (GB)
0.25 256 512; 1024; 2048 0.5; 1; 2
0.5 512 1024; 2048; 3072; 4096 1; 2; 3; 4
1 1024 2048; 3072; 4096; 5120; 6144; 7168; 8192 2; 3; 4; 5; 6; 7; 8
2 2048 4096 ~ 16384 (1GB 단위) 4 ~ 16
4 4096 8192 ~ 30720 (1GB 단위) 8 ~ 30
"cpu": "256",
"memory": "512"

용량 공급자 (Capacity Provider)

용량 공급자란?

용량 공급자는 태스크를 실행할 컴퓨팅 리소스를 제공하는 메커니즘입니다. Fargate에서는 두 가지 용량 공급자를 사용할 수 있습니다.

용량 공급자 비교

특징 Fargate Fargate Spot
실행 방식 온디맨드 실행 여분의 컴퓨팅 용량 사용
비용 표준 요금 최대 70% 할인
중단 가능 여부 중단 없음 2분 경고 후 중단 가능
성능 안정적인 성능 안정적인 성능 (중단 시 제한)
사용 시나리오 프로덕션 워크로드
중단 불가능한 서비스
배치 작업
테스트 환경
개발 환경
중단 가능한 워크로드

용량 공급자 전략

클러스터에 여러 용량 공급자를 설정하고 우선순위를 지정할 수 있습니다:

{
  "capacityProviderStrategy": [
    {
      "capacityProvider": "FARGATE_SPOT",
      "weight": 2,
      "base": 0
    },
    {
      "capacityProvider": "FARGATE",
      "weight": 1,
      "base": 1
    }
  ]
}

이 설정은:

  • 기본적으로 1개의 태스크는 FARGATE에서 실행 (base: 1)
  • 추가 태스크는 FARGATE_SPOT을 2배 더 선호 (weight: 2)

네트워킹 구성

awsvpc 네트워크 모드

Fargate는 awsvpc 네트워크 모드만 지원합니다. 이 모드는 각 태스크에 자체 탄력적 네트워크 인터페이스(ENI)를 제공합니다.

네트워크 구성 요소

1. 서브넷

태스크가 실행될 서브넷을 지정합니다:

aws ecs run-task \
  --cluster my-cluster \
  --task-definition my-fargate-task:1 \
  --launch-type FARGATE \
  --network-configuration "awsvpcConfiguration={subnets=[subnet-12345,subnet-67890],assignPublicIp=ENABLED}"

2. 보안 그룹

태스크에 적용할 보안 그룹을 지정합니다:

--network-configuration "awsvpcConfiguration={
  subnets=[subnet-12345],
  securityGroups=[sg-12345],
  assignPublicIp=ENABLED
}"

3. Public IP 할당

인터넷 접근이 필요한 경우 Public IP를 할당합니다:

assignPublicIp: ENABLED  # 인터넷 게이트웨이를 통한 접근
assignPublicIp: DISABLED # NAT 게이트웨이를 통한 접근

서비스 네트워크 구성 예시

{
  "networkConfiguration": {
    "awsvpcConfiguration": {
      "subnets": [
        "subnet-12345",
        "subnet-67890"
      ],
      "securityGroups": [
        "sg-12345"
      ],
      "assignPublicIp": "DISABLED"
    }
  }
}

로드 밸런싱

지원되는 로드 밸런서

Fargate 서비스는 다음 로드 밸런서를 지원합니다:

  1. Application Load Balancer (ALB): HTTP/HTTPS 트래픽 (Layer 7)
  2. Network Load Balancer (NLB): TCP/UDP 트래픽 (Layer 4)
  3. Gateway Load Balancer: 트래픽 검사 및 라우팅

대상 그룹 설정

중요: Fargate 태스크는 awsvpc 네트워크 모드를 사용하므로, 대상 그룹의 대상 유형을 instance가 아닌 ip로 설정해야 합니다.

대상 그룹 설정:
  대상 유형: ip (instance 아님)
  프로토콜: HTTP 또는 HTTPS
  포트: 컨테이너 포트
  Health Check: 적절한 경로 설정

로드 밸런서 연결 예시

aws ecs create-service \
  --cluster my-cluster \
  --service-name my-service \
  --task-definition my-fargate-task:1 \
  --desired-count 2 \
  --launch-type FARGATE \
  --network-configuration "awsvpcConfiguration={
    subnets=[subnet-12345,subnet-67890],
    securityGroups=[sg-12345],
    assignPublicIp=DISABLED
  }" \
  --load-balancers "targetGroupArn=arn:aws:elasticloadbalancing:...,
    containerName=my-container,
    containerPort=80"

태스크 실행 방법

1. 콘솔을 사용한 태스크 실행

AWS 콘솔에서 ECS → 클러스터 → 태스크 실행:

  1. 클러스터 선택
  2. “태스크 실행” 클릭
  3. 태스크 정의 선택
  4. 플랫폼 버전 선택 (선택사항)
  5. 네트워크 구성 설정
  6. 태스크 실행

2. AWS CLI를 사용한 태스크 실행

aws ecs run-task \
  --cluster my-cluster \
  --task-definition my-fargate-task:1 \
  --launch-type FARGATE \
  --platform-version "LATEST" \
  --network-configuration "awsvpcConfiguration={
    subnets=[subnet-12345,subnet-67890],
    securityGroups=[sg-12345],
    assignPublicIp=ENABLED
  }"

3. 서비스로 실행

지속적으로 실행되는 애플리케이션은 서비스로 생성합니다:

aws ecs create-service \
  --cluster my-cluster \
  --service-name my-service \
  --task-definition my-fargate-task:1 \
  --desired-count 2 \
  --launch-type FARGate \
  --network-configuration "awsvpcConfiguration={
    subnets=[subnet-12345,subnet-67890],
    securityGroups=[sg-12345],
    assignPublicIp=DISABLED
  }"

로깅 및 모니터링

CloudWatch Logs 통합

Fargate 태스크의 로그를 CloudWatch Logs로 전송할 수 있습니다:

{
  "logConfiguration": {
    "logDriver": "awslogs",
    "options": {
      "awslogs-group": "/ecs/my-fargate-task",
      "awslogs-region": "ap-northeast-2",
      "awslogs-stream-prefix": "ecs"
    }
  }
}

CloudWatch 메트릭

Fargate 태스크는 다음 메트릭을 제공합니다:

  • CPU 사용률
  • 메모리 사용률
  • 네트워크 I/O
  • 태스크 수

사용량 지표

CloudWatch 사용량 지표를 통해 계정의 리소스 사용량을 확인할 수 있습니다:

주요 지표:
  - FargateOnDemandTaskCount: 온디맨드 태스크 수
  - FargateSpotTaskCount: Spot 태스크 수
  - FargateTaskCount: 전체 태스크 수

실전 활용 시나리오

시나리오 1: 웹 애플리케이션 배포

구성:
  - 태스크 정의: 웹 서버 컨테이너
  - 서비스: ALB와 연결된 서비스
  - 용량: Fargate (안정성 우선)
  - 네트워크: Private 서브넷 + NAT Gateway
  - 로그: CloudWatch Logs

장점:
  - 인프라 관리 불필요
  - 자동 스케일링
  - 고가용성

시나리오 2: 배치 작업 처리

구성:
  - 태스크 정의: 배치 작업 컨테이너
  - 실행: EventBridge 스케줄 또는 수동 실행
  - 용량: Fargate Spot (비용 절감)
  - 네트워크: Private 서브넷

장점:
  - 비용 효율적 (Spot 사용)
  - 필요할 때만 실행
  - 인프라 관리 불필요

시나리오 3: 마이크로서비스 아키텍처

구성:
  - 여러 서비스: 각각 독립적인 Fargate 서비스
  - 서비스 디스커버리: ECS Service Discovery 또는 ALB
  - 로드 밸런싱: ALB를 통한 트래픽 분산
  - 네트워크: VPC 내부 통신

장점:
  - 각 서비스 독립적 스케일링
  - 격리된 실행 환경
  - 간편한 배포 및 관리

마무리

ECS Fargate를 올바르게 구성하면:

  1. 서버리스 운영: 인프라 관리 없이 컨테이너 실행
  2. 자동 스케일링: 애플리케이션 요구사항에 따라 자동 확장/축소
  3. 비용 효율성: Fargate Spot을 활용한 비용 절감
  4. 보안: 격리된 실행 환경과 세밀한 네트워크 제어
  5. 간편성: 컨테이너 패키징 후 간단한 설정으로 실행

Fargate는 서버 관리의 복잡성을 제거하고 애플리케이션 개발에 집중할 수 있게 해주는 강력한 서비스입니다. 적절한 태스크 정의, 네트워크 구성, 용량 공급자 전략을 통해 효율적이고 안정적인 컨테이너 환경을 구축할 수 있습니다.


참고 자료:

  1. AWS 공식 문서: Amazon ECS에 대한 AWS Fargate - Fargate 아키텍처 및 구성 가이드 

카테고리:

업데이트:

댓글남기기