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_name | Yes | – | ECS 클러스터 이름 |
service_name | Yes | – | ECS 서비스 이름 |
maintain_service_state | No | true | 일시적으로 용량을 1만큼 증가시킴 |
wait_time | No | 30 | 작업 교체 사이에 대기할 초 |
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 콘솔
- Lambda → Functions → ecs-task-recycle-function 로 이동
- Test 탭을 열고 → Create test event
- 이벤트 JSON을 추가하고 Test를 클릭
작동 방식
프로세스 흐름
- 현재 상태 가져오기 – 서비스 구성 및 실행 중인 작업을 검색
- 용량 증가 (
maintain_service_state=true인 경우) – 원하는 수에 +1을 추가 - 안정성 대기 – 새 작업이 실행 중인지 확인
- 작업 재활용 – 각 기존 작업에 대해:
- 작업 중지
- 대체 작업이 시작될 때까지 대기
- 서비스 안정성 대기
- 설정된
wait_time만큼 대기
- 용량 복원 – 원래 원하는 수로 되돌림
- 알림 전송 – 이메일 보고서 (구성된 경우)
예시 시나리오
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: YRecycling task N/M: {task_arn}Task N recycled, waiting XsTask 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 초).
- 대기자가 성공하려면 안정적인 서비스가 필요합니다.
- 실패 시 자동 롤백 메커니즘이 없습니다.
기여
- 변경 사항을 철저히 테스트하세요.
- 문서를 업데이트하세요.
- 기존 코드 스타일을 따르세요.
- 적절한 오류 처리를 추가하세요.