Cloud Insight API 사용하여 서버의 평균 자원 사용량 응답 데이터 Excel 저장 #3

728x90

2024.04.23 - [네이버클라우드 API 사용 활용 사례] - Cloud Insight API 사용하여 서버의 평균 CPU 사용량 출력 #2-2

 

지난 포스팅에서는 Cloud Insight API를 통하여 생성된 서버의 CPU/MEM/FileSystem 사용량을 확인하였다.

이번에는 응답받은 CPU/MEM/FileSystem 사용량을 Excel에 저장하여 문서화 하는 방법에 대해서 포스팅 할 예정이다.

 

 Python 응답 데이터 Excel저장

python에서 excel을 다루기 위해서는 excel 관련 별도 라이브러리가 필요하다.

여러 excel 관련 라이브러리가 있지만 이번 포스팅에서는 대표적인 openpyxl 라이브러리를 사용하였다.

 

설치

  • 파이썬 패키지 관리자인 pip으로 간단하게 설치 가능
pip install openpyxl

 

기본적인 사용법

 

[용어]

  • workbook: 편집 대상 Excel파일 객체
  • worksheet: 편집 대상 Excel파일 내 sheet 객체 / 명시하지 않으면 기본 sheet로 인식

[기본 사용법]

 

 workbook

  • 신규 excel파일 생성하는 경우
# openpyxl 라이브러리를 사용하기 위해 import
import openpyxl

# wb변수에 workbook 객체 저장
# excel 신규파일 생성
wb = openpyxl.Workbook()

 

  • excel파일이 이미 생성되어 있는 경우(excel파일 열기) 
# openpyxl 라이브러리를 사용하기 위해 import
import openpyxl

# wb변수에 workbook 객체 저장
# 생성되어 있는 excel파일을 workbook객체 load
wb = openpyxl.load_workbook("저장경로+파일이름")

 

 worksheet

  • worksheet 설정(신규 sheet 생성)
# openpyxl 라이브러리를 사용하기 위해 import
import openpyxl

# wb변수에 workbook 객체 저장
# 생성되어 있는 excel파일을 workbook객체 load
wb = openpyxl.load_workbook("저장경로+파일이름")

ws = wb.create_sheet("new_sheet")

ws.save("저장경로+파일이름")

 

  • worksheet 설정(만들어져 있는 sheet 사용)
1. 활성되어 있는 Sheet 접근
wb = openpyxl.load_workbook("저장경로+파일이름")

# ws 변수에 excel 자체에서 현재 선택되어 있는 sheet 저장 
ws = wb.active

ws.save("저장경로+파일이름")

2. Sheet명을 지정하여 접근
wb = openpyxl.load_workbook("저장경로+파일이름")
ws 변수에 excel에 생성되어 있는 sheet 명을 저장
ws = wb.["Sheet 명"]

ws.save("저장경로+파일이름")

 

이렇게 사용할 excel을 workbook 객체로 지정하고, 사용할 sheet를 지정하면 python에서 해당 sheet에 대하여 읽기/쓰기 작업을 수행 할 수 있다.

 

 Cloud Insight 응답 데이터 Excel 저장

 

이전 포스팅 내용인 다수 서버의 avg_cpu_used_rto 응답 데이터를 excel에 저장 해보자.

 

  • f-string을 사용하여 지정된 row에 데이터를 저장하고, row값을 증가시켜 순차적으로 데이터를 저장.
wb = openpyxl.load_workbook("저장경로+Excel파일명")
ws = wb.active

#QueryDataMultiple API호출을 통해 avg_cpu_used값을 호출했다 가정하자. 

#엑셀 7열 의미
row = 7
print("CPU : avg_cpu_used DATA")
for cpu in avg_cpu_used_f:
    #f-string을 row를 변수로 사용
    #sheet에 F7 cell에 avg_cpu_used 데이터 저장
    ws[f'f{row}'] = round(float(cpu['dps'][0][1]), 2)
    #이후 row값을 증가시켜 아래 열에 데이터를 연속해서 저장.
    row = row + 1

wb.save("저장경로+Excel파일명")

 

 결론

 

Cloud Insight API를 통하여 서버의 리소스 사용량을 확인하였으며, 해당 데이터를 Excel로 저장하여 문서화까지 하였다.

openpyxl 라이브러리를 사용하여 쉽게 Excel 편집을 할 수 있었다.

API를 사용하는 내용보다는 훨씬 쉽고 재미있었으며 금방 검색을 통해 구현 할 수 있었다.

 

다음 글에는 이렇게 만들어진 Excel파일을 메일 발송하는 내용을  포스팅 할 예정이다.

 

[전체 소스코드]

  • excel의 경로를 raw string으로 미리 저장(fpath)
  • 작업 할 excel의 sheet를 ws변수에 저장
  • Server1, Server2의 avg_cpu_used_rto 데이터를 해당 sheet row에 저장
import hashlib
import hmac
import base64
import requests
import time
import json
import openpyxl

fpath = r'Excel 파일 경로'
wb = openpyxl.load_workbook(fpath)
ws = wb.active


# unix timestamp 설정
timestamp = int(time.time() * 1000)
timestamp = str(timestamp)

# Ncloud API Key 설정
ncloud_accesskey = "Acces Key"
ncloud_secretkey = "Secret Key"

# 암호화 문자열 생성을 위한 기본값 설정
apicall_method = "POST"
space = " "
new_line = "\n"

# API 서버 정보
api_server = "https://cw.apigw.ntruss.com"

# API URL 서버 목록 조회
api_url = "/cw_fea/real/cw/api/data/query/multiple"


# hmac으로 암호화할 문자열 생성
message = apicall_method + space + api_url + new_line + timestamp + new_line + ncloud_accesskey
message = bytes(message, 'UTF-8')

# hmac_sha256 암호화
ncloud_secretkey = bytes(ncloud_secretkey, 'UTF-8')
signingKey = base64.b64encode(hmac.new(ncloud_secretkey, message, digestmod=hashlib.sha256).digest())


# http 호출 헤더값 설정
http_header = {
    #'Content-Type': 'application/json',
    'x-ncp-apigw-timestamp': timestamp,
    'x-ncp-iam-access-key': ncloud_accesskey,
    'x-ncp-apigw-signature-v2': signingKey
    }

payload = {
    "metricInfoList": [
        {
            "prodKey": "460438474722512896",
            "metric": "avg_cpu_used_rto",
            "interval": "Min1",
            "aggregation": "avg",
            "dimensions": {
                "instanceNo": "Server#1 Instance Number"
            }
        },
        {
         "prodKey": "460438474722512896",
            "metric": "avg_cpu_used_rto",
            "interval": "Min1",
            "aggregation": "avg",
            "dimensions": {
                "instanceNo": "Server#2 Instance Number"
            }   
        },
        
    ],
    "prodName":"System/Server(VPC)",
    "timeEnd": "조회를 원하는 시간의 Timestamp 값", 
    "timeStart": "조회를 원하는 시간의 Timestamp 값"
    } 

response = requests.post(api_server + api_url, headers=http_header,json=payload)

real_data = json.loads(response.text)

row = 7
for cpu in real_data:
    ws[f'f{row}'] = round(float(cpu['dps'][0][1]), 2)
    row = row + 1

wb.save(fpath)

 

728x90