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 레코드를 얼마나 자주 다시 조회할지를 정하는 설정, 새로운 테스크가 생기거나 사라졌는지 감지
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 |