내용으로 건너뛰기

ECS on EC2를 할 때, 생성한 Task가 대기 상태일 때 해결 방법과 두개의 도커 이미지를 하나의 태스크로 올릴때 질문드립니다.

0

안녕하세요

ECR에 프론트 도커파일, 백엔드 도커파일이 푸시되어 있는 상태에서, ECS에 배포하기 위해 ECS 클러스터를 생성하고, Task Definition을 설정했습니다. 하나의 Task Definition에서 컨테이너를 2개 두려고 각 도커파일 이미지 uri를 추가하는데, 생성된 Task를 서비스로 생성할 때, task가 계속 대기중이고 실행되지 않는 이슈가 있습니다. 이에 대한 원인은 어떻게 확인할 수 있으며 클러스터의 인스턴스 크기 문제인지, 컨테이너를 설정할때 할당한 자원의 문제인지 등을 어떻게 확인하고 해결하는지가 궁금합니다. 두개의 컨테이너를 하나의 태스크로 정의하고 서비스를 실행하는 부분의 예시가 있으면 좋겠습니다.

질문됨 2년 전152회 조회
2개 답변
0

ECS on EC2에서 Task가 대기 상태일 때 해결 방법과 두 개의 도커 이미지를 하나의 태스크로 올리는 것에 대해 설명드리겠습니다.

Task가 계속 대기 중이고 실행되지 않는 이슈의 원인을 확인하기 위해서는 다음과 같은 방법들을 사용할 수 있습니다:

  1. Amazon ECS 콘솔에서 서비스 이벤트 로그를 확인합니다. 이를 통해 서비스 관련 오류 메시지를 볼 수 있습니다.

  2. 컨테이너 인스턴스에서 Amazon ECS 컨테이너 에이전트 로그를 확인합니다. 이 로그는 태스크 실행과 관련된 자세한 정보를 제공합니다.

  3. Docker 데몬 로그를 확인하여 컨테이너 시작 관련 문제를 파악할 수 있습니다.

  4. 태스크 정의에서 지정한 메모리와 CPU 리소스가 컨테이너 인스턴스의 가용 리소스를 초과하지 않는지 확인합니다.

  5. CannotPullContainer 오류가 있는지 확인하고, 이 경우 이미지 풀 권한과 이미지 URL을 점검합니다.

  6. IAM 역할 요청을 확인하여 태스크에 필요한 권한이 올바르게 설정되어 있는지 확인합니다.

두 개의 컨테이너를 하나의 태스크로 정의하는 방법은 다음과 같습니다:

  1. 태스크 정의에서 두 개의 컨테이너 정의를 추가합니다. 각 컨테이너에 대해 이미지 URI, 필요한 리소스(CPU, 메모리), 포트 매핑 등을 지정합니다.

  2. 컨테이너 간 통신이 필요한 경우, 링크를 사용하거나 네트워크 모드를 'awsvpc'로 설정하여 동일한 네트워크 네임스페이스를 공유하도록 할 수 있습니다.

  3. 환경 변수나 볼륨을 통해 컨테이너 간 데이터를 공유할 수 있습니다.

  4. 태스크 정의를 저장하고 이를 사용하여 서비스를 생성하거나 태스크를 실행합니다.

리소스 할당 문제인 경우, 태스크 정의에서 각 컨테이너에 할당된 CPU와 메모리를 조정하거나, 더 큰 인스턴스 유형을 사용하여 클러스터의 리소스를 늘릴 수 있습니다. 또한, ECS 콘솔에서 서비스 이벤트와 태스크 상태를 주기적으로 확인하여 문제의 원인을 파악하고 해결할 수 있습니다.
Sources
Amazon ECS troubleshooting - Amazon Elastic Container Service
Amazon ECS task metadata v4 examples - Amazon Elastic Container Service

답변함 2년 전
0

안녕하세요, 해당 내용에 대해서 답변 드리겠습니다. 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 상태 문제를 해결하실 수 있습니다. 답변 드린 내용이 도움이 되셨길 바랍니다! 즐거운 하루 되세요! 😊

답변함 2년 전

로그인하지 않았습니다. 로그인해야 답변을 게시할 수 있습니다.

좋은 답변은 질문에 명확하게 답하고 건설적인 피드백을 제공하며 질문자의 전문적인 성장을 장려합니다.

관련 콘텐츠