티스토리 뷰

개요

  • Prometheus는 기본적으로 원격 연결이 가능한 시계열 데이터베이스이다. Prometheus의 진정한 강점은 원격지에 위치한 다수의 서버에 대해 모니터링 관련 시계열 데이터를 수집하여 적재하고, 시각화 기능을 제공하는데 있다. 탄생 배경과 쓰임새 모두 서버 인스턴스 모니터링에 최적화되어 있다. 일반적으로 단독 사용보다는 대시보드 시각화 기능이 우수한 Grafana에 원격 데이터 소스를 제공하는 역할로 주로 사용된다. 이번 글에서는 Amazon ECSPrometheus설치하는 방법을 소개하고자 한다.

사전 지식

Prometheus 데이터베이스 EFS 생성

  • Prometheus 컨테이너 재기동시 환경 설정, 시계열 데이터베이스에 대한 상태를 보존하려면 아래 2개 경로를 EFS로 생성하여 외부 볼륨으로 마운트해야 한다.
/etc/prometheus: 환경 설정 저장
/prometheus: 시계열 데이터베이스 저장
  • EFS를 아래와 같이 생성한다.
Amazon EFS 콘솔 접속
→ [파일 시스템] 클릭
→ [파일 시스템 생성] 클릭
→ 이름: prometheus-data-prod (입력)
→ Virtual Private Cloud(VPC): [foobar-prod] 선택 (마운트할 인스턴스가 속한 VPC 선택)
→ [생성] 버튼 클릭

Prometheus 데이터베이스 EFS 액세스 포인트 생성

  • Prometheus의 컨테이너는 uid=65534, gid=65534을 가진다. 이 정보를 토대로 동일한 환경의 EFS 액세스 포인트를 생성한다.
Amazon EFS 콘솔 접속
→ [파일 시스템] 클릭
→ [prometheus-data-prod] 클릭
→ [액세스 포인트] 클릭
→ [액세스 포인트 생성] 버튼 클릭

# 액세스 포인트 생성 > 세부 정보
→ 이름: prometheus-data-prod-etc-prometheus (입력)
→ 루트 디렉토리 경로: /etc/prometheus (입력)

# 액세스 포인트 생성 > POSIX 사용자
→ 사용자 ID: 65534 (입력)
→ 그룹 ID: 65534 (입력)
→ 보조 그룹 ID: 0 (입력)

# 액세스 포인트 생성 > 루트 디렉터리 생성 권한
→ 소유자 사용자 ID: 65534 (입력)
→ 소유자 그룹 ID: 65534 (입력)
→ 권한: 0755 (입력)

→ [액세스 포인트 생성] 클릭
  • 동일한 방법으로 prometheus-data-prod-prometheus 이름의 루트 디렉토리 경로 /prometheus를 가지는 액세스 포인트를 하나 더 생성한다.

prometheus.yml 파일 작성

  • 컨테이너 첫 기동에 앞서 prometheus.yml 파일에 환경 설정 및 데이터베이스에 적재할 원격지 엔드포인트 목록을 정의할 차례이다. 앞서 생성한 EFS와 동일한 VPC에 위치한 EC2 인스턴스에서 아래와 같이 EFS를 마운트하고 환경 설정 파일을 작성한다.
$ sudo yum install -y amazon-efs-utils

$ mkdir -p ~/prometheus-prod-etc-prometheus

$ mkdir -p ~/prometheus-prod-prometheus

$ sudo mount -t efs -o tls,accesspoint={efs-access-point-id} {efs-flie-system-id}:/ ~/prometheus-prod-etc-prometheus

$ sudo mount -t efs -o tls,accesspoint={efs-access-point-id} {efs-flie-system-id}:/ ~/prometheus-prod-prometheus

$ cd ~/prometheus-prod-etc-prometheus

$ nano prometheus.yml
global:
  scrape_interval: 15s
  scrape_timeout: 10s
  external_labels:
    monitor: 'foobar-prometheus'

