학습 목표

컨테이너가 해결하는 문제

컨테이너는 애플리케이션과 그 실행에 필요한 라이브러리를 하나의 이미지로 묶습니다. 같은 이미지가 개발 노트북에서도 운영 환경에서도 같은 방식으로 실행되므로, "내 환경에서는 되는데"라는 문제가 배포 단계에서 사라집니다.

그러나 이미지를 만드는 것과 수십 개의 컨테이너를 여러 서버에 배치하고 상태를 유지하는 것은 전혀 다른 일입니다. 어느 서버에 몇 개를 띄울지, 죽으면 어디에 다시 띄울지, 새 버전을 어떻게 무중단으로 교체할지를 관리하는 것이 오케스트레이션이고, AWS에서 그 역할을 하는 서비스가 Amazon ECS와 Amazon EKS입니다.

컨테이너 관련 AWS 서비스의 역할 분담
서비스 역할 한 문장 요약
Amazon ECR 이미지 저장소(레지스트리) 컨테이너 이미지를 보관하고 배포합니다
Amazon ECS 오케스트레이션(AWS 고유) AWS에 맞춰 설계된 오케스트레이터입니다. 개념이 적고 통합이 깊습니다
Amazon EKS 오케스트레이션(Kubernetes) 관리형 Kubernetes 컨트롤 플레인을 제공합니다
AWS Fargate 서버리스 컴퓨팅 엔진 오케스트레이터가 아닙니다. ECS와 EKS가 컨테이너를 올릴 대상입니다

Amazon ECS — 구성요소와 시작 유형

클러스터 · 태스크 정의 · 태스크 · 서비스

ECS 구성요소의 포함 관계와 두 시작 유형의 책임 경계 왼쪽은 Amazon ECS 의 포함 관계입니다. 가장 바깥이 클러스터이고 그 안에 서비스가 있으며, 서비스는 원하는 태스크 개수를 계속 유지하는 역할을 합니다. 태스크는 함께 배치되는 컨테이너들의 묶음이고, 태스크 정의는 그 태스크를 어떻게 만들지 적어 둔 청사진입니다. 이미지 주소, CPU 와 메모리, 태스크 역할과 태스크 실행 역할, 로그 설정이 여기 들어갑니다. 태스크 정의 자체는 실행되는 것이 아니라 참조되는 문서입니다. 오른쪽은 두 시작 유형의 책임 경계입니다. EC2 시작 유형에서는 컨테이너를 실제로 돌리는 컨테이너 인스턴스가 고객 책임으로 남아 있어 AMI 갱신과 패치, 인스턴스 수 조정을 직접 해야 합니다. AWS Fargate 에서는 그 계층 자체가 사라져 고객이 신경 쓸 것은 컨테이너 이미지와 태스크 정의뿐입니다. 운영 부담을 줄이라는 요구가 Fargate 를 가리키는 이유가 정확히 이 한 층의 차이입니다. 포함 관계와, 시작 유형에 따라 사라지는 한 층 클러스터 서비스 — 원하는 개수를 유지합니다 태스크 컨테이너 컨테이너 태스크 같은 태스크 정의로 만들어집니다 청사진 태스크 정의 이미지 · CPU · 메모리 · 역할 · 로그 설정 실행되는 것이 아니라 참조되는 문서입니다 EC2 시작 유형 컨테이너 이미지 · 태스크 정의 고객 책임 컨테이너 인스턴스 (EC2) 고객 책임 — AMI 갱신 · 패치 · 대수 조정 하이퍼바이저 · 하드웨어 AWS 책임 AWS Fargate 컨테이너 이미지 · 태스크 정의 고객 책임 컨테이너 인스턴스 계층이 없습니다 AWS 가 가져갑니다 하이퍼바이저 · 하드웨어 — AWS 책임 두 시작 유형의 차이는 딱 한 층입니다 "인스턴스 관리 부담을 없애라"는 요구가 Fargate 를 가리키는 이유가 이 한 층입니다
Amazon ECS의 포함 관계와 두 시작 유형 — 클러스터 안에서 서비스가 태스크 정의를 근거로 태스크를 띄우며, EC2 시작 유형에서는 컨테이너 인스턴스가 우리 책임으로 남고 AWS Fargate에서는 그 계층이 사라집니다
Amazon ECS의 네 가지 구성요소
구성요소 무엇인가 비유하자면
태스크 정의(task definition) 어떤 이미지를 어떤 CPU · 메모리 · 포트 · 환경 변수 · 로그 설정 · IAM 역할로 실행할지 적은 청사진입니다. 버전(리비전)이 쌓입니다 설계도
태스크(task) 태스크 정의를 근거로 실제로 실행된 컨테이너 묶음입니다. 하나의 태스크에 여러 컨테이너가 들어갈 수 있습니다 설계도로 만든 실물 하나
서비스(service) 원하는 개수(desiredCount)의 태스크를 계속 유지합니다. 죽으면 다시 띄우고, 로드 밸런서에 등록하고, 새 버전으로 교체합니다 실물을 항상 N개로 유지하는 관리자
클러스터(cluster) 태스크와 서비스를 담는 논리적 그룹입니다. EC2 시작 유형에서는 여기에 컨테이너 인스턴스가 등록됩니다 작업장

