이번 게시글에서는 웹 개발자 성향 테스트프로젝트에서 진행했던 Auto Scaling Group EC2의 모니터링을 위한 Prometheus 설정 방법에 대해 기술하겠다. 해당 프로젝트는 실제로 사용자의 트래픽을 받기 위해 AWS ECS 환경으로 구성하였으며, Auto Scaling 되는 EC2 상에서 작동되는 Spring WAS의 상태를 모니터링하기 위해 구성되었다.
Spring Actuator와 Prometheus, Grafana를 이용한 모니터링 구축 방법에 대해 설명한 다른 좋은 글들이 많으니, 이번 게시글에서는 Spring Actuator와 Prometheus, Grafana에 대해 구축해본 경험이 있는 사람들을 대상으로, Auto Scaling Group EC2의 모니터링을 위한 Prometheus 설정 방법에 대해서만 기술하겠다.
AWS EC2의 태그를 기반으로 Prometheus에게 EC2의 정보를 수집하도록 하기 위해 먼저 AmazonEC2ReadOnlyAccess 권한을 가진 IAM을 만들어 주어야 한다.
AmazonEC2ReadOnlyAccess를 생성하여 EC2 읽기 권한을 부여할 수 있도록 한다.
이제 Prometheus에서 EC2의 정보를 수집하도록 ec2_sd_configs를 적절하게 입력해주어야 한다. 아래는 해당 코드이다.
global:
scrape_interval: 1m
scrape_timeout: 15s
evaluation_interval: 2m
external_labels:
monitor: 'account-monitor'
query_log_file: query_log_file.log
rule_files:
- "rule.yml"
scrape_configs:
- job_name: 'monitoring-item'
metrics_path: '/actuator/prometheus'
honor_labels: false
honor_timestamps: false
scheme: 'http'
ec2_sd_configs:
- region: ap-northeast-2
port: 1010
access_key: AmazonEC2ReadOnlyAccess Access Key
secret_key: AmazonEC2ReadOnlyAccess Secret Key
filters:
- name: tag:PrometheusScrape
values:
- Enabled
relabel_configs:
- source_labels: [ __meta_ec2_tag_Name ]
target_label: instance
- source_labels: [ __meta_ec2_private_ip ]
regex: '(.*)'
replacement: '${1}:1010'
action: replace
target_label: __address__
- source_labels: [ __meta_ec2_tag_group ]
target_label: group
- source_labels: [ __meta_ec2_instance_type ]
target_label: instance_type
- target_label: application
replacement: "Webti"
- target_label: namespace
replacement: "API Server"
Prometheus 설정 파일에서 ec2_sd_configs를 사용하여 EC2 인스턴스 정보를 수집하고, relabeling을 통해 원하는 형태로 라벨을 재구성한다.
아쉽게도, Prometheus 상에서 Target에서 EC2를 찾은 결과 사진은 없지만, Grafana에서의 결과는 다음과 같다.
Prometheus에서 수집한 정보를 기반으로 Grafana에서 Spring WAS의 상태를 모니터링하는 모습이다.
사실 ec2_sd_configs를 사용하는 방식말고 Amazon ECS 서비스 검색 기능 을 이용하여 Prometheus의 AWS 의존성을 없도록 구성하고자 했었다. 거의 성공할 뻔했으나, 모니터링 서버에서 네임스페이스를 이용한 Ping 명령어로는 Spring WAS에 접근이 가능했지만, Prometheus의 Target에서는 접근이 불가능했다. 아마도 Prometheus의 Docker DNS가 AWS Route53의 주소를 찾지 못했기 때문일 것이다. 이를 해결하는 것 보다는 ec2_sd_configs를 이용하는 것이 더 적절하다고 생각했다. 하지만 해결하고 싶은 생각은 있다...
이에 대한 정보를 아시는 분은 댓글로 공유해주시면 감사하겠습니다.