- 최신
- 최다 투표
- 가장 많은 댓글
ECS on EC2에서 Task가 대기 상태일 때 해결 방법과 두 개의 도커 이미지를 하나의 태스크로 올리는 것에 대해 설명드리겠습니다.
Task가 계속 대기 중이고 실행되지 않는 이슈의 원인을 확인하기 위해서는 다음과 같은 방법들을 사용할 수 있습니다:
-
Amazon ECS 콘솔에서 서비스 이벤트 로그를 확인합니다. 이를 통해 서비스 관련 오류 메시지를 볼 수 있습니다.
-
컨테이너 인스턴스에서 Amazon ECS 컨테이너 에이전트 로그를 확인합니다. 이 로그는 태스크 실행과 관련된 자세한 정보를 제공합니다.
-
Docker 데몬 로그를 확인하여 컨테이너 시작 관련 문제를 파악할 수 있습니다.
-
태스크 정의에서 지정한 메모리와 CPU 리소스가 컨테이너 인스턴스의 가용 리소스를 초과하지 않는지 확인합니다.
-
CannotPullContainer 오류가 있는지 확인하고, 이 경우 이미지 풀 권한과 이미지 URL을 점검합니다.
-
IAM 역할 요청을 확인하여 태스크에 필요한 권한이 올바르게 설정되어 있는지 확인합니다.
두 개의 컨테이너를 하나의 태스크로 정의하는 방법은 다음과 같습니다:
-
태스크 정의에서 두 개의 컨테이너 정의를 추가합니다. 각 컨테이너에 대해 이미지 URI, 필요한 리소스(CPU, 메모리), 포트 매핑 등을 지정합니다.
-
컨테이너 간 통신이 필요한 경우, 링크를 사용하거나 네트워크 모드를 'awsvpc'로 설정하여 동일한 네트워크 네임스페이스를 공유하도록 할 수 있습니다.
-
환경 변수나 볼륨을 통해 컨테이너 간 데이터를 공유할 수 있습니다.
-
태스크 정의를 저장하고 이를 사용하여 서비스를 생성하거나 태스크를 실행합니다.
리소스 할당 문제인 경우, 태스크 정의에서 각 컨테이너에 할당된 CPU와 메모리를 조정하거나, 더 큰 인스턴스 유형을 사용하여 클러스터의 리소스를 늘릴 수 있습니다. 또한, ECS 콘솔에서 서비스 이벤트와 태스크 상태를 주기적으로 확인하여 문제의 원인을 파악하고 해결할 수 있습니다.
Sources
Amazon ECS troubleshooting - Amazon Elastic Container Service
Amazon ECS task metadata v4 examples - Amazon Elastic Container Service
안녕하세요, 해당 내용에 대해서 답변 드리겠습니다. ECS Task가 pending status에 빠질 경우 여러가지 원인이 있을 수 있습니다. 컨테이너 인스턴스가 최대 CPU를 초과 했는지 AWS CloudWatch 메트릭을 통해서 확인해 보세요!
ECS Task Pending Status 트러블슈팅
주요 발생 원인
- Docker 데몬 무응답
- 대용량 Docker 이미지
- ECS 컨테이너 에이전트 연결 끊김
- 기존 태스크 종료 지연
- VPC 라우팅 설정 오류
- 컨테이너 의존성 문제
1. 상세 원인 및 해결방안
1.1 컨테이너 자원 설정 문제
문제:
- Task Definition의 CPU/메모리 할당이 인스턴스 가용 자원 초과
진단:
aws ecs describe-tasks --cluster <CLUSTER_NAME> --tasks <TASK_ID>
해결방안:
- Task Definition 자원 할당량 조정
- 클러스터 인스턴스 스케일업/아웃
1.2 인스턴스 자원 부족
문제의 인스턴스에서 해당 명령을 실행합니다.
진단:
free -m # 메모리 확인 top # CPU 확인
해결방안:
- 인스턴스 타입 업그레이드
- 추가 인스턴스 프로비저닝
1.3 Docker 이미지 크기
진단:
/etc/ecs/ecs.config
설정 확인
ECS_IMAGE_PULL_BEHAVIOR=prefetch-cached
해결방안:
- 이미지 최적화
- 레이어 정리
- 이미지 캐싱 설정
1.4 ECS 에이전트 연결
진단:
# Amazon Linux 2 sudo systemctl status ecs # Docker 컨테이너 확인 sudo docker ps -f name=ecs-agent
재시작:
sudo systemctl restart ecs
1.5 VPC 라우팅
확인사항:
- 인터넷/NAT 게이트웨이 구성
- AWS PrivateLink 설정
- 라우팅 테이블 구성
1.6 컨테이너 의존성
해결방안:
- 컨테이너 HEALTHY 상태 확인
- 의존성 명확한 정의
- essential 속성 적절한 설정
2. 멀티 컨테이너 Task 예시
Task Definition 예시:
{ "family": "my-task-definition", "containerDefinitions": [ { "name": "frontend", "image": "<account_id>.dkr.ecr.<region>.amazonaws.com/frontend:latest", "memory": 256, "cpu": 128, "essential": true, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ] }, { "name": "backend", "image": "<account_id>.dkr.ecr.<region>.amazonaws.com/backend:latest", "memory": 512, "cpu": 256, "essential": true, "portMappings": [ { "containerPort": 8080, "hostPort": 8080 } ] } ], "requiresCompatibilities": ["EC2"], "networkMode": "bridge", "cpu": "512", "memory": "1024" }
Task 배포:
# Task Definition 등록 aws ecs register-task-definition --cli-input-json file://my-task-definition.json # 서비스 생성 aws ecs create-service \ --cluster <CLUSTER_NAME> \ --service-name my-ecs-service \ --task-definition my-task-definition \ --desired-count 1 \ --launch-type EC2
3. 문제 해결 체크리스트
- [ ] 자원 할당량 확인
- [ ] 인스턴스 상태 점검
- [ ] Docker 이미지 최적화
- [ ] 네트워크 설정 검증
- [ ] 컨테이너 의존성 확인
- [ ] 에이전트 상태 점검
위의 단계들을 체계적으로 확인하시면 ECS Task의 pending 상태 문제를 해결하실 수 있습니다. 답변 드린 내용이 도움이 되셨길 바랍니다! 즐거운 하루 되세요! 😊
관련 콘텐츠
- 질문됨 8년 전
- AWS 공식업데이트됨 6달 전