scrape_configs:
  - job_name: 'foobar-rabbitmq-prod'
    metrics_path: /metrics
    scheme: http
    static_configs:
      - targets: ['{some-rabbitmq-host}:15692']
  - job_name: 'foobar-ec2-prod'
    static_configs:
      - targets: ['{some-ec2-host}:9100']

Prometheus 대상 그룹 생성

  • 이제 Prometheus의 서비스 리스닝 포트인 9090 포트에 대한 대상 그룹을 생성할 차례이다.
Amazon EC2 콘솔 접속
→ [로드밸런싱] → [대상 그룹] 클릭
→ [Create target group] 클릭
→ Choose a target type: [IP addresses] 선택
→ Target group name: foobar-prometheus-prod-9090 (대상 그룹 이름)
→ Protocol: [HTTP] 선택 (로드 밸런싱할 프로토콜)
→ Port: 9090 (로드 밸런싱할 포트)
→ VPC: [foobar-prod] 선택
→ Health check protocol: HTTP
# 헬스 체크 경로, 정확히 지정하지 않으면 컨테이너가 무한 재기동되므로 유의
→ Health check path: /status
→ [Next] 클릭
→ [Create target group] 클릭

Prometheus 퍼블릭 로드 밸런서 생성

  • 앞서 생성한 대상 그룹을 이용하여 퍼블릭 로드 밸런서를 생성할 차례이다.
Amazon EC2 콘솔 접속
→ [로드밸런싱] → [로드밸런서] 클릭
→ [Load Balancer 생성] 클릭
→ Load Balancer 유형 선택: [Application Load Balancer] 생성

# 기본 구성
→ 이름: foobar-prometheus-prod-public (입력)
→ 체계: [인터넷 경계] 선택

# 리스너
→ Load Balancer 프로토콜: [HTTPS] 선택 (리스닝할 프로토콜) → Load Balancer 포트: 443 (입력) 

# 가용 영역
→ VPC: [foobar-prod] 선택 (로드 밸런싱할 대상 인스턴스 위치한 VPC 선택)
→ 가용 영역: [ap-northeast-2a] 체크 → [foobar-prod-public-1] 선택
→ 가용 영역: [ap-northeast-2b] 체크 → [foobar-prod-public-2] 선택
→ 가용 영역: [ap-northeast-2c] 체크 → [foobar-prod-public-3] 선택

# 보안 설정 구성
→ 인증서 유형: [ACM에서 인증서 선택] 선택
→ 인증서 이름: [*.foobar.com] 선택
→ 보안 정책: [ELBSecurityPolicy-FS-1-2-RES-2020-10] 선택
→ [다음: 보안 그룹 구성] 클릭

# 보안 그룹 구성
→ 보안 그룹 할당: [기존 보안 그룹 선택] 체크 -> [foobar-prod-prometheus] 체크
→ [다음: 라우팅 구성] 클릭

# 라우팅 구성
→ 대상 그룹: [기존 대상 그룹] 선택
→ 이름: [foobar-prometheus-prod-9090] 선택
→ [다음: 대상 등록] 클릭

# 대상 등록
→ [다음: 검토] 클릭

# 검토
→ [생성] 클릭

Prometheus ECS 작업 정의 생성

  • Amazon ECS에 작업 정의를 생성할 차례이다.
Amazon ECS 콘솔 접속 → 작업 정의 → [새 작업 정의 생성] 클릭 → [FARGATE] 클릭
→ 작업 정의 이름: foobar-prometheus-prod (입력)
→ 작업 역할: [ecsTaskExecutionRole] 선택
→ 네트워크 모드: [awsvpc] 선택
→ 작업 메모리(GB): [2GB] 선택
→ 작업 CPU(vCPU): [1 vCPU] 선택

# 볼륨 추가
→ [볼륨 추가] 클릭
→ 이름: prometheus-data-prod-etc-prometheus
→ 볼륨 유형: [EFS] 선택
→ 파일 시스템 ID: [prometheus-data-prod] 선택
→ Access point ID: [prometheus-data-prod-etc-prometheus] 선택
→ [추가] 클릭

