티스토리 뷰

개요

  • Grafana는 매우 다양한 데이터 소스(MySQL, Elasticseach 등)로부터 잘 준비되고 일관된 방식의 시계열 그래프를 만들어낼 수 있는 대표적인 오픈 소스 기반의 대시보드 솔루션이다. 가로축의 시계열 데이터를 핵심으로 하여, 인스턴스 또는 애플리케이션의 모니터링 및 알람에 최적화된 기능을 제공하여 널리 쓰이고 있다. 이번 글에서는 ECSGrafana를 설치하는 방법을 소개하고자 한다.

사전 지식

로드 밸런서 생성

  • Grafana를 서비스하기 위해 앞단에 ACM 인증서, 대상 그룹, 보안 그룹, 로드 밸런서를 생성해야 한다. 필요한 설정은 아래와 같으며 본 블로그의 이 글에서 작업 내용을 참고할 수 있다.
- [선택] ACM 인증서를 생성하고 로드 밸런서에 서브 도메인을 연결한다.
- [필수] 443 포트를 리스닝하여 Grafana 웹 콘솔의 3000 포트로의 로드 밸런싱을 설정한다.
- [선택] 80 포트를 리스닝하여 로드 밸런서의 443 포트로의 리디렉션을 설정한다.

EFS 생성

  • Grafana는 계정, 데이터 소스, 대시보드, 알람 등의 데이터를 /var/lib/grafana 경로에 저장한다. 컨테이너 재기동이나 버전 업그레이드시 데이터 유실을 방지하기 위해 영구적인 EFS를 생성하여 연동해야 한다.
- [필수] Grafana의 환경 설정 데이터를 영구적으로 저장할 EFS를 생성한다. (이름 예: grafana-prod)
- [필수] Grafana의 도커 이미지와 동일한 사용자 ID를 가진 EFS 액세스 포인트를 생성한다. (이름 예: grafana-prod-var-lib-grafana, 루트 디렉토리 경로: /var/lib/grafana, 사용자 ID: 472, 그룹 ID: 0)

Grafana ECS 작업 정의 생성

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

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

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

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

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

Grafana ECS 서비스 생성 및 실행

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

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

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

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

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

Grafana CloudWatch 데이터 소스 추가

  • AWS 기반 인프라에는 CloudWatch 데이터 소스의 추가가 매우 중요하다. 하나 만으로 거의 모든 리소스의 현황을 모니터링할 수 있다.
Configuration
→ [Data Sources] 클릭
→ [Add data source] 클릭

# Connection Details
→ Authentication Provider: [Access & secret key] 선택
→ Access Key Id: ***** (입력)
→ Secret Access Key: ***** (입력)
→ Default Region: [ap-northeast-2] 선택 (환경에 따라 자주 사용하는 리전 선택, 추후 변경 가능)
→ [Save & Test] 클릭
→ [Back] 클릭

Grafana 대시보드 추가

  • 대시보드는 직접 만들어도 되지만, 이미 잘 만들어진 대시보드가 무료로 공개되어 있다.
Create
→ [Import] 클릭
→ 11266 (Amazon CloudWatch Logs) → [Load] 클릭 → [Import] 클릭
→ 551 (AWS ECS) → [Load] 클릭 → [Import] 클릭
→ 617 (AWS EC2)→ [Load] 클릭 → [Import] 클릭

부록: Microsoft Teams를 Notification 채널로 등록

  • Microsoft TeamsGrafanaNotification 채널로 등록하면 Alert을 수신할 수 있다.
  • 먼저, Microsoft TeamsAlert 메시지를 수신할 전용 채널을 생성한다.
Microsoft Teams 실행
→ [팀] 클릭
→ [...] 클릭
→ [채널 추가] 클릭

# 채널 만들기
→ 채널 이름: GRAFANA_INFRA_ALERT (입력)
→ 개인정보취급방침: [표준 - 팀의 모든 사용자가 액세스 가능] 선택
→ [다음] 클릭
→ [건너뛰기] 클릭
  • 앞서 생성한 채널에 대한 Incoming Webhook을 생성한다.