태스크를 한 번만 실행하고 끝내는 배치 작업이라면 서비스가 필요 없습니다. 반대로 항상 떠 있어야 하는 웹 애플리케이션은 서비스로 만들어야 장애 시 자동 복구와 로드 밸런서 연동이 동작합니다.

EC2 시작 유형과 AWS Fargate SAA 빈출

같은 태스크 정의를 두 방식으로 실행할 수 있습니다. AWS API 문서는 EC2 시작 유형이 "클러스터에 등록된 Amazon EC2 인스턴스에서 태스크를 실행"하고, Fargate 시작 유형이 "Fargate 온디맨드 인프라에서 태스크를 실행"한다고 설명합니다. 차이는 기능이 아니라 누가 인스턴스를 책임지는가입니다.

Amazon ECS 시작 유형 비교 — 판단 기준은 운영 부담과 제어 수준입니다
항목 EC2 시작 유형 AWS Fargate
인스턴스 관리 고객 책임 — AMI 선택, 패치, 용량 계획, 인스턴스 확장 AWS 책임 — 인스턴스라는 개념 자체가 보이지 않습니다
과금 단위 띄워 둔 EC2 인스턴스 기준 태스크에 지정한 vCPU와 메모리 기준
밀도 조절 가능 — 한 인스턴스에 여러 태스크를 촘촘히 채워 활용률을 올릴 수 있습니다 불가 — 태스크마다 독립된 실행 환경입니다
인스턴스 수준 제어 가능 — GPU, 특정 인스턴스 패밀리, 호스트 접근, 커널 파라미터 불가 — 호스트에 접근할 수 없습니다
네트워크 모드 bridge(기본) · host · awsvpc · none awsvpc 필수
스팟 활용 스팟 인스턴스를 클러스터에 넣어 사용 Fargate Spot을 쓰려면 용량 공급자 전략을 지정해야 합니다
고르는 신호 "기존 EC2 자산을 활용", "GPU가 필요", "인스턴스 수준 튜닝이 필요", "높은 밀도로 비용을 낮춘다" "운영 부담을 최소화", "서버를 관리하고 싶지 않다", "부하가 들쭉날쭉하다"

네트워크 모드

태스크 정의의 networkMode가 컨테이너의 네트워크 방식을 정합니다. AWS API 문서는 지정하지 않으면 기본값이 bridge이며, Fargate에서는 awsvpc가 필수라고 명시합니다.

