-
[AWS] ECS Fargate + Prometheus + Grafana (with Terraform)Infra/AWS 2024. 4. 1. 11:34
ECS Fargate에 모니터링 시스템을 구축하고자 한다.
조사해보니 Prometheus + Grafana 조합이 가장 합리적이라고 판단했다.
무료이면서 아웃풋이 괜찮다.
자세히 알고 싶다면, 검색하길 바란다.
각설하고, 주요 과정을 기록하고자 한다.
결과는 정말 별거 없지만, 삽질을 며칠 했다..
자, 먼저 인프라 구성부터 살펴보자.
백엔드와 프론트엔드 서비스 각각에 prometheus/node-exporter container를 추가했다.
terrafom 코드로 IoC 작업을 했다.
... resource "aws_ecs_task_definition" "example" { container_definitions = jsonencode([ { name = "node-exporter" image = "quay.io/prometheus/node-exporter:latest" cpu = 256, memory = 512 essential = true portMappings = [ { containerPort = 9100 hostPort = 9100 protocol = "tcp" } ] logConfiguration = { logDriver = "awslogs", options = { awslogs-group = aws_cloudwatch_log_group.example.name, awslogs-region = "[ap-west-1]", awslogs-stream-prefix = "ecs" } }, } ]) }
여기서 삽질 한 내용을 잠깐 최대한 줄여서,, 말하자면,,
아래 내용을 -> terraform으로 컨버팅 하려고 했다.
볼륨설정과 커멘드를 모두 무조건 해야 되는 줄 알고, 바로 적용 하려고 했다가 실패했다.
Fargate에서는 volume을 사용하려면 EFS를 mount 해야 한다고 한다.
그런데 mount가 계속 실패돼서 원인을 계속 못 찾다가,
ecs-exporter로 바꿨다.
그런데 metrics가 너무 부족해서 다시 node-exporter 설치를 시도 했고,
volume과 command를 빼도 잘 되는게 확인 되었다.(괜한 삽질..)
// docker-compose.yml ... node-exporter: image: quay.io/prometheus/node-exporter:latest container_name: node-exporter restart: unless-stopped volumes: - /:/host:ro command: - "--path.rootfs=/host" ports: - 9100:9100
컨테이너에 잘 추가가 되었고 상태가 Running이면 성공!
접속해보면 아래와 같은 결과가 나온다.
그럼 이제 프로메테우스로 수집해보자.
아래는 설정 파일이다.
target을 본인의 값으로 설정해주자.
# prometheus.yml global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: "example" scheme: https static_configs: - targets: ["example.com:9100"]
아래는 프로메테우스 docker compose 파일이다.
# docker-compose.yml version: "3.8" volumes: prometheus_data: {} services: prometheus: image: prom/prometheus:latest container_name: prometheus restart: unless-stopped volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" - "--web.console.libraries=/etc/prometheus/console_libraries" - "--web.console.templates=/etc/prometheus/consoles" - "--web.enable-lifecycle" ports: - 9090:9090
프로메테우스 실행
$ docker-compose up -d
localhost:9090으로 접속해서 확인해보자.
Status > Targets 이동
정상적으로 작동되면 State가 UP이 된다.
그럼 이제 Grafana를 추가하자.
.datasource.yml 생성
# config file version apiVersion: 1 deleteDatasources: - name: Prometheus datasources: - name: Prometheus type: prometheus access: proxy orgId: 1 url: http://prometheus:9090 basicAuth: false isDefault: false version: 1 editable: false
docker-compose.yml 수정
version: "3.8" volumes: prometheus_data: {} services: prometheus: image: prom/prometheus:latest container_name: prometheus restart: unless-stopped volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" - "--web.console.libraries=/etc/prometheus/console_libraries" - "--web.console.templates=/etc/prometheus/consoles" - "--web.enable-lifecycle" ports: - 9090:9090 grafana: image: grafana/grafana ports: - 9091:3000 volumes: - ./datasource.yml:/etc/grafana/provisioning/datasources/datasource.yml environment: - GF_AUTH_ANONYMOUS_ENABLED=true - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
docker-compose 재시작
localhost:9091로 접속해보자.
관리자 계정을 만들어서 로그인 한다.
자, 그럼 대시보드를 추가하자.
그라파나는 프로메테우스에서 저장하는 시계열 metrics 데이터를 시각화해주는 도구이다.
아래 사이트에서 적당한 템플릿을 가져오면 편하다.
https://grafana.com/grafana/dashboards/?search=node
나의 경우 node-exporter를 사용 했기 때문에 아래 템플릿을 추가했다.
https://grafana.com/grafana/dashboards/1860-node-exporter-full/
우측 하단에 ID를 복사한다.
다시 그라파나에서
Dashboards > New > Import 클릭!
복사한 ID를 붙여넣기하고 Load 버튼을 클릭하면 된다.
시간이 흘러 데이터가 축적되면 아래와 같다.
이렇게 프로메테우스와 그라파나를 사용해 기본적인 모니터링 방법을 알아봤다.
알림기능도 넣을 수 있다니, 무료치고 너무 혜자툴이 아닌가?
세부적인 기능은 더 알아봐야겠지만, 이 작업만 할 수 있는 환경이 아니라 일단 여기까지만 하고자 한다.
레퍼런스
https://kubernetes.github.io/ingress-nginx/user-guide/monitoring/#grafana
https://lordofkangs.tistory.com/329
https://medium.com/finda-tech/grafana%EB%9E%80-f3c7c1551c38
https://play.grafana.org/dashboards
https://aws-diary.tistory.com/72
'Infra > AWS' 카테고리의 다른 글