[kor] Amazon CloudWatch Logs With Amazon Managed Grafana

25 May 2023 By Moohyun Song

Amazon CloudWatch Logs + Amazon Managed Grafana를 통한 손쉬운 로그 수집 및 분석

Amazon Grafana 설정

  1. Amazon Grafana Console로 이동하여 Create workspace를 선택한다.
  2. Workspace name을 설정한다.
  3. Authentication access는 SAML 방식을 사용할 것이다. 이 계정이 Organizations Root 계정이면 AWS IAM Identity Center를 사용할 수 있으나, 이 설정에서는 그럴 수 없기에 다른 SAML Solution을 사용해야한다.(Okta, Azure Active Directory 등) 이 예제에서는 Azure Active Directory를 사용할 것이다.
  4. Permission type은 Service managed를 사용한다.
  5. Turn Grafana alerting on 은 이 예제에서 설정하지 않는다.
  6. Network access controlOpen access 를 사용하여 쉽게 웹에서 접속할 수 있도록 한다.
  7. 그 다음 Data sources의 경우, Amazon CloudWatch만 선택해준다. (나중에 추가할 수 있다.)
    1. Amazon X-ray, Amazon Managed Prometheus(한국 리전은 지원 안됨.), Amazon Athena도 지원한다.
  8. Create workspace를 해준다.

SAML 설정 : Azure Active Directory

  1. Azure Active Directory Console로 이동하여 Enterprise applicatinos 를 선택한다.
  2. New application 클릭 후, Grafana 를 검색하면 Amazon Managed Grafana 가 나온다. 선택해준 다음, Name 을 변경하고 Create 해준다.
  3. Users and groups 로 이동 후, Grafana에 접근할 AD User를 추가해준다.
  4. Single sign-on 으로 이동 후, SAML 을 선택하고, 이 창은 잠시 keep 해둔다.

SAML 설정 : Amazon Managed Grafana

  1. 방금 전에 생성한 Grafana workspace에 들어와서 SAML에서 Complete setup 을 클릭한다.
  2. IdP 설정하기 :
    1. Service provider identifier (Entity ID)는 방금 전에 keep 해둔 Azure Portal 창에서, Basic SAML ConfiguartionEditIdentifier (Entity ID)Add identifier 후 주소를 복사 붙여넣기 한다.
    2. Service provider reply URL (Assertion consumer service UTL)은 Reply URL (Assertion Consumer Service URL)Add identifier 후 주소를 복사 붙여넣기 한다.
    3. Service provider login URL은 Sign on URL 에 주소를 복사 붙여넣기 한다.
    4. 위에 Save 를 누르고 빠져나온다.
  3. Federation Metadata URL 입력하기
    1. Azure SAML-based Sign-on (위 IdP와 동일한 페이지에서 계속)에 3. SAML Certificate 의 App Federation Metadata Url 주소를 복사 후 AWS Grafana 설정 페이지의 Metadata URL 에 복사 붙여넣기 한다.
  4. 관리자 계정 설정하기
    1. 현재는 간편하게 하기 위해, displayName을 통해 설정할 것이다.
    2. AWS Console Step 3의 Assertion attribute role 에는 displayName을 입력하고, Admin role values 에는 AD 계정의 Display Name을 입력해준다. ex) Moohyun Song
    3. 이러면 해당 계정만 admin이 되어 웹 페이지에서 여러가지를 추가/수정/삭제 할 수 있게 된다.
    4. 만약 여러 계정을 관리자로 하고 싶다면, AD 계정에 공통적인 Attribute를 만들고 이를 Claim으로 AMP에 넘겨서 attribute role내용과 value를 그에 맞도록 하면 된다. ex) grafanaRole이라는 Attribute 생성 후, value가 Admin이면 admin이 되도록 할 수 있다.
  5. Save SAML configuration 해준다.

Cloudwatch Logs에 boto3를 이용한 데이터 추가

Log Stream 생성 및 Log Stream에 event를 넣는 예제 코드: (Log Group은 Console에서 별도로 생성)

import boto3
import json
import time

logs_client = boto3.client('logs')

def create_log_stream(log_group_name, log_stream_name):
    logs_client.create_log_stream(logGroupName=log_group_name, logStreamName=log_stream_name)

def create_log_event(log_group_name, log_stream_name, log_event_index, inference_time, network_latency_time):
    log_data = {
        'index_number': log_event_index,
        'inference_time': inference_time,
        'network_latency_time': network_latency_time
    }
    log_event = {
        'timestamp':int (time.time() * 1000),
        'message': json.dumps(log_data)
    }
    logs_client.put_log_events(logGroupName=log_group_name, logStreamName=log_stream_name, logEvents=[log_event])

Grafana에 CloudWatch Data Source 추가하기

  • Grafana web page로 이동하여, AWS Data Sources 로 이동한다. 그리고 Data sources 탭에서 CloudWatch Service를 선택 후, Default region 지정 후, Add data source 해준다.

예제 : Grafana에서 CloudWatch Logs Data 시각화 및 가공

  1. Dashboard에서 add panel을 해준다.
  2. Query 에서 Data sourceAmazon CloudWatch 를 선택한다.
    • CloudWatch Metrics → 일반적인 Metric을 Grafana를 통해 볼 수 있다.
    • CloudWatch Logs → Logs에 저장된 데이터를 Grafana를 통해 볼 수 있다.
  3. CloudWatch Logs를 선택한 뒤, Log Group 선택 후 아래와 같은 CloudWatch Logs Insight Query 문을 입력한다.
fields index_number, inference_time
| filter @logStream = "2023-05-24-14_05_33-mobilenet_v1-100tasks-log-stream"

위와 같이 Bar chart를 사용해 한눈에 CloudWatch logs에 저장된 inference_time을 볼 수 있다.

만약 데이터 재가공이 필요한 경우, +Expression 을 통해 여러가지 할 수 있으며, 현재 표시된 데이터 정보를 추출하고 싶으면 그래프 위 제목을 누르고 inspectData 를 통해 추출할 수 있다.