ip가 계속 바뀌는데 모니터링을 어떻게 해요?

심규민·2024년 12월 26일
post-thumbnail

1. 기존 모니터링 환경의 한계

저희 회사는 ECS와 Fargate를 조합하여 서버를 운영하며 AWS CloudWatch를 통해 모니터링을 진행하고 있었습니다. 그러나 CloudWatch 사용 시 다음과 같은 한계가 있었습니다.

  1. ECS 서버의 CPU 사용량이 개별 서버가 아닌 전체 평균값으로만 제공되어 세부적인 리소스 추적이 어려움.
  2. 1분 주기로 데이터가 업데이트되어 실시간 모니터링이 불가능함.
  3. jvm 내부의 상태를 조회할 수 없음

2. 새로운 모니터링 시스템 구축 계획

이러한 문제를 해결하기 위해 Spring Actuator, Prometheus, 그리고 Grafana를 활용한 새로운 모니터링 시스템을 구축하기로 했습니다. Prometheus는 서버 매트릭스를 수집하고, Grafana는 이를 시각화하여 실시간성과 세부적인 리소스 추적을 가능하게 합니다.

3. 주요 문제점과 요구사항

하지만 새로운 시스템 구축 과정에서 다음과 같은 문제점이 있었습니다

  1. 유동적인 IP 주소: Fargate의 롤링 배포 및 자동 스케일링으로 인해 서버 IP가 지속적으로 변경되었습니다.
  2. 보안 요구사항: 매트릭스는 VPC 내부에서만 접근 가능해야 하며, Public IP로 접근할 수 없어야 했습니다.
  3. 서버 수 변화: Auto Scaling으로 인해 서버 수가 유동적으로 변할 수 있었습니다.

이를 해결하기 위해 다음 요구사항을 정의했습니다

  1. 실시간성을 갖춘 모니터링 시스템.
  2. 유동적인 서버 환경에서도 대상 서버를 유연하게 추적 가능.
  3. VPC 내부에서만 매트릭스를 수집하도록 보안 강화.

4. Private DNS

위에서 정의한 요구사항을 만족시키기 위해 AWS의 Private DNS를 활용하여 모니터링 시스템을 구축했습니다. Private DNS는 모니터링 서버가 개별 IP를 직접 관리하지 않고, 도메인을 통해 동적으로 변경되는 서버들의 IP를 쉽게 추적할 수 있도록 해줍니다. 이를 통해 유동적으로 변하는 서버 환경에서도 안정적인 모니터링이 가능하다고 판단했습니다.

Private DNS란?
Private DNS는 내부 네트워크 또는 사설망에서 도메인 이름을 IP 주소로 해석하는 데 사용됩니다. 이는 Public DNS와 다르게 외부 네트워크에 노출되지 않고 VPC 내부에서만 작동되도록 설계되었습니다.

4.1 Private DNS에 동적 서버 등록

Fargate로 배포된 서버가 시작될 때, AWS Cloud Map을 활용하여 서버를 자동으로 Private DNS에 등록하도록 설정했습니다.

  • AWS Cloud Map은 서비스 디스커버리 기능을 제공하며, 서버가 시작되거나 종료될 때 해당 서버의 네트워크 정보를 자동으로 갱신합니다.
  • 도메인에 대해 Multivalue Answer 설정을 적용하여 도메인 이름을 질의했을 때 여러 IP 주소를 반환하도록 구성했습니다.

이를 통해 다음과 같은 이점을 얻을 수 있었습니다

  • IP 변경에도 안정적인 추적: Fargate의 롤링 배포 및 Auto Scaling으로 인해 IP가 변경되더라도, 고정된 도메인 이름을 통해 대상 서버를 식별할 수 있습니다.
  • 자동화된 네트워크 관리: AWS Cloud Map이 서버 추가 및 삭제 시 자동으로 DNS 레코드를 업데이트하므로, 별도의 작업 없이 최신 상태를 유지할 수 있습니다.

4.2 Prometheus의 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로 디스커버리한 서버들에 접근할 포트입니다.
  1. metrcs_path: 디스커버리한 서버들에 접근할 포트를 지정합니다.

작동 방식

  • Prometheus에 설정된 Private DNS을 주기적으로 질의하여 질의 결과로 나온 IP 주소 목록을 보관합니다.
  • 보관한 IP 주소 목록을 기반으로 각 서버에 설정된(ex: 127.0.0.1:8081/actuator/prometheus)에 접근해 매트릭스를 수집합니다.
  • Private DNS에 질의한 결과가 수정되면 기존에 관리하는 IP 주소 목록을 업데이트합니다.

요약

  • AWS Cloud Map과 Private DNS를 활용함으로써 다음과 같은 요구사항을 만족시킬 수 있었음
    • 실시간 데이터 수집 및 시각화를 통한 효율적인 운영
    • VPC 내부 통신만 허용하여 보안 강화
    • 유동적인 Fargate 환경에서도 안정적인 모니터링 가능

0개의 댓글