Amazon ECS 태스크의 네트워크 모드
모드 동작 함의
awsvpc 태스크마다 탄력적 네트워크 인터페이스가 할당되고 VPC의 IP 주소를 받습니다 태스크 단위로 보안 그룹을 붙일 수 있습니다. Fargate에서는 이 모드만 씁니다
bridge(기본) 인스턴스의 가상 네트워크 브리지를 씁니다 동적 호스트 포트 매핑을 쓸 수 있어 한 인스턴스에 같은 태스크를 여러 개 띄울 수 있습니다
host 인스턴스의 네트워크 스택을 직접 씁니다 성능이 높지만 포트 매핑이 고정되어 같은 태스크를 한 인스턴스에 여러 개 띄울 수 없습니다
none 외부 연결이 없습니다 포트 매핑을 지정할 수 없습니다

awsvpc 모드의 태스크는 VPC 안의 리소스와 같은 방식으로 통신하므로 보안 그룹과 서브넷 설계가 3장 VPC 네트워킹 기초의 규칙을 그대로 따릅니다. 프라이빗 서브넷에 둔 태스크가 인터넷으로 나가야 하면 NAT 게이트웨이가, AWS 서비스에만 접근하면 되면 VPC 엔드포인트가 필요합니다.

서비스 스케줄링 전략

서비스에는 두 가지 스케줄링 전략이 있습니다.

create-service.sh — Fargate 시작 유형으로 서비스를 만들고 다중 가용 영역 서브넷에 배치 (ID와 이름은 예시입니다)
aws ecs create-service \
  --cluster app-cluster \
  --service-name web \
  --task-definition web:7 \
  --desired-count 4 \
  --launch-type FARGATE \
  --network-configuration 'awsvpcConfiguration={
      subnets=[subnet-0123456789abcdef0,subnet-0abcdef1234567890],
      securityGroups=[sg-0123456789abcdef0],
      assignPublicIp=DISABLED}' \
  --health-check-grace-period-seconds 60

--health-check-grace-period-seconds는 태스크가 처음 시작된 뒤 로드 밸런서와 컨테이너 상태 확인 실패를 무시하는 기간입니다. 지정하지 않으면 기본값은 0이므로, 부팅이 느린 애플리케이션은 준비되기도 전에 비정상으로 판정되어 반복해서 교체될 수 있습니다.

태스크 역할과 태스크 실행 역할 SAA 빈출

이름이 비슷해서 가장 많이 혼동되는 지점이고, 그래서 시험이 자주 노립니다. 두 역할은 서로 다른 주체가 서로 다른 시점에 씁니다.

