Browsing Tag

CLI

NCLOUD

[NCLOUD] Cloud Log Analytics 서비스별 로그 보관 방법

안녕하세요 MANVSCLOUD 김수현입니다.

네이버 클라우드 서비스 중 Cloud Log Analytics는 로그 데이터의 수집, 검색, 분석, 저장 등을 통합적으로 관리할 수 있는 강력한 서비스입니다.

로그 데이터는 시스템의 성능 모니터링, 보안 감사, 문제 해결 등 다양한 용도로 사용되며, 이러한 데이터를 효과적으로 관리하는 것은 IT 인프라 운영에 있어 매우 중요합니다.
네이버 클라우드 콘솔에서 제공하는 로그 내보내기 기능만 이용할 경우 사용자가 원하는 방식으로 로그 데이터를 내보내거나 특정 조건에 맞는 로그 데이터를 추출하는 데 어려움이 있을 수 있습니다.

따라서 이 포스팅에서는 네이버 클라우드 플랫폼의 API를 이용하여 사용자 맞춤형 로그 내보내기 방법을 공유드리고자 합니다.


Cloud Log Analytics

Cloud Log Analytics는 네이버 클라우드에서 다양한 로그를 수집하고 분석 및 저장할 수 있는 서비스입니다. Cloud Log Analytics 서비스에 대한 특성을 어느정도 알고 있으면 좋은데 Cloud Log Analytics는 Standard 및 Premium 요금제에 따라 일별 로그 수집 용량 및 월 저장 용량에 대한 제한이 있으며 저장 용량을 초과할 경우 추가 저장을 위해 오래된 데이터부터 삭제되는 방식입니다.

또한 Cloud Log Analytics에 수집되는 로그의 용량이 하루 10GB를 넘어가거나 천만 건 이상일 경우에는 저장된 로그 검색에 대한 제한이 있으며 로그 저장 기간이 최대 30일까지만 저장됩니다. 상황에 따라 Cloud Log Analytics 서비스에 저장되는 로그를 Export하여 보관할 필요가 있는데요.

네이버 클라우드 콘솔에서 제공하는 Cloud Log Analytics의 Export Log 기능은 특정 버킷 및 로그 종류를 선택하여 로그를 저장하는 방식입니다. 하지만 이 기능의 경우 하나의 버킷에 선택된 모든 로그 종류를 하나의 파일에 모두 저장하는 방식이므로 추후 특정 로그에 대한 값을 얻을 필요가 있을 때 어려움을 겪습니다.

“로그 종류별로 버킷을 분리하여 저장할 수는 없을까요?”라는 사용자 요구 사항도 있었기때문에 아래 Hands On을 통해 Cloud Log Analytics의 로그를 Object Storage에 저장 시 커스터마이징하여 저장하는 방법을 진행해보도록 하겠습니다.


Hands On

https://cloudloganalytics.apigw.ntruss.com/api/{regionCode}-v1/

로그 내보내기를 위해 서버를 생성할 수 없으니 Cloud Functions을 이용할 것입니다.
Cloud Functions으로 로그별 액션을 나눌 수도 있고 Trigger를 이용하여 특정 시간마다 또는 특정 시간에 로그를 내보낼 수도 있을 것입니다.

  • 런타임 : Python 3.11
  • 코드
import hashlib
import hmac
import base64
import requests
import time
import json


def main(args):
    
    access_key = args["NCLOUD_ACCESS_KEY"]
    secret_key = args["NCLOUD_SECRET_KEY"]
    logTypes = args["logTypes"]
    bucketname = args["bucketname"]
    
    timestamp = int(time.time() * 1000)
    timestamp_from = timestamp - (6 * 60 * 60 * 1000)
    
    secret_key_bytes = bytes(secret_key, 'UTF-8')
    method = "POST"
    api_server = "https://cloudloganalytics.apigw.ntruss.com"
    uri = "/api/kr-v1/logs/search/export?responseFormatType=json"
    
    message = method + " " + uri + "\n" + str(timestamp) + "\n" + access_key
    message_bytes = bytes(message, 'UTF-8')
    signingKey = base64.b64encode(hmac.new(secret_key_bytes, message_bytes, digestmod=hashlib.sha256).digest())
    
    http_header = {
        'x-ncp-apigw-signature-v2': signingKey,
        'x-ncp-apigw-timestamp': str(timestamp),
        'x-ncp-iam-access-key': access_key
    }
    
    payload = {
        "logTypes": logTypes,
        "timestampFrom": str(timestamp_from),
        "timestampTo": str(timestamp),
        "timeZone": "+09:00",
        "bucketname": bucketname
    }
    
    response = requests.post(api_server + uri, headers=http_header, json=payload)
    data = json.loads(response.text)
    
    return data

