저희 회사는 ECS와 Fargate를 조합하여 서버를 운영하며 AWS CloudWatch를 통해 모니터링을 진행하고 있었습니다. 그러나 CloudWatch 사용 시 다음과 같은 한계가 있었습니다.
이러한 문제를 해결하기 위해 Spring Actuator, Prometheus, 그리고 Grafana를 활용한 새로운 모니터링 시스템을 구축하기로 했습니다. Prometheus는 서버 매트릭스를 수집하고, Grafana는 이를 시각화하여 실시간성과 세부적인 리소스 추적을 가능하게 합니다.
하지만 새로운 시스템 구축 과정에서 다음과 같은 문제점이 있었습니다
이를 해결하기 위해 다음 요구사항을 정의했습니다
위에서 정의한 요구사항을 만족시키기 위해 AWS의 Private DNS를 활용하여 모니터링 시스템을 구축했습니다. Private DNS는 모니터링 서버가 개별 IP를 직접 관리하지 않고, 도메인을 통해 동적으로 변경되는 서버들의 IP를 쉽게 추적할 수 있도록 해줍니다. 이를 통해 유동적으로 변하는 서버 환경에서도 안정적인 모니터링이 가능하다고 판단했습니다.
Private DNS란?
Private DNS는 내부 네트워크 또는 사설망에서 도메인 이름을 IP 주소로 해석하는 데 사용됩니다. 이는 Public DNS와 다르게 외부 네트워크에 노출되지 않고 VPC 내부에서만 작동되도록 설계되었습니다.
Fargate로 배포된 서버가 시작될 때, AWS Cloud Map을 활용하여 서버를 자동으로 Private DNS에 등록하도록 설정했습니다.
이를 통해 다음과 같은 이점을 얻을 수 있었습니다
Private DNS와 AWS Cloud Map의 자동화된 네트워크 관리를 기반으로, Prometheus는 도메인을 질의하여 반환된 IP 목록을 활용해 매트릭스를 수집하도록 구성했습니다.
아래는 Prometheus의 설정 파일(promethues.yml)에서 private dns를 활용한 디스커버리 구성입니다.
scrape_configs:
- job_name: 'prod-api'
dns_sd_configs:
- names:
- 'prod.server' // 도메인
type: 'A'
port: 8081 // 포트
metrics_path: '/actuator/prometheus' // 경로
...
1.dns_sd_configs
names: Private DNS 도메인 이름을 지정합니다. 예를들어 AWS Cloud Map에 등록된 prod.server 도메인을 사용합니다.type: 도메인의 타입을 지정합니다. 저는 A 레코드를 사용하여 A를 지정했습니다.port: dns로 디스커버리한 서버들에 접근할 포트입니다.metrcs_path: 디스커버리한 서버들에 접근할 포트를 지정합니다.