태스크 역할과 태스크 실행 역할 — 화살표의 출발점이 다릅니다 ECS 태스크에는 이름이 비슷한 두 개의 IAM 역할이 붙습니다. 둘을 가르는 기준은 누가 그 권한을 쓰느냐입니다. 위쪽 화살표는 컨테이너 안에서 도는 애플리케이션 코드에서 출발합니다. 코드가 SDK 로 S3 나 DynamoDB 나 SQS 를 호출할 때 쓰는 자격 증명이 태스크 역할입니다. 아래쪽 화살표는 컨테이너가 아니라 ECS 에이전트와 Fargate 인프라에서 출발합니다. 태스크를 시작하기 위해 ECR 에서 이미지를 내려받고, CloudWatch Logs 로 로그를 보내고, Secrets Manager 나 SSM 파라미터 스토어에서 값을 읽어 환경 변수로 주입하는 일은 컨테이너가 하는 일이 아니라 태스크를 띄우는 쪽이 하는 일이며, 그때 쓰는 자격 증명이 태스크 실행 역할입니다. 그래서 진단도 갈립니다. 컨테이너 코드가 AccessDenied 를 받으면 태스크 역할을 보고, 이미지를 못 받거나 로그가 아예 남지 않으면 태스크 실행 역할을 봅니다. Fargate 에서도 두 역할은 그대로 필요합니다. 누가 그 권한을 쓰는가로 갈립니다 ECS 태스크 컨테이너 애플리케이션 코드 SDK 로 AWS 서비스를 호출합니다 ECS 에이전트 · Fargate 인프라 태스크를 띄우는 쪽이며 컨테이너 안이 아닙니다 태스크 역할 taskRoleArn 태스크 실행 역할 executionRoleArn Amazon S3 Amazon DynamoDB 코드가 직접 부르는 서비스 Amazon ECR — 이미지 CloudWatch Logs — 로그 Secrets Manager — 비밀 컨테이너 코드가 AccessDenied 를 받는다 태스크 역할을 봅니다 애플리케이션이 부르는 API 권한이 여기 있습니다 이미지를 못 받거나 로그가 안 남는다 태스크 실행 역할을 봅니다 태스크가 시작조차 못 하는 원인이 여기입니다 Fargate 에서도 두 역할은 그대로 필요하며, 하나로 합쳐지지 않습니다
태스크 역할과 태스크 실행 역할의 주체 차이 — 태스크 역할은 컨테이너 안의 애플리케이션 코드가 Amazon S3나 Amazon DynamoDB를 호출할 때 쓰는 권한이고, 태스크 실행 역할은 ECS 에이전트가 Amazon ECR에서 이미지를 받고 CloudWatch Logs에 로그를 보낼 때 쓰는 권한입니다
태스크 역할과 태스크 실행 역할의 비교
항목 태스크 역할(taskRoleArn) 태스크 실행 역할(executionRoleArn)
누가 쓰는가 컨테이너 안의 애플리케이션 코드 Amazon ECS 컨테이너 에이전트(우리 코드가 아닙니다)
언제 쓰는가 태스크가 실행되는 동안, 코드가 AWS API를 호출할 때 태스크를 시작하기 전과 실행 중, 인프라 작업을 할 때
대표 권한 S3 객체 읽기, DynamoDB 테이블 쓰기, SQS 메시지 수신 ECR에서 이미지 가져오기, CloudWatch Logs에 로그 쓰기, Secrets Manager에서 값 주입
AWS 문서의 정의 "이 태스크의 컨테이너가 맡을 수 있는 IAM 역할. 이 태스크의 모든 컨테이너에 이 역할의 권한이 부여됩니다" "ECS 컨테이너 에이전트가 사용자를 대신해 AWS API를 호출하도록 허용하는 태스크 실행 역할"
없거나 잘못되면 태스크는 뜨지만 애플리케이션이 권한 오류를 냅니다 태스크가 아예 시작되지 않습니다(이미지를 못 받거나 로그를 못 씀)
task-definition.json — 두 역할을 각각 지정한 태스크 정의 (ARN은 예시입니다)
{
  "family": "web",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "512",
  "memory": "1024",
  "taskRoleArn": "arn:aws:iam::123456789012:role/WebTaskRole",
  "executionRoleArn": "arn:aws:iam::123456789012:role/WebTaskExecutionRole",
  "containerDefinitions": [
    {
      "name": "web",
      "image": "123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/web:1.4.0",
      "essential": true,
      "portMappings": [{ "containerPort": 8080, "protocol": "tcp" }],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/web",
          "awslogs-region": "ap-northeast-2",
          "awslogs-stream-prefix": "ecs"
        }
      }
    }
  ]
}

Amazon ECR — 이미지 레지스트리

Amazon Elastic Container Registry(ECR)는 컨테이너 이미지를 저장하는 관리형 레지스트리입니다. ECS · EKS와 같은 계정 · 리전 안에 있으므로 이미지를 받아오는 경로가 짧고, 접근 제어를 IAM으로 통일할 수 있습니다.

