☁️ 클라우드

AWS ECS

Elastic Container Service

AWS의 컨테이너 오케스트레이션 서비스. Docker 컨테이너를 손쉽게 배포, 관리, 스케일링.

📖 상세 설명

AWS ECS(Elastic Container Service)는 AWS에서 제공하는 완전 관리형 컨테이너 오케스트레이션 서비스입니다. Docker 컨테이너를 AWS 인프라에서 쉽게 실행, 중지, 관리할 수 있으며, 자체적인 컨테이너 관리 도구나 Kubernetes 없이도 컨테이너 기반 애플리케이션을 운영할 수 있습니다.

2015년 GA(정식 출시)되었으며, AWS에서 가장 오래된 컨테이너 서비스입니다. EC2 Launch Type(직접 EC2 인스턴스 관리)과 Fargate Launch Type(서버리스 컨테이너) 두 가지 방식을 지원합니다. Fargate를 사용하면 서버 프로비저닝, 패치, 스케일링 없이 컨테이너만 정의하면 AWS가 인프라를 자동 관리합니다.

ECS의 핵심 개념은 Cluster(컨테이너 실행 환경), Service(장기 실행 태스크 관리), Task Definition(컨테이너 설정 청사진), Task(실제 실행 인스턴스)입니다. ALB/NLB와 자동 연동되어 트래픽 분산이 용이하고, Service Auto Scaling으로 CPU/메모리 기반 자동 확장이 가능합니다.

실무에서 ECS는 Kubernetes 대비 학습 곡선이 낮고 AWS 네이티브 통합이 탁월해서, AWS 중심 인프라에서 빠르게 컨테이너를 도입하려는 팀에게 적합합니다. ECR(Elastic Container Registry)과 연동하여 이미지 저장소를 관리하고, CodePipeline/CodeDeploy와 연동하여 Blue/Green 배포, Rolling 배포를 손쉽게 구현할 수 있습니다.

💻 코드 예제

{
  "family": "my-app",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "512",
  "memory": "1024",
  "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
  "taskRoleArn": "arn:aws:iam::123456789012:role/ecsTaskRole",
  "containerDefinitions": [
    {
      "name": "app",
      "image": "123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-app:latest",
      "essential": true,
      "portMappings": [
        {
          "containerPort": 8080,
          "protocol": "tcp"
        }
      ],
      "environment": [
        {
          "name": "NODE_ENV",
          "value": "production"
        }
      ],
      "secrets": [
        {
          "name": "DATABASE_URL",
          "valueFrom": "arn:aws:secretsmanager:ap-northeast-2:123456789012:secret:db-url"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/my-app",
          "awslogs-region": "ap-northeast-2",
          "awslogs-stream-prefix": "ecs"
        }
      },
      "healthCheck": {
        "command": ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"],
        "interval": 30,
        "timeout": 5,
        "retries": 3,
        "startPeriod": 60
      }
    }
  ]
}

🗣️ 실무에서 이렇게 말하세요

💬 아키텍처 논의에서
"ECS Fargate로 가면 EC2 인스턴스 관리 안 해도 되고, 태스크 단위로 비용 나와서 예측이 쉬워요. ALB랑 자동 연동되고, ECR에서 이미지 풀할 때 IAM Role로 인증되니까 이미지 URL만 바꿔서 배포하면 됩니다. Blue/Green 배포는 CodeDeploy 연동하면 바로 돼요."
💬 면접에서
"ECS Fargate 기반으로 마이크로서비스 10개를 운영했습니다. Task Definition에서 Secrets Manager 연동으로 시크릿 관리하고, Container Insights로 메트릭 수집해서 CPU 70% 기준으로 Auto Scaling 설정했습니다. 배포는 CodePipeline에서 ECR push를 트리거로 ECS 서비스 업데이트가 자동으로 롤링 배포됩니다."
💬 장애 대응에서
"ECS 태스크가 계속 재시작되고 있는데, CloudWatch 로그 보니까 OOMKilled네요. Task Definition에서 메모리를 1GB로 올렸는데 실제 컨테이너가 더 쓰고 있어요. memory 값 늘리고, 애플리케이션에서 메모리 누수 있는지 확인해봐야 해요. healthCheck startPeriod도 넉넉하게 잡아서 초기 시작 시간 확보하고요."

⚠️ 흔한 실수 & 주의사항

IAM Role 혼동

ECS에는 Task Execution Role(AWS API 호출용 - ECR 풀, CloudWatch 로깅)과 Task Role(애플리케이션 내부 AWS API 호출용 - S3, DynamoDB 접근)이 별도로 필요합니다. 둘을 혼동하면 권한 오류가 발생합니다.

네트워크 설정 누락

Fargate는 awsvpc 네트워크 모드를 사용합니다. Private Subnet에 배치하면 NAT Gateway가 있어야 ECR에서 이미지를 풀할 수 있습니다. VPC Endpoint(ECR, S3, CloudWatch Logs)를 설정하면 NAT Gateway 없이도 가능하고 비용도 절감됩니다.

프로덕션 모범 사례

Service에 deployment_circuit_breaker를 활성화해서 배포 실패 시 자동 롤백되게 하세요. Container Insights를 켜서 메트릭을 수집하고, 최소 2개 이상의 태스크로 고가용성을 확보하세요. Fargate Spot을 사용하면 최대 70% 비용 절감이 가능하지만 중단 가능성이 있으니 내결함성을 고려하세요.

🔗 관련 용어

📚 더 배우기