AWS ECS 서비스 태스크 재활용

발행: (2026년 1월 2일 오후 05:13 GMT+9)
8 min read
원문: Dev.to

Source: Dev.to

개요

이 솔루션은 ECS 서비스에 대한 제어된 태스크 재활용을 제공한다:

  • 태스크를 한 번에 하나씩 중지하고 병렬 교체 대신
  • 각 태스크 교체 사이에 서비스 안정성을 기다림
  • 일시적으로 용량을 늘려 서비스 상태를 유지하도록 옵션 제공
  • 태스크 교체 사이의 대기 시간을 구성 가능

Features

  • Sequential Task Recycling – 순차적 작업 재활용 – 작업을 하나씩 중지하고 교체합니다
  • Service Stability – 서비스 안정성 – 각 작업 교체 후 안정된 상태가 될 때까지 대기합니다
  • Capacity Management – 용량 관리 – 가용성을 유지하기 위한 선택적 임시 용량 증가
  • Autoscaling Support – 자동 스케일링 지원 – Application Auto Scaling이 적용된 서비스를 처리합니다
  • Flexible Authentication – 유연한 인증 – AWSSession 모듈을 통한 다양한 AWS 자격 증명 방법
  • Email Notifications – 이메일 알림 – 완료 시 선택적 SMTP 알림
  • CloudFormation Deployment – CloudFormation 배포 – 자동화된 배포와 인프라를 코드로 관리
  • Zero Retries – 재시도 없음 – EventInvokeConfig가 재시도 시도 0으로 설정됨
  • Comprehensive Logging – 포괄적 로깅 – 모니터링을 위한 상세 CloudWatch 로그

아키텍처

Lambda Function (Python 3.13)
├── Event-driven execution
├── AWSSession.py (AWS authentication)
├── Notification.py (Email notifications)
└── input.json (Configuration)

사전 요구 사항

  • Python 3.13+
  • AWS CLI 구성됨
  • ECS 및 Application Auto Scaling에 대한 IAM 권한
  • SMTP 서버 (선택 사항, 알림용)

설치

1. 저장소 복제

cd aws-ecs-service-task-recycle

2. 설정 구성

input.json을(를) 구성으로 편집하십시오:

{
  "awsCredentials": {
    "region_name": "us-east-1"
  },
  "smtpCredentials": {
    "host": "smtp.example.com",
    "port": "587",
    "username": "user@example.com",
    "password": "password",
    "from_email": "noreply@example.com"
  },
  "emailNotification": {
    "email_subject": "ECS Service Task Recycle Completed",
    "subject_prefix": "AWS ECS",
    "to": ["admin@example.com"]
  }
}

3. CloudFormation 스택 배포

chmod +x cloudformation_deploy.sh lambda_build.sh
./cloudformation_deploy.sh

사용법

Lambda 이벤트 매개변수

{
  "cluster_name": "my-ecs-cluster",
  "service_name": "my-service",
  "maintain_service_state": true,
  "wait_time": 30
}

매개변수

매개변수필수기본값설명
cluster_nameYesECS 클러스터 이름
service_nameYesECS 서비스 이름
maintain_service_stateNotrue일시적으로 용량을 1만큼 증가시킴
wait_timeNo30작업 교체 사이에 대기할 초

Lambda 함수 호출

AWS CLI

aws lambda invoke \
  --function-name ecs-task-recycle-function \
  --payload '{"cluster_name":"my-cluster","service_name":"my-service","maintain_service_state":true,"wait_time":30}' \
  response.json

AWS 콘솔

  1. Lambda → Functions → ecs-task-recycle-function 로 이동
  2. Test 탭을 열고 → Create test event
  3. 이벤트 JSON을 추가하고 Test를 클릭

작동 방식

프로세스 흐름

  1. 현재 상태 가져오기 – 서비스 구성 및 실행 중인 작업을 검색
  2. 용량 증가 (maintain_service_state=true인 경우) – 원하는 수에 +1을 추가
  3. 안정성 대기 – 새 작업이 실행 중인지 확인
  4. 작업 재활용 – 각 기존 작업에 대해:
    • 작업 중지
    • 대체 작업이 시작될 때까지 대기
    • 서비스 안정성 대기
    • 설정된 wait_time만큼 대기
  5. 용량 복원 – 원래 원하는 수로 되돌림
  6. 알림 전송 – 이메일 보고서 (구성된 경우)

예시 시나리오

3개의 작업을 가진 서비스

Initial State: 3 tasks running

Increase to 4 tasks (maintain availability)

Stop task 1 → Wait stable → Sleep 30s

Stop task 2 → Wait stable → Sleep 30s

Stop task 3 → Wait stable → Sleep 30s

Restore to 3 tasks

Complete

구성

AWS 자격 증명 (input.json)

