← ECS Fargate 모니터링
🔍

04 / 06

ecs-discovery

ECS Task 자동 탐지, Docker Labels 파싱, ecs_file_sd.yml 생성, PRD/DEV 클러스터 수집

ecs-discoveryService DiscoveryDocker
아키텍처도입 배경JVM 메트릭ecs-discovery대시보드일정 & 비용

ECS Discovery

ecs-discovery 개요

ecs-discovery 컨테이너는 AWS ECS 클러스터의 Fargate Task를 자동으로 탐지하여 Prometheus가 메트릭을 수집할 수 있도록 연결하는 핵심 구성 요소이다. ECS API를 주기적으로 호출하여 실행 중인 Task 목록을 조회하고, 각 Task의 Docker Labels와 포트 정보를 파싱하여 Prometheus용 ecs_file_sd.yml 파일을 생성한다. 이 파일은 Prometheus 설정에 의해 지속적으로 참조되어, 새로운 Task가 배포되거나 IP가 변경되어도 자동으로 수집 대상이 갱신된다.

Discovery Flow

1

Task 목록 조회

ecs-discovery가 ECS API를 주기적으로 호출하여 클러스터 내 실행 중인 Task 목록을 조회

ecs-discoveryECS API
2

Docker Labels 파싱

각 Task의 Docker Labels와 포트 정보를 파싱하여 메트릭 엔드포인트 정보를 추출

ECS TaskLabels / Ports
3

ecs_file_sd.yml 생성

파싱된 정보를 기반으로 Prometheus가 읽을 수 있는 ecs_file_sd.yml 파일을 생성

Labels / Portsecs_file_sd.yml
4

Prometheus 참조

Prometheus가 file_sd_configs 설정을 통해 ecs_file_sd.yml을 지속적으로 참조하여 수집 대상을 갱신

Prometheusecs_file_sd.yml

Constraints

ECS Service 제약사항

🚫

LB Target Group 재생성 필요

ECS Service를 한 번 만들고 난 후에는 LB Target Group에 Fargate를 추가하는 것이 불가하여, Service를 다시 새로 만들어야 한다. 운영 환경에 적용 시 반드시 고려해야 하는 부분이다.

⚠️

컨테이너당 LB 연결 제한

한 개의 ECS Service에 여러 컨테이너가 있을 수 있지만, 로드 밸런서 대상 그룹 연결은 각 ECS Service마다 한 개의 컨테이너에만 가능하다는 제약이 있다.

ecs-discovery 도입으로 해결

ecs-discovery를 도입하면 LB를 거치지 않고 ECS API를 통해 직접 Task IP를 탐지하므로, 위 제약사항에 영향을 받지 않고 모든 컨테이너의 메트릭을 수집할 수 있다.

Docker Commands

Docker 명령어

운영(PRD)과 테스트(DEV) 클러스터 모두에서 ECS Task를 수집하기 위해 각각의 docker run 명령어를 실행한다.

PRD ClusterProduction
docker run -d \
  --name ecs-discovery-cluster_prd \
  -v /[COMPANY]_SW/monitoring/output_prd:/output \
  -e AWS_REGION=ap-northeast-2 \
  -e AWS_ACCESS_KEY_ID=... \
  -e AWS_SECRET_ACCESS_KEY=... \
  tkgregory/prometheus-ecs-discovery \
  --config.write-to=/output/ecs_file_sd.yml \
  --config.cluster=[Company]_Cluster
DEV ClusterDevelopment
docker run -d \
  --name ecs-discovery-cluster_dev \
  -v /[COMPANY]_SW/monitoring/output_dev:/output \
  -e AWS_REGION=ap-northeast-2 \
  -e AWS_ACCESS_KEY_ID=... \
  -e AWS_SECRET_ACCESS_KEY=... \
  tkgregory/prometheus-ecs-discovery \
  --config.write-to=/output/ecs_file_sd.yml \
  --config.cluster=[Company]_Cluster_Dev

* AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY 값은 보안상 마스킹 처리했습니다

Prometheus Config

Prometheus 설정

ecs-discovery가 생성한 ecs_file_sd.yml 파일을 Prometheus가 참조하도록 prometheus.yml 설정을 변경한다. PRD와 DEV 클러스터의 출력 파일을 모두 등록하여 두 환경의 ECS Task 메트릭을 동시에 수집한다.

prometheus.ymlYAML
scrape_configs:
  - job_name: 'ecs-tasks'
    file_sd_configs:
      - files:
          - /[COMPANY]_SW/monitoring/output_prd/ecs_file_sd.yml
          - /[COMPANY]_SW/monitoring/output_dev/ecs_file_sd.yml
💡

핵심 요약

ecs-discovery는 ECS API를 통해 Fargate Task를 자동 탐지하고, Prometheus의 file_sd_configs 메커니즘을 활용하여 동적으로 수집 대상을 갱신한다. LB Target Group 제약사항을 우회하면서도 PRD/DEV 두 클러스터의 모든 Task 메트릭을 안정적으로 수집할 수 있는 구조이다.

JVM 메트릭대시보드