Amazon ECR에서 시험 관점으로 알아 둘 것
기능 무엇을 하는가 언제 답이 되는가
리포지토리 정책 리소스 기반 정책으로 다른 계정에 풀 권한을 줍니다 "조직의 여러 계정이 같은 이미지를 써야 한다"
이미지 스캔 이미지의 취약점을 검사합니다 "배포 전 취약점을 확인해야 한다"
수명 주기 정책 오래되거나 태그 없는 이미지를 자동으로 정리합니다 "레지스트리 저장 비용이 계속 늘어난다"
태그 변경 불가 설정 같은 태그를 덮어쓰지 못하게 막습니다 "배포된 이미지가 바뀌면 안 된다"
교차 리전 복제 레지스트리 설정으로 다른 리전 · 계정에 이미지를 복제합니다 "다중 리전 배포에서 이미지 다운로드가 느리다", 리전 장애 대비
저장 시 암호화 이미지를 암호화해 저장하며 KMS 키를 지정할 수 있습니다 "고객 관리형 키로 암호화해야 한다"

서비스 오토스케일링과 로드 밸런서 연동

서비스 오토스케일링

ECS 서비스의 태스크 개수는 Application Auto Scaling이 조절합니다. 조절 대상(확장 가능 차원)은 ecs:service:DesiredCount이며, 정책 유형은 대상 추적 · 단계별 · 예측이 있습니다. Auto Scaling 그룹과 개념이 같으므로 7장 로드 밸런싱과 오토스케일링에서 배운 판단이 그대로 적용됩니다.

여기서 EC2 시작 유형에는 확장 축이 두 개라는 점이 중요합니다.

Fargate에는 두 번째 축이 없습니다. 태스크 개수만 조절하면 끝입니다. 이것이 "운영 부담이 적다"는 말의 구체적인 내용입니다.

register-and-scale.sh — ECS 서비스를 확장 대상으로 등록하고 대상 추적 정책을 붙입니다 (이름과 값은 예시입니다)
aws application-autoscaling register-scalable-target \
  --service-namespace ecs \
  --scalable-dimension ecs:service:DesiredCount \
  --resource-id service/app-cluster/web \
  --min-capacity 4 \
  --max-capacity 40

aws application-autoscaling put-scaling-policy \
  --service-namespace ecs \
  --scalable-dimension ecs:service:DesiredCount \
  --resource-id service/app-cluster/web \
  --policy-name cpu-target-50 \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration file://target-tracking.json

Application Load Balancer 연동

서비스에 로드 밸런서를 붙이면 태스크가 뜨고 질 때마다 대상 그룹에 자동으로 등록되고 해제됩니다. AWS 문서는 로드 밸런서를 쓰는 서비스의 태스크는 실행 중이면서 로드 밸런서가 정상으로 보고할 때만 정상으로 간주된다고 명시합니다.

컨테이너 워크로드에서 로드 밸런서 선택
요구 선택 근거
경로나 호스트로 여러 서비스에 나눠 보낸다 Application Load Balancer L7 리스너 규칙으로 경로 기반 라우팅을 합니다. 마이크로서비스의 기본 선택입니다
TCP · UDP 트래픽이거나 고정 IP가 필요하다 Network Load Balancer L4에서 동작하며 가용 영역마다 고정 IP를 가질 수 있습니다
한 인스턴스에 같은 태스크를 여러 개 띄운다 ALB + bridge 모드의 동적 포트 매핑 포트가 겹치지 않게 자동 배정됩니다. host 모드로는 불가능합니다
태스크 단위로 보안 그룹을 붙인다 awsvpc 모드 + 대상 유형 ip 태스크마다 네트워크 인터페이스가 있으므로 IP 대상으로 등록됩니다

로드 밸런서 세 종류의 계층과 프로토콜 차이는 7장에서 정리했습니다.

Amazon EKS — 관리형 Kubernetes

컨트롤 플레인과 노드

EKS는 Kubernetes 컨트롤 플레인을 관리형으로 제공합니다. AWS API 문서는 컨트롤 플레인이 AWS가 관리하는 계정에서 실행되고, 여러 가용 영역에 걸쳐 프로비저닝되며 Network Load Balancer가 앞에 놓인다고 설명합니다. 노드는 우리 계정에서 실행되며 컨트롤 플레인에 연결됩니다.