위 코드는 현재 시간부터 6시간 전까지의 로그를 지정된 버킷으로 Export하는 코드입니다.
참고로 위 코드에서 keyword 파라미터를 추가하여 원하는 로그만 얻을 수도 있습니다.

  • 디폴트 파라미터
{"logTypes":"{LOG_TYPE}","bucketname":"{BUCKET_NAME}","NCLOUD_ACCESS_KEY":"{ACCESS_KEY}","NCLOUD_SECRET_KEY":"{SECRET_KEY}"}
  • {LOG_TYPE} : 저장할 로그 타입
  • {BUCKET_NAME} : 로그를 저장할 버킷 이름
  • {ACCESS_KEY} : 최소한의 권한이 부여된 Sub Account의 access key
  • {SECRET_KEY} : 최소한의 권한이 부여된 Sub Account의 secret key

추가로 Cloud Functions에서는 아래와 같이 특정 파라미터에 대해서 암호화가 가능하니 꼭 적용하도록 합시다.

생성한 Cloud Functions을 실행할 경우 위와 같이 정상 실행되어야하며 정상 실행될 경우 Object Storage에서 저장된 로그를 확인할 수 있습니다.

참고로 아래 CLA 로그 폴더 리스트는 CLA의 Export Log 기능을 사용했을 때 저장된 폴더인데 시간대(연월일시분초)를 보면 새벽 2시부터 4시 사이에 임의의 시간에 생성되는 것을 알 수 있었습니다.

즉 위와 같이 API를 이용할 경우 원하는 고정적인 시간마다 커스터마이징된 로그를 서비스별로 분리하여 각 버킷에 저장할 수 있습니다.


파일 다운로드 없이 로그 확인

네이버 클라우드 CLI 중 호환 CLI인 awscli를 이용하여 Object Storage에 대한 컨트롤이 가능합니다. 버킷 생성, 오브젝트 조회, 오브젝트 업로드, 다운로드 등 다양하게 사용이 가능한데 이 CLI를 이용하여 Object Storage에 저장된 파일을 다운로드 받지 않고 직접 읽는 것도 가능합니다.

1) aws cli 사전 준비

  • aws cli 설치
apt install pip
pip install awscli==1.15.85
  • 인증 정보 설정
aws configure
AWS Access Key ID [None]: ACCESS_KEY_ID
AWS Secret Access Key [None]: SECRET_KEY
Default region name [None]:
Default output format [None]:

읽고자 하는 파일의 경로를 지정해준 후 마지막 부분에 하이픈(-)을 추가하여 파일 내용을 표준 출력으로 리다이렉션하도록 해줍니다. 아래와 같은 예시로 사용할 수 있습니다.

2) 예시

  • 사용 예시
aws s3 cp s3://버킷이름/경로/파일명.json -

위와 같은 방법을 이용한다면 Cloud Log Analytics의 로그가 Object Storage에 저장될 경우 직접 Object Storage에서 파일을 다운로드하여 원하는 값을 하나씩 찾지 않아도 jq 명령어와 함께 원하는 값만 얻을 수도 있습니다.

  • @timestamp 값이 2024-02-04T15:10:00 ~ 2024-02-04T15:20:00 사이의 값에 해당하는 모든 message 값 얻기
aws s3 cp s3://버킷이름/경로/파일명.json - | jq 'select((."@timestamp" >= "2024-02-04T15:10:00") and (."@timestamp" <= "2024-02-04T15:20:00")).message'

Personal Comments

클라우드 콘솔의 기본 로그 내보내기 기능만으로는 원하는 결과를 얻을 수 없겠지만 네이버 클라우드에서 제공하는 API를 활용한다면 사용자 맞춤형 로그 내보내기가 가능하다는 것을 Hands On을 통해 실습하고 알 수 있었습니다.

이러한 Cloud Log Analytics와 API를 이용한 로그 관리는 클라우드 환경에서의 성공적인 리소스 관리에 도움이 될 것입니다.

긴 글 읽어주셔서 감사합니다.