여러 인증 방법을 지원합니다:

{
  "awsCredentials": {
    "region_name": "us-east-1",
    "profile_name": "my-profile",
    "role_arn": "arn:aws:iam::123456789012:role/MyRole",
    "access_key": "AKIAIOSFODNN7EXAMPLE",
    "secret_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
    "session_token": "token"
  }
}

SMTP 구성 (선택 사항)

{
  "smtpCredentials": {
    "host": "smtp.gmail.com",
    "port": "587",
    "username": "user@gmail.com",
    "password": "app-password",
    "from_email": "noreply@example.com"
  }
}

IAM 권한

필요한 권한 (CloudFormation 템플릿에 포함됨):

{
  "Effect": "Allow",
  "Action": [
    "ecs:DescribeServices",
    "ecs:UpdateService",
    "ecs:ListTasks",
    "ecs:StopTask",
    "ecs:DescribeTasks",
    "application-autoscaling:DescribeScalableTargets",
    "application-autoscaling:RegisterScalableTarget"
  ],
  "Resource": "*"
}

CloudFormation 리소스

  • Lambda Function: Python 3.13 런타임, 900 초 타임아웃, 256 MB 메모리
  • IAM Role: ECS 및 Auto Scaling 권한이 포함된 실행 역할
  • EventInvokeConfig: MaximumRetryAttempts를 0으로 설정
  • CloudWatch Logs: 7일 보관

모니터링

CloudWatch 로그

aws logs tail /aws/lambda/ecs-task-recycle-function --follow

주요 로그 메시지

  • Starting task recycle for {cluster}/{service}
  • Original desired count: X, tasks: Y
  • Recycling task N/M: {task_arn}
  • Task N recycled, waiting Xs
  • Task recycle completed successfully

문제 해결

서비스가 안정화되지 않음

  • 코드에서 대기자 MaxAttempts를 늘립니다 (기본값: 40)
  • ECS 서비스 상태와 작업 정의를 확인합니다
  • 대상 그룹( target‑group) 헬스 체크를 검증합니다

타임아웃 오류

  • Lambda 타임아웃을 늘립니다 (기본값: 900 초)
  • 작업 수를 줄이거나 wait_time을 증가시킵니다

인증 실패

  • IAM 역할 권한을 확인합니다
  • input.json에 있는 AWS 자격 증명을 점검합니다
  • Lambda 실행 역할이 올바른지 확인합니다

모범 사례

  • 비생산 환경에서 테스트 – 비핵심 서비스부터 항상 테스트하세요.
  • CloudWatch 모니터링 – 첫 실행 시 로그를 확인하세요.
  • 대기 시간 조정 – 애플리케이션 시작 시간을 기준으로 조정하세요.
  • 상태 유지 사용 – 프로덕션 서비스에 활성화하세요.
  • 스케줄을 현명하게 – 트래픽이 적은 시간에 실행하세요.

강제 배포와 비교

기능강제 배포작업 재활용
작업 교체병렬순차적
서비스 중단높음낮음
완료 시간빠름느림
제어제한됨구성 가능
작업 간 대기없음있음

Security Considerations

  • Lambda 실행 역할은 최소 권한 원칙을 따릅니다.
  • 코드에 하드코딩된 자격 증명이 없습니다.
  • SMTP 자격 증명은 input.json에 저장됩니다(프로덕션에서는 Secrets Manager 사용).
  • CloudWatch 로그는 감사 추적을 제공합니다.
  • EventInvokeConfig는 재시도 폭풍을 방지합니다.

비용 최적화

  • Lambda 실행 시간 ≈ (작업 수 × 대기 시간) 초.
  • CloudWatch 로그: 7일 보관 (추가 저장 비용 없음).
  • 추가 AWS 서비스 요금 없음.
  • 비피크 시간대에 스케줄링하여 간접 비용을 줄이는 것을 고려하세요.

제한 사항

  • 최대 Lambda 실행 시간: 15 분.
  • < 20 작업을 가진 서비스에 적합 (대기 시간 30 초).
  • 대기자가 성공하려면 안정적인 서비스가 필요합니다.
  • 실패 시 자동 롤백 메커니즘이 없습니다.

기여

  1. 변경 사항을 철저히 테스트하세요.
  2. 문서를 업데이트하세요.
  3. 기존 코드 스타일을 따르세요.
  4. 적절한 오류 처리를 추가하세요.
Back to Blog

관련 글

더 보기 »

Krak App 추천 코드 (@GET10) 즉시 $10 적립

Krak App Referral Guide 디지털 금융 앱은 사람들이 돈을 보내고, 받고, 관리하는 방식을 변화시키고 있습니다. 가장 새롭고 가장 빠르게 성장하는 플랫폼 중 하나인 i...