AWS

ECS Service Discovery, CloudMap, Prometheus

recent0 2025. 4. 13. 11:48

 

0. 서론


Spring Actuator를 통해 Prometheus 메트릭을 수집하기 위해서 몇 가지 고려사항이 필요하다고 생각했습니다.

  • ECS Cluster에서 EC2 1대를 사용하고 있고, 해당 인스턴스에 하나의 ECS Service를 사용하여 두 개의 테스크(어플리케이션 서버)를 배치했다고 가정
  • 두 테스크를 구분하여 모니터링을 하고 싶으나, Public DNS를 통해 얻는 IP 주소만으론 구별이 어렵다고 판단

요구 사항

  • 각 테스크를 구별해서 Prometheus에서 Scrape 할 수 있는 환경
  • Public DNS를 사용하지 않고 Private DNS를 사용해서 불필요한 비용 축소 및 통신 속도 향상

생각해낸 해결책

  • ECS awsvpc 네트워크 모드 + ECS Service Discovery + CloudMap을 사용하여 Private DNS 사용
  • Prometheus에서 Private DNS를 통해 Scraping 할때 DNS 쿼리 응답 정보를 바탕으로 테스크 구분

 

1. ECS Service Discovery + CloudMap


1.1 CloudMap 구성

네임스페이스 생성하기

  • 아래와 같이 네임스페이스를 먼저 생성 후, VPC에서 API 호출 및 DNS 쿼리를 선택
  • VPC 내부에서 인스턴스끼리 DNS를 통해 통신하기 위해서 사용
  • 네임스페이스 이름은 DNS의 일부로 구성되기 때문에 고려해서 작성

서비스 생성

  • 생성한 네임스페이스에서 서비스를 생성
  • 서비스 이름은 이후에 DNS에서 사용될 도메인 주소의 일부이기에 고려해서 작성
  • 또한 라우팅 정책은 다중 응답으로 반환될 수 있도록 Multivalue로 설정

 

이러면 이제 private DNS를 사용할 수 있는 준비가 되었습니다.

1.2 ECS Service Discovery 설정

ECS Service Discovery  활성화

  • ECS Service Discovery는 ECS Service를 언제든 생성, 수정 가능
  • ECS Service 설정에서 기능 활성화 

ECS Service Discovery 적용

  • ECS Service Discovery는 기존에 생성했던 Cloudmap의 네임스페이스와 서비스를 선택하면 활성화
  • 서비스 활성화 시 ECS Service Discovery를 적용하기 위해 배포가 다시 진행됨

 

2. Prometheus 


2.1 Public DNS Prometheus 메트릭 수집

public DNS로 메트릭을 수집하는 경우

  • 기존에 아래처럼 public DNS로 구성해서 scrape를 하면 테스크 구분이 어려움
scrape_configs:
  - job_name: 'test_api'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 30s
    static_configs:
      - targets: [ 'test.domain.kr' ]

 

2.2  Private DNS 적용 후 Prometheus 메트릭 수집

Prometheus dns_sd_configs

  • __meta_dns_name 을 통해 타겟 정보 획득
  • dns_sd_configs 설정은 아래와 같이 정리
  • names : 질의를 할 DNS 도메인 명을 작성
  • type : DNS 쿼리를 수행할 레코드 타입 작성
  • port : 레코드 타입이 SRV가 아닌 경우 포트 작성
  • refresh_interval : DNS 레코드를 얼마나 자주 다시 조회할지를 정하는 설정, 새로운 테스크가 생기거나 사라졌는지 감지

prometheus 공식 문서

private DNS 활용 Prometheus 구성 및 relabel

  • prometheus 환경 설정을 다음과 같이 구성해서 메트릭 수집
  • dns_sd_configs를 통해 cloudmap에서 작성했던 DNS를 기반으로 scraping 할 수 있도록 설정
  • dns 결과값으로 받은 주소를 통해 task_ip, port를 설정하도록 설정
  • 이후 Grafana에서 해당 Promtheus를 datasource로 지정해서 테스크를 구분해서 수집한 메트릭을 모니터링 가능
scrape_configs:
  - job_name : 'test_api'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 30s
    dns_sd_configs:
      - names:
        - 'test-api-service.test-space'
        type: 'A'
        port: 8080
    relabel_configs:
      - source_labels: [__address__]
        target_label: instance
      - source_labels: [__address__]
        target_label: task_ip
        action: replace
      - source_labels: [__address__]
        target_label: task_port
        action: replace
        regex: '.*:(.*)'

 

3. 정리


경험 정리

  • ECS Service Discovery, awsvpc 네트워크 모드, CloudMap 구성 방법
  • Prometheus에서 dns_sd_configs 설정 및 테스크를 구분해서 relabel하는 방법

정리하면서 배운점

  • bridge 네트워크 모드, 동적 포트를 사용한 경우에도 CloudMap의 SRV 레코드를 사용하면 테스크를 구별할 수 있을것으로 판단
  • 왜냐하면 SRV 레코드 응답값에 동적 포트 정보가 있기 때문
  • 이후에 EC2의 스펙이 작고, 추가적으로 메트릭 수집하는 경우가 있다면 효율적으로 사용할 수 있을 것이라고 예측

'AWS' 카테고리의 다른 글

ECS Network Mode, ENI, VPC Endpoint 정리  (0) 2025.03.29
분산환경에서 SQS 리스너 서버 고려점  (0) 2025.02.01
AWS ECS 넓게 펼쳐보기  (2) 2024.11.24
AWS Lambda Java With SnapStart  (2) 2024.06.24
Route 53, DNS 그리고 레코드  (2) 2024.05.30