# 볼륨 추가
→ [볼륨 추가] 클릭
→ 이름: prometheus-data-prod-prometheus
→ 볼륨 유형: [EFS] 선택
→ 파일 시스템 ID: [prometheus-data-prod] 선택
→ Access point ID: [prometheus-data-prod-prometheus] 선택
→ [추가] 클릭

# 컨테이너 추가
→ [컨테이너 추가] 클릭
→ 컨테이너 이름: foobar-prometheus-prod
→ 이미지: docker.io/prom/prometheus (입력)
→ 포트 매핑: 9090/TCP

# 작업 및 컨테이너 정의 구성
→ [생성] 클릭

# 컨테이너 추가 > 스토리지 및 로깅
→ 탑재 지점
→ 소스 볼륨: prometheus-data-prod-etc-prometheus (작업 정의에서 추가한 EFS 볼륨을 선택)
→ 컨테이너 경로: /etc/prometheus (컨테이너에서 EFS 볼륨을 마운트할 경로 입력)
→ [추가] 클릭
→ 소스 볼륨: prometheus-data-prod-prometheus (작업 정의에서 추가한 EFS 볼륨을 선택)
→ 컨테이너 경로: /prometheus (컨테이너에서 EFS 볼륨을 마운트할 경로 입력)
→ [추가] 클릭

Prometheus ECS 서비스 생성 및 실행

  • Amazon ECS에 작업 정의를 생성할 차례이다.
Amazon ECS 콘솔 접속 → 클러스터 → 서비스를 생성할 클러스터 클릭 → [서비스] 클릭 -> [생성] 클릭

# 서비스 구성
→ 시작 유형: [FARGATE] 선택
→ 작업 정의: foobar-prometheus-prod
→ 버전: 1 (latest)
→ 플랫폼 버전: [1.4.0] 선택
→ 클러스터: [foobar-prod] 선택
→ 서비스 이름: foobar-prometheus-prod (입력)
→ 작업 개수: 1 (입력)
→ 최소 정상 상태 백분율: 100 (입력)
→ 최대 백분율: 200 (입력)
→ 배포 유형: [롤링 업데이트] 선택
→ [다음 단계] 클릭

# 네트워크 구성
→ 클러스터 VPC: (마운트할 인스턴스가 속한 VPC 선택)
→ 서브넷: [foobar-prod-private-1], [foobar-prod-private-2], [foobar-prod-private-3] 선택
→ 보안 그룹: [foobar-prod-prometheus], [foobar-prod-efs-access] 선택
→ 자동 할당 퍼블릭 IP: [DISABLED] 선택
→ 로드 밸런서 유형: [Application Load Balancer] 선택
→ 로드 밸런서 이름: [foobar-prometheus-prod-public] 선택
→ 컨테이너 선택: [foobar-prometheus-prod:9090:9090] 선택 → [로드 밸런서에 추가] 클릭
→ 프로덕션 리스너 포트: [443:HTTPS] 선택
→ 대상 그룹 이름: [foobar-prometheus-prod-public-9090] 선택
→ [다음 단계] 클릭

# Auto Scaling
→ 서비스 Auto Scaling: [서비스 Auto Scaling을 구성하여 원하는 서비스 개수를 조정합니다.] 선택
→ 최소 작업 개수: 1
→ 최대 작업 개수: 2
→ 조정 정책 유형: [대상 추적] 선택
→ 정책 이름: foobar-prometheus-prod (입력)
→ ECS 서비스 측정치: [ECSServiceAverageCPUUtilization] 선택
→ 대상 값: 70 (입력)
→ [다음 단계] 클릭

# 검토
→ [서비스 생성] 클릭

ECS 서비스 기동 후 엔드포인트 작동 확인

  • ECS 서비스 기동 후 아래 엔드포인트를 통해 정상 작동 여부를 확인할 수 있다. ({host}에는 실제 ALB 또는 CNAME으로 연동된 도메인을 입력하면 된다.)
http://{host}:9090/: Prometheus 웹 콘솔 주소
http://{host}:9090/status: Prometheus 헬스 체크 주소
댓글
댓글쓰기 폼