Amazon ECS Express Mode Workshop
Amazon ECS Express Mode는 2025년 11월 AWS re:Invent에서 발표된 Amazon ECS의 새로운 기능입니다. 컨테이너 이미지, Task Execution Role, Infrastructure Role 세 가지만 제공하면 프로덕션 수준의 컨테이너 애플리케이션을 자동으로 배포할 수 있습니다.
개념 이해
- • ECS의 진화와 Express Mode
- • 핵심 개념 및 아키텍처
- • 기존 ECS vs Express Mode 비교
- • 네트워킹 옵션
실습 (Step 0-10)
- • 환경 준비 및 샘플 앱 작성
- • ECR 푸시 및 IAM 역할 생성
- • Express Mode 배포
- • 업데이트, 스케일링, 모니터링
베스트 프랙티스
- • 보안, 가용성, 성능
- • 운영 및 배포 전략
부록
- • 적합한 사용 사례
- • 다음 단계 및 리소스
- ECS Express Mode의 핵심 개념과 아키텍처 이해
- 기존 ECS 배포 방식과의 차이점 파악
- 단일 명령으로 프로덕션 수준 애플리케이션 배포
- 커스텀 VPC/Subnet을 활용한 네트워크 구성
- Canary 배포와 자동 롤백 메커니즘 이해
- 오토 스케일링 및 모니터링 설정
- 프로덕션 환경을 위한 베스트 프랙티스 적용
📈 Amazon ECS의 진화
Amazon ECS 출시
EC2 인스턴스 기반 컨테이너 오케스트레이션 서비스 시작
AWS Fargate 출시
서버리스 컨테이너 실행 환경, 인프라 관리 부담 제거
ECS Managed Instances
EC2 인스턴스 프로비저닝 및 라이프사이클 관리 자동화
ECS Express Mode
단일 명령으로 프로덕션 수준 배포, 인프라 복잡성 완전 추상화
🎯 Express Mode 핵심 특징
단일 명령 배포
컨테이너 이미지 URI만 제공하면 전체 인프라가 자동 구성됩니다.
AWS 베스트 프랙티스
Canary 배포, 자동 롤백, 오토 스케일링이 기본 적용됩니다.
즉시 사용 가능한 URL
AWS 제공 HTTPS 도메인이 자동 할당되어 바로 접근 가능합니다.
완전한 제어권
생성된 모든 리소스에 접근 가능하며, 필요시 직접 수정할 수 있습니다.
🔑 Express Mode의 3가지 필수 요소
Container Image
ECR 또는 다른 레지스트리의 컨테이너 이미지 URI
123456789.dkr.ecr.ap-northeast-2.amazonaws.com/myapp:v1Task Execution Role
ECS가 태스크를 실행할 때 사용하는 IAM 역할. ECR에서 이미지를 가져오고 CloudWatch에 로그를 기록하는 권한 포함
AmazonECSTaskExecutionRolePolicyInfrastructure Role
Express Mode가 ALB, 보안 그룹 등 인프라 리소스를 생성하고 관리할 때 사용하는 IAM 역할
AmazonECSInfrastructureRolePolicyForExpressGateway📊 기존 ECS vs Express Mode 상세 비교
| 항목 | 기존 ECS | ECS Express Mode |
|---|---|---|
| 초기 설정 시간 | 수 시간 ~ 수 일 | 수 분 |
| 필요한 AWS 지식 | VPC, ALB, IAM, ECS 전반 | 기본적인 컨테이너 개념 |
| 네트워킹 설정 | VPC, 서브넷, 라우팅, IGW 수동 구성 | 자동 구성 (또는 기존 VPC 지정) |
| 로드 밸런서 | ALB/NLB 별도 생성, 리스너/타겟 그룹 설정 | 자동 생성 및 구성 |
| SSL/TLS 인증서 | ACM 인증서 발급 및 연결 필요 | AWS 제공 도메인에 자동 적용 |
| 오토 스케일링 | Application Auto Scaling 별도 설정 | CPU 기반 자동 구성 (커스텀 가능) |
| 배포 전략 | 롤링/블루-그린/카나리 직접 구성 | Canary 배포 기본 적용 |
| 롤백 | 수동 또는 CodeDeploy 연동 | 알람 기반 자동 롤백 |
| 모니터링 | CloudWatch 대시보드 직접 구성 | 기본 메트릭 자동 수집 |
| 비용 최적화 | ALB 개별 생성으로 비용 증가 | 최대 25개 서비스가 ALB 공유 |
| 인프라 제어 | 완전한 제어 | 완전한 제어 (생성 후 수정 가능) |
| IaC 지원 | CloudFormation, CDK, Terraform | CloudFormation, CDK, Terraform |
| 적합한 사용 사례 | 복잡한 커스텀 요구사항, 멀티 컨테이너 | 웹앱/API, 빠른 프로토타이핑, 표준 워크로드 |
🌐 네트워킹 옵션 (기존 VPC 사용 가능)
Express Mode는 기본적으로 Default VPC를 사용하지만, 기존 VPC와 Subnet을 지정할 수 있습니다.
| 설정 | 기본값 | 커스텀 가능 | 비고 |
|---|---|---|---|
| VPC | Default VPC | ✅ | 기존 VPC 선택 가능 |
| Subnet | Default VPC의 Public Subnet | ✅ | 최소 2개 AZ, 각 8개 이상 IP 필요 |
| Security Group | 자동 생성 (서비스용 + ALB용) | ✅ | 기존 SG 지정 가능 |
| Public IP | Public Subnet이면 자동 활성화 | 자동 | Private Subnet이면 비활성화 |
| ALB 타입 | Public Subnet → Internet-facing | 자동 | Private Subnet → Internal |
Subnet 타입별 동작
Public Subnet
- • ALB: Internet-facing ALB
- • Public IP: 활성화 (assignPublicIp: ENABLED)
- • 용도: 인터넷에서 접근 가능한 웹 애플리케이션
Private Subnet
- • ALB: Internal ALB
- • Public IP: 비활성화
- • 용도: VPC 내부에서만 접근 가능한 내부 서비스
- ⚠️ NAT Gateway 필요 (ECR 이미지 풀링용)
- AWS 계정 (프리티어 가능)
- AWS CLI v2 설치 및 구성
- Docker Desktop 설치
- 기본적인 컨테이너 개념 이해
- 실습 후 반드시 리소스 삭제 (Step 10 참고) - ALB, Fargate 비용 발생
🛠️ 실습 단계
Express Mode 아키텍처
ECS Express Mode는 단순히 '쉬운 배포'를 넘어, AWS의 컨테이너 운영 베스트 프랙티스를 자동으로 적용하는 지능적인 오케스트레이션 레이어입니다.
ExpressGatewayService
Express Mode의 핵심 리소스 타입입니다. 기존 ECS Service를 확장하여 ALB, 오토스케일링, 도메인 등을 통합 관리합니다.
- •단일 API 엔드포인트로 전체 스택 관리
- •내부적으로 여러 AWS 서비스 오케스트레이션
- •상태 추적 및 자동 복구 기능
ALB 공유 메커니즘
최대 25개의 Express Mode 서비스가 하나의 ALB를 공유합니다. Host-header 기반 리스너 규칙으로 서비스 간 격리를 유지합니다.
🏢 하나의 빌딩(ALB)에 여러 회사(서비스)가 입주하되, 각자의 사무실(리스너 규칙)은 분리된 것과 같습니다.
- •동일 VPC 내 서비스만 ALB 공유 가능
- •25개 초과 시 자동으로 새 ALB 프로비저닝
- •서비스 삭제 시 미사용 ALB 자동 정리
Canary 배포 전략
Express Mode는 기본적으로 Canary 배포를 사용합니다. 새 버전에 5% 트래픽을 먼저 보내고, 문제가 없으면 100%로 전환합니다.
- •새 환경 생성 → 5% 트래픽 전환
- •3분 Bake Time 동안 모니터링
- •문제 없으면 100% 트래픽 전환
- •추가 3분 Bake Time 후 이전 태스크 종료
알람 기반 자동 롤백
4xx/5xx 에러율이 임계값을 초과하면 자동으로 이전 버전으로 롤백합니다.
- •임계값: 3분 내 2개 데이터포인트에서 에러율 > 1%
- •CloudWatch 알람으로 실시간 모니터링
- •롤백 시 이전 태스크셋으로 트래픽 즉시 전환
사전 준비 사항
ECS Express Mode 실습을 위해 필요한 도구들을 설치하고 AWS 자격 증명을 구성합니다.
AWS CLI v2
AWS 서비스를 명령줄에서 제어하는 도구입니다. Express Mode의 create-express-gateway-service 명령을 사용합니다.
Docker
컨테이너 이미지를 빌드하고 로컬에서 테스트하기 위해 필요합니다.
IAM 권한
ECS, ECR, IAM, EC2, ELB, CloudWatch 등에 대한 권한이 필요합니다. AdministratorAccess 또는 적절한 권한 정책을 사용하세요.
실습 코드
# ============================================
# 1. AWS CLI 설치 확인
# ============================================
aws --version
# aws-cli/2.x.x 이상 필요
# AWS CLI 설치 (macOS)
brew install awscli
# AWS CLI 설치 (Linux)
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
# ============================================
# 2. AWS 자격 증명 설정
# ============================================
aws configure
# AWS Access Key ID: [YOUR_ACCESS_KEY]
# AWS Secret Access Key: [YOUR_SECRET_KEY]
# Default region name: ap-northeast-2
# Default output format: json
# 자격 증명 확인
aws sts get-caller-identity
# ============================================
# 3. Docker 설치 확인
# ============================================
docker --version
# Docker version 24.x.x 이상 권장
# Docker 데몬 실행 확인
docker info
# ============================================
# 4. 환경 변수 설정 (이후 단계에서 사용)
# ============================================
export AWS_REGION=ap-northeast-2
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
echo "Region: $AWS_REGION"
echo "Account ID: $AWS_ACCOUNT_ID"Flask 웹 애플리케이션 구현
실제 프로덕션 환경을 시뮬레이션하기 위해 헬스 체크, 메트릭, 환경 변수 등을 포함한 Flask 애플리케이션을 작성합니다.
Health Check 엔드포인트
ALB가 태스크의 상태를 확인하는 데 사용됩니다. /health 경로에서 200 OK를 반환해야 합니다.
- •Express Mode 기본 헬스 체크 경로: /
- •커스텀 경로 지정 가능 (예: /health)
- •응답 시간 초과 시 태스크 교체
멀티 스테이지 Docker 빌드
빌드 단계와 런타임 단계를 분리하여 최종 이미지 크기를 최소화합니다.
🏭 공장(빌드 스테이지)에서 제품을 만들고, 완성품만 매장(런타임 스테이지)에 진열하는 것과 같습니다.
Gunicorn WSGI 서버
프로덕션 환경에서 Flask 앱을 실행하기 위한 WSGI HTTP 서버입니다. 개발용 Flask 내장 서버 대신 사용합니다.
실습 코드
# ============================================
# 프로젝트 디렉토리 생성
# ============================================
mkdir -p ecs-express-workshop && cd ecs-express-workshop
# ============================================
# app.py - Flask 애플리케이션
# ============================================
cat > app.py << 'EOF'
from flask import Flask, jsonify, request
import os
import socket
import time
from datetime import datetime
app = Flask(__name__)
# 애플리케이션 시작 시간 기록
START_TIME = time.time()
@app.route('/')
def home():
"""메인 엔드포인트 - 애플리케이션 정보 반환"""
return jsonify({
"service": "ECS Express Mode Demo",
"message": "Hello from ECS Express Mode! 🚀",
"version": os.getenv("APP_VERSION", "1.0.0"),
"hostname": socket.gethostname(),
"timestamp": datetime.utcnow().isoformat(),
"environment": os.getenv("ENVIRONMENT", "development")
})
@app.route('/health')
def health():
"""헬스 체크 엔드포인트 - ALB가 주기적으로 호출"""
uptime = time.time() - START_TIME
return jsonify({
"status": "healthy",
"uptime_seconds": round(uptime, 2),
"version": os.getenv("APP_VERSION", "1.0.0")
})
@app.route('/info')
def info():
"""상세 정보 엔드포인트"""
return jsonify({
"app": {
"name": "ecs-express-demo",
"version": os.getenv("APP_VERSION", "1.0.0"),
"environment": os.getenv("ENVIRONMENT", "development")
},
"container": {
"hostname": socket.gethostname(),
"platform": os.uname().sysname
},
"request": {
"remote_addr": request.remote_addr,
"headers": dict(request.headers)
}
})
@app.route('/ready')
def ready():
"""Readiness 체크 - 애플리케이션이 트래픽을 받을 준비가 되었는지 확인"""
# 실제 환경에서는 DB 연결, 캐시 연결 등을 확인
return jsonify({"ready": True})
if __name__ == '__main__':
port = int(os.getenv("PORT", 80))
app.run(host='0.0.0.0', port=port, debug=False)
EOF
# ============================================
# requirements.txt - Python 의존성
# ============================================
cat > requirements.txt << 'EOF'
flask==3.0.0
gunicorn==21.2.0
EOF
# ============================================
# Dockerfile - 멀티 스테이지 빌드
# ============================================
cat > Dockerfile << 'EOF'
# ============================================
# Stage 1: Builder - 의존성 설치
# ============================================
FROM python:3.11-slim as builder
WORKDIR /app
# 의존성 파일 복사 및 설치
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt
# ============================================
# Stage 2: Runtime - 최종 이미지
# ============================================
FROM python:3.11-slim
# 보안: non-root 사용자 생성
RUN useradd --create-home --shell /bin/bash appuser
WORKDIR /app
# Builder에서 설치된 패키지 복사
COPY --from=builder /root/.local /home/appuser/.local
# 애플리케이션 코드 복사
COPY app.py .
# 소유권 변경
RUN chown -R appuser:appuser /app
# non-root 사용자로 전환
USER appuser
# PATH 설정
ENV PATH=/home/appuser/.local/bin:$PATH
# 환경 변수 설정
ENV APP_VERSION=1.0.0
ENV ENVIRONMENT=production
ENV PORT=80
# 포트 노출
EXPOSE 80
# Gunicorn으로 애플리케이션 실행
# workers: CPU 코어 수 * 2 + 1 권장 (Fargate 0.25 vCPU 기준 2)
CMD ["gunicorn", "--bind", "0.0.0.0:80", "--workers", "2", "--threads", "4", "--timeout", "120", "--access-logfile", "-", "--error-logfile", "-", "app:app"]
EOF
# ============================================
# 로컬 테스트
# ============================================
# 이미지 빌드
docker build -t ecs-express-demo:local .
# 로컬 실행
docker run -d -p 8080:80 --name ecs-test ecs-express-demo:local
# 테스트
curl http://localhost:8080/
curl http://localhost:8080/health
curl http://localhost:8080/info
# 정리
docker stop ecs-test && docker rm ecs-testAmazon ECR (Elastic Container Registry)
ECR은 AWS의 완전 관리형 Docker 컨테이너 레지스트리입니다. ECS Express Mode는 ECR의 이미지를 사용하여 태스크를 실행합니다.
ECR 리포지토리
Docker 이미지를 저장하는 프라이빗 저장소입니다. 이미지 스캔, 라이프사이클 정책 등을 지원합니다.
이미지 태그 전략
latest 태그 대신 버전 번호나 Git 커밋 해시를 사용하는 것이 좋습니다. 롤백과 추적이 용이합니다.
- •시맨틱 버저닝: v1.0.0, v1.0.1
- •Git 커밋 해시: abc1234
- •빌드 번호: build-123
이미지 스캔
ECR은 푸시 시 자동으로 이미지의 보안 취약점을 스캔할 수 있습니다.
실습 코드
# ============================================
# 환경 변수 확인
# ============================================
echo "Region: $AWS_REGION"
echo "Account ID: $AWS_ACCOUNT_ID"
# 변수가 없으면 설정
export AWS_REGION=${AWS_REGION:-ap-northeast-2}
export AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID:-$(aws sts get-caller-identity --query Account --output text)}
export REPO_NAME=ecs-express-demo
# ============================================
# ECR 리포지토리 생성
# ============================================
aws ecr create-repository \
--repository-name $REPO_NAME \
--image-scanning-configuration scanOnPush=true \
--encryption-configuration encryptionType=AES256 \
--region $AWS_REGION
# 리포지토리 URI 저장
export ECR_URI=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$REPO_NAME
echo "ECR URI: $ECR_URI"
# ============================================
# ECR 로그인
# ============================================
aws ecr get-login-password --region $AWS_REGION | \
docker login --username AWS --password-stdin \
$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com
# ============================================
# Docker 이미지 빌드 및 태그
# ============================================
# 프로덕션 이미지 빌드
docker build -t $REPO_NAME:v1 .
# ECR 태그 지정
docker tag $REPO_NAME:v1 $ECR_URI:v1
docker tag $REPO_NAME:v1 $ECR_URI:latest
# ============================================
# ECR에 푸시
# ============================================
docker push $ECR_URI:v1
docker push $ECR_URI:latest
# ============================================
# 푸시 확인
# ============================================
aws ecr describe-images \
--repository-name $REPO_NAME \
--region $AWS_REGION \
--query 'imageDetails[*].[imageTags,imagePushedAt,imageSizeInBytes]' \
--output table
# 이미지 스캔 결과 확인 (잠시 후)
aws ecr describe-image-scan-findings \
--repository-name $REPO_NAME \
--image-id imageTag=v1 \
--region $AWS_REGIONExpress Mode IAM 역할 상세
Express Mode는 두 가지 IAM 역할이 필요합니다. 각 역할의 목적과 권한을 이해하면 보안 모범 사례를 적용하는 데 도움이 됩니다.
Task Execution Role
ECS 에이전트가 태스크를 시작할 때 사용하는 역할입니다.
- •ECR에서 컨테이너 이미지 풀링
- •CloudWatch Logs에 로그 기록
- •Secrets Manager에서 시크릿 조회 (선택)
- •SSM Parameter Store에서 파라미터 조회 (선택)
Infrastructure Role
Express Mode가 인프라 리소스를 생성하고 관리할 때 사용하는 역할입니다.
- •Application Load Balancer 생성/수정/삭제
- •Target Group 관리
- •Security Group 생성/수정
- •Route 53 레코드 관리
- •Auto Scaling 정책 설정
최소 권한 원칙
AWS 관리형 정책을 사용하면 필요한 최소 권한만 부여됩니다. 커스텀 정책으로 더 제한할 수도 있습니다.
실습 코드
# ============================================
# Task Execution Role 생성
# ============================================
# 신뢰 정책 (Trust Policy) 생성
cat > task-execution-trust-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ecs-tasks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
# IAM 역할 생성
aws iam create-role \
--role-name ecsExpressTaskExecutionRole \
--assume-role-policy-document file://task-execution-trust-policy.json \
--description "ECS Express Mode Task Execution Role"
# AWS 관리형 정책 연결
aws iam attach-role-policy \
--role-name ecsExpressTaskExecutionRole \
--policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
# (선택) Secrets Manager 접근 권한 추가
cat > secrets-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": "arn:aws:secretsmanager:*:*:secret:ecs-express-*"
}
]
}
EOF
aws iam put-role-policy \
--role-name ecsExpressTaskExecutionRole \
--policy-name SecretsManagerAccess \
--policy-document file://secrets-policy.json
# ============================================
# Infrastructure Role 생성
# ============================================
# 신뢰 정책 생성
cat > infra-trust-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ecs.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
# IAM 역할 생성
aws iam create-role \
--role-name ecsExpressInfraRole \
--assume-role-policy-document file://infra-trust-policy.json \
--description "ECS Express Mode Infrastructure Role"
# AWS 관리형 정책 연결
aws iam attach-role-policy \
--role-name ecsExpressInfraRole \
--policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSInfrastructureRolePolicyForExpressGateway
# ============================================
# 역할 ARN 저장
# ============================================
export TASK_EXEC_ROLE_ARN=arn:aws:iam::$AWS_ACCOUNT_ID:role/ecsExpressTaskExecutionRole
export INFRA_ROLE_ARN=arn:aws:iam::$AWS_ACCOUNT_ID:role/ecsExpressInfraRole
echo "Task Execution Role: $TASK_EXEC_ROLE_ARN"
echo "Infrastructure Role: $INFRA_ROLE_ARN"
# 역할 확인
aws iam get-role --role-name ecsExpressTaskExecutionRole --query 'Role.Arn'
aws iam get-role --role-name ecsExpressInfraRole --query 'Role.Arn'Express Mode 배포 옵션
이제 모든 준비가 완료되었습니다. Express Mode는 다양한 배포 옵션을 제공합니다. Default VPC를 사용하는 가장 간단한 방법부터 기존 VPC를 활용하는 방법까지 알아봅니다.
create-express-gateway-service
Express Mode 서비스를 생성하는 AWS CLI 명령입니다. 최소 3개의 파라미터만 필요합니다.
Default VPC 배포
가장 간단한 방법입니다. 네트워크 설정 없이 이미지와 역할만 지정하면 됩니다.
커스텀 VPC 배포
기존 VPC, Subnet, Security Group을 지정할 수 있습니다. 엔터프라이즈 환경에서 권장됩니다.
- •Public Subnet → Internet-facing ALB
- •Private Subnet → Internal ALB (NAT Gateway 필요)
- •최소 2개 AZ의 Subnet 필요
리소스 설정 옵션
CPU, 메모리, 환경 변수, 포트 등을 커스터마이즈할 수 있습니다.
- •CPU: 0.25 ~ 16 vCPU
- •Memory: 0.5 ~ 120 GB
- •기본값: 0.25 vCPU, 0.5 GB
실습 코드
# ============================================
# 환경 변수 확인
# ============================================
echo "ECR URI: $ECR_URI"
echo "Task Execution Role: $TASK_EXEC_ROLE_ARN"
echo "Infrastructure Role: $INFRA_ROLE_ARN"
# ============================================
# 방법 1: Default VPC 사용 (가장 간단)
# ============================================
aws ecs create-express-gateway-service \
--service-name ecs-express-demo \
--image $ECR_URI:v1 \
--execution-role-arn $TASK_EXEC_ROLE_ARN \
--infrastructure-role-arn $INFRA_ROLE_ARN \
--region $AWS_REGION
# ============================================
# 방법 2: 리소스 커스터마이즈
# ============================================
aws ecs create-express-gateway-service \
--service-name ecs-express-demo \
--image $ECR_URI:v1 \
--execution-role-arn $TASK_EXEC_ROLE_ARN \
--infrastructure-role-arn $INFRA_ROLE_ARN \
--cpu 512 \
--memory 1024 \
--container-port 80 \
--health-check-path /health \
--environment-variables '[
{"name": "ENVIRONMENT", "value": "production"},
{"name": "LOG_LEVEL", "value": "INFO"}
]' \
--region $AWS_REGION
# ============================================
# 방법 3: 기존 VPC/Subnet 사용
# ============================================
# 먼저 VPC 정보 확인
aws ec2 describe-vpcs \
--query 'Vpcs[*].[VpcId,Tags[?Key==`Name`].Value|[0],CidrBlock]' \
--output table
# Subnet 확인 (VPC ID로 필터링)
VPC_ID=vpc-xxxxxxxx # 실제 VPC ID로 변경
aws ec2 describe-subnets \
--filters "Name=vpc-id,Values=$VPC_ID" \
--query 'Subnets[*].[SubnetId,AvailabilityZone,CidrBlock,MapPublicIpOnLaunch,Tags[?Key==`Name`].Value|[0]]' \
--output table
# Security Group 확인
aws ec2 describe-security-groups \
--filters "Name=vpc-id,Values=$VPC_ID" \
--query 'SecurityGroups[*].[GroupId,GroupName,Description]' \
--output table
# 기존 VPC로 배포 (Public Subnet)
aws ecs create-express-gateway-service \
--service-name ecs-express-demo \
--image $ECR_URI:v1 \
--execution-role-arn $TASK_EXEC_ROLE_ARN \
--infrastructure-role-arn $INFRA_ROLE_ARN \
--network-configuration '{
"awsvpcConfiguration": {
"subnets": ["subnet-aaaa1111", "subnet-bbbb2222"],
"securityGroups": ["sg-xxxxxxxx"],
"assignPublicIp": "ENABLED"
}
}' \
--region $AWS_REGION
# ============================================
# 방법 4: Private Subnet 사용 (Internal ALB)
# ============================================
# Private Subnet 사용 시 NAT Gateway가 있어야 ECR 이미지 풀 가능
aws ecs create-express-gateway-service \
--service-name ecs-express-internal \
--image $ECR_URI:v1 \
--execution-role-arn $TASK_EXEC_ROLE_ARN \
--infrastructure-role-arn $INFRA_ROLE_ARN \
--network-configuration '{
"awsvpcConfiguration": {
"subnets": ["subnet-private-1", "subnet-private-2"],
"securityGroups": ["sg-xxxxxxxx"],
"assignPublicIp": "DISABLED"
}
}' \
--region $AWS_REGION
# → Internal ALB 생성됨 (VPC 내부에서만 접근 가능)
# ============================================
# 배포 상태 확인
# ============================================
# 서비스 목록 확인
aws ecs list-services --cluster default --region $AWS_REGION
# 서비스 상세 정보
aws ecs describe-services \
--cluster default \
--services ecs-express-demo \
--region $AWS_REGION \
--query 'services[0].{
ServiceName: serviceName,
Status: status,
RunningCount: runningCount,
DesiredCount: desiredCount,
PendingCount: pendingCount
}'배포 검증
Express Mode가 생성한 리소스들을 확인하고 애플리케이션이 정상 동작하는지 테스트합니다. AWS 콘솔과 CLI 모두에서 확인할 수 있습니다.
Express Mode URL
AWS가 자동으로 제공하는 HTTPS 도메인입니다. *.express.ecs.aws 형식으로 제공됩니다.
- •SSL/TLS 인증서 자동 적용
- •별도의 도메인 설정 불필요
- •커스텀 도메인 연결도 가능 (Route 53)
헬스 체크 동작
ALB가 주기적으로 헬스 체크 경로를 호출하여 태스크 상태를 확인합니다.
- •기본 경로: / (커스터마이즈 가능)
- •기본 간격: 30초
- •Unhealthy 임계값: 2회 연속 실패
- •Healthy 임계값: 5회 연속 성공
생성된 리소스 확인
Express Mode가 생성한 모든 리소스는 AWS 콘솔에서 확인하고 수정할 수 있습니다.
실습 코드
# ============================================
# Express Mode URL 확인
# ============================================
# ECS 콘솔에서 확인
echo "ECS Console: https://$AWS_REGION.console.aws.amazon.com/ecs/v2/express"
# CLI로 서비스 정보에서 URL 확인
aws ecs describe-services \
--cluster default \
--services ecs-express-demo \
--region $AWS_REGION \
--query 'services[0].loadBalancers'
# ALB DNS 이름 확인
ALB_ARN=$(aws ecs describe-services \
--cluster default \
--services ecs-express-demo \
--region $AWS_REGION \
--query 'services[0].loadBalancers[0].loadBalancerArn' \
--output text)
aws elbv2 describe-load-balancers \
--load-balancer-arns $ALB_ARN \
--query 'LoadBalancers[0].DNSName' \
--output text
# ============================================
# 애플리케이션 테스트
# ============================================
# Express Mode URL로 테스트 (콘솔에서 확인한 URL 사용)
EXPRESS_URL="https://your-service.express.ecs.aws"
# 메인 엔드포인트
curl -s $EXPRESS_URL/ | jq .
# 헬스 체크
curl -s $EXPRESS_URL/health | jq .
# 상세 정보
curl -s $EXPRESS_URL/info | jq .
# 응답 시간 측정
curl -w "\nTotal time: %{time_total}s\n" -o /dev/null -s $EXPRESS_URL/
# ============================================
# 생성된 리소스 확인
# ============================================
# ECS 클러스터
aws ecs describe-clusters --clusters default --region $AWS_REGION
# 태스크 정의
aws ecs list-task-definitions \
--family-prefix ecs-express-demo \
--region $AWS_REGION
# 실행 중인 태스크
aws ecs list-tasks \
--cluster default \
--service-name ecs-express-demo \
--region $AWS_REGION
# Target Group 헬스 체크 상태
TG_ARN=$(aws ecs describe-services \
--cluster default \
--services ecs-express-demo \
--region $AWS_REGION \
--query 'services[0].loadBalancers[0].targetGroupArn' \
--output text)
aws elbv2 describe-target-health \
--target-group-arn $TG_ARN \
--query 'TargetHealthDescriptions[*].{Target:Target.Id,Health:TargetHealth.State}'
# ============================================
# CloudWatch 로그 확인
# ============================================
# 로그 그룹 확인
aws logs describe-log-groups \
--log-group-name-prefix /ecs/ecs-express-demo \
--region $AWS_REGION
# 최근 로그 조회
LOG_GROUP="/ecs/ecs-express-demo"
aws logs tail $LOG_GROUP --since 10m --region $AWS_REGIONCanary 배포와 자동 롤백
Express Mode는 기본적으로 Canary 배포 전략을 사용합니다. 새 버전에 소량의 트래픽을 먼저 보내고, 문제가 없으면 전체 트래픽을 전환합니다.
Canary 배포 흐름
Express Mode의 기본 배포 전략입니다.
- •1. 새 태스크셋 생성 및 태스크 시작
- •2. 헬스 체크 통과 확인
- •3. 5% 트래픽을 새 버전으로 전환
- •4. 3분 Bake Time (모니터링)
- •5. 100% 트래픽 전환
- •6. 3분 추가 Bake Time
- •7. 이전 태스크 종료
알람 기반 자동 롤백
배포 중 에러율이 임계값을 초과하면 자동으로 롤백됩니다.
- •모니터링 메트릭: 4xx + 5xx 에러율
- •임계값: 3분 내 2개 데이터포인트에서 > 1%
- •롤백 시 즉시 이전 버전으로 트래픽 전환
update-express-gateway-service
Express Mode 서비스를 업데이트하는 CLI 명령입니다.
실습 코드
# ============================================
# 새 버전 애플리케이션 작성
# ============================================
cat > app.py << 'EOF'
from flask import Flask, jsonify, request
import os
import socket
import time
from datetime import datetime
app = Flask(__name__)
START_TIME = time.time()
@app.route('/')
def home():
return jsonify({
"service": "ECS Express Mode Demo",
"message": "Hello from ECS Express Mode v2! 🎉",
"version": os.getenv("APP_VERSION", "2.0.0"),
"hostname": socket.gethostname(),
"timestamp": datetime.utcnow().isoformat(),
"environment": os.getenv("ENVIRONMENT", "development"),
"features": [
"Canary Deployment",
"Auto Rollback",
"ALB Sharing",
"Auto Scaling"
]
})
@app.route('/health')
def health():
uptime = time.time() - START_TIME
return jsonify({
"status": "healthy",
"uptime_seconds": round(uptime, 2),
"version": os.getenv("APP_VERSION", "2.0.0")
})
@app.route('/info')
def info():
return jsonify({
"app": {
"name": "ecs-express-demo",
"version": os.getenv("APP_VERSION", "2.0.0"),
"environment": os.getenv("ENVIRONMENT", "development")
},
"container": {
"hostname": socket.gethostname(),
"platform": os.uname().sysname
},
"deployment": {
"strategy": "canary",
"rollback": "alarm-based"
}
})
@app.route('/ready')
def ready():
return jsonify({"ready": True})
if __name__ == '__main__':
port = int(os.getenv("PORT", 80))
app.run(host='0.0.0.0', port=port, debug=False)
EOF
# Dockerfile 버전 업데이트
sed -i '' 's/APP_VERSION=1.0.0/APP_VERSION=2.0.0/' Dockerfile
# Linux의 경우: sed -i 's/APP_VERSION=1.0.0/APP_VERSION=2.0.0/' Dockerfile
# ============================================
# 새 이미지 빌드 및 푸시
# ============================================
docker build -t $REPO_NAME:v2 .
docker tag $REPO_NAME:v2 $ECR_URI:v2
docker push $ECR_URI:v2
# ============================================
# Express Mode 서비스 업데이트
# ============================================
# 서비스 ARN 확인
SERVICE_ARN=$(aws ecs list-services \
--cluster default \
--region $AWS_REGION \
--query 'serviceArns[?contains(@, `ecs-express-demo`)]|[0]' \
--output text)
echo "Service ARN: $SERVICE_ARN"
# 서비스 업데이트 (새 이미지로)
aws ecs update-express-gateway-service \
--service-arn $SERVICE_ARN \
--primary-container "{
\"image\": \"$ECR_URI:v2\"
}" \
--region $AWS_REGION
# ============================================
# 배포 진행 상황 모니터링
# ============================================
# 배포 상태 확인 (반복 실행)
watch -n 5 "aws ecs describe-services \
--cluster default \
--services ecs-express-demo \
--region $AWS_REGION \
--query 'services[0].deployments[*].{
Status:status,
TaskDef:taskDefinition,
Running:runningCount,
Desired:desiredCount,
Pending:pendingCount,
Rollout:rolloutState
}'"
# 또는 단일 실행
aws ecs describe-services \
--cluster default \
--services ecs-express-demo \
--region $AWS_REGION \
--query 'services[0].deployments'
# ============================================
# 배포 완료 후 확인
# ============================================
curl -s $EXPRESS_URL/ | jq .version
# "2.0.0" 출력되어야 함오토 스케일링 상세
Express Mode는 CPU 사용률 기반 Target Tracking 스케일링을 기본 적용합니다. 트래픽 패턴에 따라 태스크 수가 자동으로 조절됩니다.
Target Tracking Scaling
목표 메트릭 값을 유지하도록 태스크 수를 자동 조절합니다.
- •기본 메트릭: CPU 사용률
- •기본 목표값: 70%
- •스케일 아웃: 목표값 초과 시 태스크 추가
- •스케일 인: 목표값 미만 시 태스크 감소
스케일링 범위
최소/최대 태스크 수를 설정하여 비용과 가용성을 제어합니다.
- •기본 최소: 1개
- •기본 최대: 10개
- •프로덕션 권장: 최소 2개 이상 (고가용성)
쿨다운 기간
스케일링 후 다음 스케일링까지 대기하는 시간입니다.
- •스케일 아웃 쿨다운: 300초 (기본)
- •스케일 인 쿨다운: 300초 (기본)
다중 스케일링 정책
CPU 외에 메모리, 요청 수 등 추가 메트릭으로 스케일링할 수 있습니다.
실습 코드
# ============================================
# 현재 스케일링 설정 확인
# ============================================
# Scalable Target 확인
aws application-autoscaling describe-scalable-targets \
--service-namespace ecs \
--region $AWS_REGION \
--query 'ScalableTargets[?contains(ResourceId, `ecs-express-demo`)]'
# 스케일링 정책 확인
aws application-autoscaling describe-scaling-policies \
--service-namespace ecs \
--region $AWS_REGION \
--query 'ScalingPolicies[?contains(ResourceId, `ecs-express-demo`)]'
# ============================================
# 스케일링 범위 수정 (최소/최대 태스크)
# ============================================
# 프로덕션 환경: 최소 2개로 설정 (고가용성)
aws application-autoscaling register-scalable-target \
--service-namespace ecs \
--resource-id service/default/ecs-express-demo \
--scalable-dimension ecs:service:DesiredCount \
--min-capacity 2 \
--max-capacity 20 \
--region $AWS_REGION
# ============================================
# 추가 스케일링 정책 (요청 수 기반)
# ============================================
cat > request-scaling-policy.json << 'EOF'
{
"TargetValue": 1000,
"PredefinedMetricSpecification": {
"PredefinedMetricType": "ALBRequestCountPerTarget",
"ResourceLabel": "app/ecs-express-alb/1234567890/targetgroup/ecs-express-tg/0987654321"
},
"ScaleOutCooldown": 60,
"ScaleInCooldown": 300
}
EOF
# 정책 적용 (ResourceLabel은 실제 값으로 변경 필요)
# aws application-autoscaling put-scaling-policy \
# --service-namespace ecs \
# --resource-id service/default/ecs-express-demo \
# --scalable-dimension ecs:service:DesiredCount \
# --policy-name request-count-scaling \
# --policy-type TargetTrackingScaling \
# --target-tracking-scaling-policy-configuration file://request-scaling-policy.json \
# --region $AWS_REGION
# ============================================
# 부하 테스트 (선택사항)
# ============================================
# hey 설치 (macOS)
brew install hey
# 부하 테스트 실행
hey -n 10000 -c 100 -q 50 $EXPRESS_URL/
# 또는 Apache Bench 사용
ab -n 10000 -c 100 $EXPRESS_URL/
# ============================================
# 스케일링 동작 모니터링
# ============================================
# 태스크 수 변화 모니터링
watch -n 10 "aws ecs describe-services \
--cluster default \
--services ecs-express-demo \
--region $AWS_REGION \
--query 'services[0].{Running:runningCount,Desired:desiredCount,Pending:pendingCount}'"
# 스케일링 활동 확인
aws application-autoscaling describe-scaling-activities \
--service-namespace ecs \
--resource-id service/default/ecs-express-demo \
--region $AWS_REGION \
--query 'ScalingActivities[*].{Time:StartTime,Status:StatusCode,Cause:Cause}'모니터링 베스트 프랙티스
Express Mode는 CloudWatch와 자동으로 통합됩니다. 효과적인 모니터링을 위한 대시보드와 알람 설정 방법을 알아봅니다.
Container Insights
ECS 클러스터, 서비스, 태스크 수준의 상세 메트릭을 제공합니다.
- •CPU/메모리 사용률
- •네트워크 I/O
- •스토리지 사용량
- •컨테이너 수준 메트릭
ALB 메트릭
로드 밸런서 수준의 트래픽 및 성능 메트릭입니다.
- •RequestCount: 요청 수
- •TargetResponseTime: 응답 시간
- •HTTPCode_Target_2XX_Count: 성공 응답
- •HTTPCode_Target_4XX_Count: 클라이언트 에러
- •HTTPCode_Target_5XX_Count: 서버 에러
로그 보존 정책
Express Mode가 생성한 로그 그룹은 기본적으로 만료되지 않습니다. 비용 관리를 위해 보존 기간을 설정하세요.
실습 코드
# ============================================
# Container Insights 활성화
# ============================================
aws ecs update-cluster-settings \
--cluster default \
--settings name=containerInsights,value=enabled \
--region $AWS_REGION
# ============================================
# CloudWatch 로그 설정
# ============================================
# 로그 그룹 확인
aws logs describe-log-groups \
--log-group-name-prefix /ecs/ecs-express-demo \
--region $AWS_REGION
# 로그 보존 기간 설정 (30일)
aws logs put-retention-policy \
--log-group-name /ecs/ecs-express-demo \
--retention-in-days 30 \
--region $AWS_REGION
# 최근 로그 조회
aws logs tail /ecs/ecs-express-demo \
--since 1h \
--follow \
--region $AWS_REGION
# 에러 로그 필터링
aws logs filter-log-events \
--log-group-name /ecs/ecs-express-demo \
--filter-pattern "ERROR" \
--start-time $(date -d '1 hour ago' +%s)000 \
--region $AWS_REGION
# ============================================
# CloudWatch 알람 생성
# ============================================
# 5xx 에러율 알람
aws cloudwatch put-metric-alarm \
--alarm-name "ECS-Express-Demo-5xx-Errors" \
--alarm-description "Alert when 5xx error rate exceeds 1%" \
--metric-name HTTPCode_Target_5XX_Count \
--namespace AWS/ApplicationELB \
--statistic Sum \
--period 60 \
--threshold 10 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 2 \
--dimensions Name=LoadBalancer,Value=app/ecs-express-alb/1234567890 \
--region $AWS_REGION
# CPU 사용률 알람
aws cloudwatch put-metric-alarm \
--alarm-name "ECS-Express-Demo-High-CPU" \
--alarm-description "Alert when CPU exceeds 80%" \
--metric-name CPUUtilization \
--namespace AWS/ECS \
--statistic Average \
--period 300 \
--threshold 80 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 2 \
--dimensions Name=ClusterName,Value=default Name=ServiceName,Value=ecs-express-demo \
--region $AWS_REGION
# ============================================
# CloudWatch 대시보드 생성
# ============================================
cat > dashboard.json << 'EOF'
{
"widgets": [
{
"type": "metric",
"properties": {
"title": "ECS Service Metrics",
"metrics": [
["AWS/ECS", "CPUUtilization", "ClusterName", "default", "ServiceName", "ecs-express-demo"],
[".", "MemoryUtilization", ".", ".", ".", "."]
],
"period": 60,
"stat": "Average"
}
},
{
"type": "metric",
"properties": {
"title": "ALB Request Count",
"metrics": [
["AWS/ApplicationELB", "RequestCount", "LoadBalancer", "app/ecs-express-alb/xxx"]
],
"period": 60,
"stat": "Sum"
}
}
]
}
EOF
aws cloudwatch put-dashboard \
--dashboard-name ECS-Express-Demo \
--dashboard-body file://dashboard.json \
--region $AWS_REGION리소스 정리
Express Mode로 생성된 리소스들을 순서대로 삭제합니다. 의존성이 있는 리소스는 올바른 순서로 삭제해야 합니다.
삭제 순서
의존성을 고려한 삭제 순서입니다.
- •1. ECS Express 서비스 삭제
- •2. CloudWatch 알람 삭제
- •3. CloudWatch 로그 그룹 삭제
- •4. ECR 이미지 및 리포지토리 삭제
- •5. IAM 역할 삭제
자동 정리되는 리소스
Express Mode 서비스 삭제 시 자동으로 정리되는 리소스들입니다.
- •ECS 서비스 및 태스크
- •Target Group
- •ALB (다른 서비스가 사용하지 않는 경우)
- •Security Group (Express Mode가 생성한 경우)
실습 코드
# ============================================
# 1. ECS Express 서비스 삭제
# ============================================
SERVICE_ARN=$(aws ecs list-services \
--cluster default \
--region $AWS_REGION \
--query 'serviceArns[?contains(@, `ecs-express-demo`)]|[0]' \
--output text)
aws ecs delete-service \
--cluster default \
--service $SERVICE_ARN \
--force \
--region $AWS_REGION
# 서비스 삭제 완료 대기
aws ecs wait services-inactive \
--cluster default \
--services ecs-express-demo \
--region $AWS_REGION
# ============================================
# 2. CloudWatch 알람 삭제
# ============================================
aws cloudwatch delete-alarms \
--alarm-names "ECS-Express-Demo-5xx-Errors" "ECS-Express-Demo-High-CPU" \
--region $AWS_REGION
# ============================================
# 3. CloudWatch 로그 그룹 삭제
# ============================================
aws logs delete-log-group \
--log-group-name /ecs/ecs-express-demo \
--region $AWS_REGION
# ============================================
# 4. ECR 이미지 및 리포지토리 삭제
# ============================================
# 모든 이미지 삭제
aws ecr batch-delete-image \
--repository-name ecs-express-demo \
--image-ids imageTag=v1 imageTag=v2 imageTag=latest \
--region $AWS_REGION
# 리포지토리 삭제
aws ecr delete-repository \
--repository-name ecs-express-demo \
--force \
--region $AWS_REGION
# ============================================
# 5. IAM 역할 삭제
# ============================================
# Task Execution Role
aws iam detach-role-policy \
--role-name ecsExpressTaskExecutionRole \
--policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
aws iam delete-role-policy \
--role-name ecsExpressTaskExecutionRole \
--policy-name SecretsManagerAccess 2>/dev/null || true
aws iam delete-role --role-name ecsExpressTaskExecutionRole
# Infrastructure Role
aws iam detach-role-policy \
--role-name ecsExpressInfraRole \
--policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSInfrastructureRolePolicyForExpressGateway
aws iam delete-role --role-name ecsExpressInfraRole
# ============================================
# 6. 로컬 파일 정리
# ============================================
cd ..
rm -rf ecs-express-workshop
# ============================================
# 정리 확인
# ============================================
echo "✅ 모든 리소스가 삭제되었습니다!"
echo ""
echo "확인 사항:"
echo "- ECS 서비스: 삭제됨"
echo "- ECR 리포지토리: 삭제됨"
echo "- IAM 역할: 삭제됨"
echo "- CloudWatch 로그: 삭제됨"✨ 프로덕션 환경을 위한 베스트 프랙티스
Secrets Manager 사용
데이터베이스 비밀번호, API 키 등 민감한 정보는 환경 변수 대신 Secrets Manager에 저장하세요.
# Task Definition에서 Secrets Manager 참조
"secrets": [
{
"name": "DB_PASSWORD",
"valueFrom": "arn:aws:secretsmanager:region:account:secret:db-password"
}
]최소 권한 원칙
Task Role에는 애플리케이션이 필요로 하는 최소한의 권한만 부여하세요.
Private Subnet 사용
내부 서비스는 Private Subnet에 배포하고 NAT Gateway를 통해 외부 통신하세요.
Security Group 제한
Express Mode가 생성한 Security Group의 아웃바운드 규칙을 필요한 대상으로만 제한하세요.
VPC Flow Logs 활성화
네트워크 트래픽 분석과 보안 감사를 위해 VPC Flow Logs를 활성화하세요.
최소 태스크 수 2개 이상
프로덕션 환경에서는 최소 2개 이상의 태스크를 유지하여 단일 장애점을 제거하세요.
3개 AZ 배포
가용성을 높이기 위해 3개 이상의 가용 영역에 태스크를 분산 배포하세요.
헬스 체크 최적화
애플리케이션 특성에 맞게 헬스 체크 경로, 간격, 타임아웃을 조정하세요.
# Target Group 헬스 체크 설정
aws elbv2 modify-target-group \
--target-group-arn $TG_ARN \
--health-check-path /health \
--health-check-interval-seconds 15 \
--health-check-timeout-seconds 5 \
--healthy-threshold-count 2 \
--unhealthy-threshold-count 3Graceful Shutdown 구현
SIGTERM 시그널을 처리하여 진행 중인 요청을 완료한 후 종료하도록 구현하세요.
적절한 리소스 할당
CPU와 메모리를 애플리케이션 요구사항에 맞게 설정하세요. 너무 작으면 성능 저하, 너무 크면 비용 낭비입니다.
다중 스케일링 메트릭
CPU 외에 요청 수, 메모리 등 여러 메트릭을 조합하여 스케일링하세요.
Connection Draining
태스크 종료 시 기존 연결이 완료될 때까지 대기하도록 deregistration delay를 설정하세요.
Keep-Alive 설정
ALB와 컨테이너 간 Keep-Alive 타임아웃을 적절히 설정하여 연결 재사용을 최적화하세요.
로그 보존 정책 설정
CloudWatch 로그 그룹에 보존 기간을 설정하여 비용을 관리하세요.
Container Insights 활성화
상세한 컨테이너 메트릭을 수집하여 성능 분석과 문제 해결에 활용하세요.
알람 설정
에러율, CPU 사용률, 응답 시간 등에 대한 알람을 설정하여 문제를 조기에 감지하세요.
태그 전략
모든 리소스에 일관된 태그를 적용하여 비용 추적과 리소스 관리를 용이하게 하세요.
Bake Time 조정
애플리케이션 안정화에 필요한 시간에 맞게 Canary bake time을 조정하세요.
롤백 알람 커스터마이즈
기본 4xx/5xx 알람 외에 비즈니스 메트릭 기반 롤백 알람을 추가하세요.
이미지 태그 전략
latest 대신 버전 번호나 Git 커밋 해시를 사용하여 추적성을 확보하세요.
IaC 사용
CloudFormation, CDK, Terraform을 사용하여 인프라를 코드로 관리하세요.
🎯 Express Mode 적합한 사용 사례
웹 애플리케이션 및 API
HTTP/HTTPS 요청을 처리하는 스테이트리스 애플리케이션
빠른 프로토타이핑
아이디어를 빠르게 검증하고 데모를 구축해야 할 때
개발자 생산성 향상
인프라 지식 없이 애플리케이션 팀이 독립적으로 배포해야 할 때
마이크로서비스
여러 개의 독립적인 서비스를 효율적으로 운영해야 할 때
복잡한 네트워킹 요구사항
Service Mesh, 복잡한 라우팅 규칙이 필요한 경우
→ 기존 ECS + App Mesh 사용
멀티 컨테이너 태스크
사이드카 패턴 등 여러 컨테이너가 필요한 경우
→ 기존 ECS Task Definition 사용
비 HTTP 워크로드
gRPC, WebSocket, TCP 기반 서비스
→ 기존 ECS + NLB 사용
GPU 워크로드
ML 추론 등 GPU가 필요한 경우
→ 기존 ECS + EC2 GPU 인스턴스
핵심 요약
- ECS Express Mode는 컨테이너 배포의 복잡성을 획기적으로 줄여줍니다
- 3가지만 준비하면 됩니다: 컨테이너 이미지, Task Execution Role, Infrastructure Role
- AWS 베스트 프랙티스가 기본 적용됩니다: Canary 배포, 자동 롤백, 오토 스케일링
- 최대 25개 서비스가 ALB를 공유하여 비용을 절감합니다
- 생성된 모든 리소스에 대한 완전한 제어권을 유지합니다
- 기존 VPC, Subnet, Security Group을 사용할 수 있습니다
- 추가 비용 없이 사용할 수 있습니다 (AWS 리소스 비용만 지불)
다음 단계
커스텀 도메인 연결
Route 53을 사용하여 자체 도메인을 Express Mode 서비스에 연결하세요
CI/CD 파이프라인 구축
CodePipeline, GitHub Actions 등을 사용하여 자동 배포 파이프라인을 구축하세요
IaC로 관리
CloudFormation, CDK, Terraform을 사용하여 인프라를 코드로 관리하세요