즉 EKS에서도 컴퓨팅 계층의 선택은 남아 있습니다. 관리형 노드 그룹으로 EC2 인스턴스를 쓰거나, Fargate 프로파일을 만들어 파드를 Fargate에서 실행합니다. Fargate 프로파일은 선택기(selector)로 어떤 파드를 Fargate에서 실행할지 선언하며, AWS 문서는 프로파일마다 선택기를 최대 5개까지 둘 수 있고 각 선택기에 네임스페이스가 필수라고 명시합니다.

언제 ECS 대신 EKS인가

Amazon ECS와 Amazon EKS의 선택 기준
항목 Amazon ECS Amazon EKS
오케스트레이터 AWS 고유. 개념이 적고 AWS 서비스와의 통합이 기본입니다 Kubernetes. 업계 표준 API와 생태계를 그대로 씁니다
학습 · 운영 부담 낮음 — 태스크 정의와 서비스만 알면 시작됩니다 높음 — 클러스터 버전 업그레이드, 애드온, 매니페스트 관리가 남습니다
이식성 AWS 안에서 동작합니다 온프레미스나 다른 환경의 Kubernetes와 같은 매니페스트를 씁니다
고르는 신호 "AWS만 쓴다", "운영 부담을 최소화한다", "빠르게 시작한다" "이미 Kubernetes를 쓰고 있다", "온프레미스 클러스터와 같은 방식으로 운영해야 한다", "Kubernetes 생태계 도구가 필요하다"

ECS · EKS · Fargate · Lambda — 선택 기준 SAA 빈출

이 판단은 두 단계로 나누면 흔들리지 않습니다. 먼저 "컨테이너가 필요한가 함수로 충분한가"를 가르고, 그다음 "무엇이 오케스트레이션하고 어디에 올릴 것인가"를 정합니다.

요구사항에서 컴퓨팅 모델로 가는 판단 경로
문제문의 신호 선택 근거
짧은 이벤트 처리, 실행이 15분 이내 AWS Lambda 서버도 컨테이너 오케스트레이션도 없습니다. 운영 부담이 가장 낮습니다
15분을 넘거나 상시 실행되는 서버 프로세스 컨테이너 Lambda의 최대 실행 시간 900초를 넘으면 함수로 담을 수 없습니다(12장)
기존 컨테이너 이미지를 그대로 옮긴다 ECS on Fargate 이미지를 바꾸지 않고 서버 관리 없이 실행합니다
운영 부담 최소, Kubernetes 요구 없음 ECS on Fargate 인스턴스 계층이 사라지고 개념도 가장 적습니다
GPU · 인스턴스 수준 제어 · 높은 밀도가 필요 ECS on EC2 Fargate는 호스트 제어를 제공하지 않습니다
이미 Kubernetes를 쓰고 있고 이식성이 요구된다 EKS 같은 매니페스트와 도구를 유지합니다
중단되어도 되는 배치 작업의 비용을 낮춘다 스팟 활용(EC2 스팟 또는 Fargate Spot) 중단 가능성을 감수하는 대신 비용을 낮춥니다. Fargate Spot은 용량 공급자 전략이 필요합니다

흔한 오해

시험 포인트 정리

확인 문제

이 장의 핵심을 확인하는 10문항입니다. 키보드만으로 완주할 수 있습니다 — 숫자키 1~5로 선택지를 고르고 Enter로 제출합니다.

학습용 유형 연결형과 순서 배열 문항이 섞여 있을 수 있습니다. 이 두 유형은 암기 확인에 효율이 좋아 기본개념 확인 문제에만 넣었으며, 실제 SAA-C03 시험에는 출제되지 않습니다.

이어서 볼 곳

공식 문서 출처

이 장의 동작 서술은 모두 아래 문서에서 확인했습니다.