Microsoft Teams 실행
→ [팀] 클릭
→ [GRAFANA_INFRA_ALERT] 클릭
→ [...] 클릭
→ [커넥터] 클릭

# 커넥터
→ Incoming Webhook → [추가] 클릭 → [추가] 클릭
→ 이름: GRAFANA_INFRA_ALERT_INCOMING_WEBHOOK (입력)
→ [만들기] 클릭

# 화면에 출력된 Webhook URL 복사

→ [완료] 클릭

부록: Image Renderer 플러그인 연동

  • GrafanaImage Renderer 플러그인이 연동되어 있으면, Alert 전송시 해당 대시보드 패널의 이미지를 첨부할 수 있다. Image Renderer를 연동하는 방법은 생각보다 복잡한 편인데 2가지 방법이 존재한다. [관련 링크]
  • 첫번째 방법은, 별도의 Image Renderer 인스턴스를 생성하는 것이다. 공식 홈페이지에서는 이 방법을 권장한다. (이미지 렌더링에 굳이 격리된 독립 인스턴스를 권장하는 이유는 브라우저를 헤드리스로 실행하여 그래프의 PNG 파일을 렌더링하는 방식이라 메모리가 많이 요구되기 때문이다.)
  • 두번째 방법은, 도커 이미지를 커스텀 빌드하여 기존 Grafana 인스턴스에 Image Renderer 플러그인을 추가하는 것이다. 인프라 규모가 크지 않고, Alert의 전송 빈도가 적을 경우 추천할만하다. 커스텀 도커 이미지 빌드 방법은 아래와 같다.
# 커스텀 도커 이미지 빌드
$ docker build --build-arg "GRAFANA_VERION=latest" --build-arg "GF_INSTALL_IMAGE_RENDERER_PLUGIN=true" -t foobar-grafana:latest https://raw.githubusercontent.com/grafana/grafana/master/packaging/docker/custom/Dockerfile
  • 커스텀 빌드된 도커 이미지를 Amazon ECS에서 실행하려면 Amazon ECR에 업로드해야 한다. 방법은 아래와 같다. (사전에 foobar-grafana 이름의 ECR 리파지터리를 생성했다고 가정한다.)
$ aws ecr get-login-password --region {region}
{login-password}

$ docker login -u AWS -p {login-password} 1234567890.dkr.ecr.{region}.amazonaws.com

$ docker tag crolo-grafana:latest 1234567890.dkr.ecr.{region}.amazonaws.com/foobar-grafana:latest

$ docker push 1234567890.dkr.ecr.{region}.amazonaws.com/foobar-grafana:latest
  • 기존 생성한 ECS 작업 정의에서 컨테이너의 이미지 경로를 아래와 같이 변경한다.
# 변경 전
docker.io/grafana/grafana

# 변경 후
1234567890.dkr.ecr.{region}.amazonaws.com/foobar-grafana:latest
  • 이 것으로 끝이 아니다. 마지막으로 Alert에 첨부될 대시보드 패널 이미지가 저장될 저장소 정보를 환경 설정에 추가해야 한다. (Amazon S3를 이용하고, 사전에 foobar-grafana-alert-images 이름을 가진 퍼블릭 버킷을 생성했다고 가정한다.)
GF_EXTERNAL_IMAGE_STORAGE_PROVIDER=s3
GF_EXTERNAL_IMAGE_STORAGE_S3_BUCKET=foobar-grafana-alert-images
GF_EXTERNAL_IMAGE_STORAGE_S3_REGION={region}
GF_EXTERNAL_IMAGE_STORAGE_S3_ACCESS_KEY=*****
GF_EXTERNAL_IMAGE_STORAGE_S3_SECRET_KEY=*****
  • 여기까지 완료 후 실행 중인 ECS 서비스를 재시작하면 Image Renderer 플러그인 연동이 최종적으로 완료된다. 이제 Alert 전송시 별도의 추가 작업 없이 Graph 이미지와 링크가 첨부된다.

참고 글

댓글
댓글쓰기 폼