앞글에서 Compute(server/VPC) API를 사용하여 운영 중인 서버 목록을 콘솔에 출력하는 내용까지 TEST를 해보았다.
이제 진짜 하고 싶었던 Ncloud의 Cloud Insight의 서버의 리소스 사용량 데이터를 가져와 출력하고, 데이터를 엑셀에 저장하고, 메일까지 보내는 코드를 만들어 보자.
이중 첫번째는 미션은 특정 서버의 평균 cpu 사용량을 확인하는 것!
사용할 API는 Cloud Insight의 QueryData API
API 서버 정보
api_server = "https://cw.apigw.ntruss.com"
API URI 정보
api_url = "/cw_fea/real/cw/api/data/query"
앞서 Ncloud API를 사용해 봤기 때문에 쉽게 생각하고 시작했지만.....
API 요청부터 에러가 발생 해 또 엄청난 삽질과 시간을 소비하고 말았다..
여러가지 이유가 있었지만 첫번째 난관은 GET/POST 방식의 차이이였다.
(나중에 HTTP GET/POST 차이점에 대해 공부한 내용을 정리할 계획이다.)
앞선 서버 목록을 요청하는 API request는 GET방식으로 쿼리스트링(query string)을 사용하였다.
/vserver/v2/getServerInstanceList?responseFormatType=json"
Cloud Insight에서는 GET방식을 지원하지 않고, POST방식만 지원하였다.
추측하기엔 데이터만 요청하는것이 아닌, 수정, 삭제, 생성과 같은 API가 있기 때문에 POST 방식으로 작동하는것 같다.
Request시 API Server 및 uri + HTTP Header + Body(전송 데이터)를 포함하였다.
전송 데이터는 payload 변수를 생성하고 해당 변수에 dictionary타입으로 저장하였다.(이후 내용부터는 Body데이터를 payload로 명명하겠다.)
이에 헤더파일에 Content-Type': 'application/json 내용도 추가되었다.
앞선 #1에서 설명하였지만, json형식과 Python의 데이터 타입인 Dictionary는 전혀 다른 내용이다.
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에 대한 내용은 API 문서에 예시로 나와있다.
링크 : https://api.ncloud-docs.com/docs/management-cloudinsight-querydata
{
"timeStart": "long",
"timeEnd": "long",
"cw_key": "string",
"productName": "string",
"metric": "string",
"interval": "string",
"aggregation": "string",
"queryAggregation": "string",
"dimensions": {
"string": "string",
"string": "string"
}
}
위 예시만 보고 내가 원하는 서버의 평균 cpu 사용량을 조회 할 수 있을까...?? 너무 난감했다..
이 부분은 ManVScloud 김수현님의 블로그 내용을 참고해서 파악 할 수 있었다. 수현님의 블로그가 아니였으면 아마 아직도 해결을 못했을거 같다..(ㄷㄷㄷ🤐)
수현님의 블로그 내용을 보고 파악한 내용은 아래와 같다.
Cloud Insight 서비스의 작동 원리
상품목록 페이지(https://api.ncloud-docs.com/docs/management-cloudinsight-productinfo) 😡😡중요!!!!
Cloud Insight로 수집되는 Ncloud 서비스 별 상품명(prodName) 및 상품 키(cw_key)와 수집되는 데이터 Type 및 세부 설명을 보여준다.
상품목록 페이지를 확인하여 원하는 Metric의 상품명 및 상품키, 세부 데이터 정보를 확인할 수있었다.
CPU 사용량 관련 세부 정보는 아래와 같다.
여러 Metric 중 cpu_user, cpu_used가 CPU 사용 관련 Metic인거는 알겠는데 정확하게 두 데이터의 차이를 모르고 있었다...(😂무지)
또한 vCPU인 경우 가상 cpu core 수치에 따라 cpu_idx를 지정 할 수있다.
예) 4vCPU의 경우 cpu_idx:0, cpu_idx:1, cpu_idx:2, cpu_idx:3
TIP) 일반적으로 서버의 전체 CPU 사용량을 확인하고 싶은 경우, avg_cpu_used_rto를 사용하면 된다!!
상품목록 문서와 API문서 대략적인 payload의 내용을 확인 할 수 있었다.
더 확실한건 콘솔 내 Cloud Insight에서 Event Rule 설정을 보면 알 수 있다. 결국 콘솔이든 API든 작동하는 방식 및 정보는 동일하기 때문이다.
😡일반적으로 Cloud Insight 관련 설정은 콘솔에서 진행하며(직관적이고 사용이 쉬우니까!), 설정한 내용을 콘솔에서 그래프로 쉽게 확인 할 수 있다.
난 "API를 어떻게 사용하고 어떤 정보를 넣어야 하는지" 라는 생각으로 무작정 검색만 하고.. 그러다 많은 시간을 허비했다...
위 사진은 콘솔에서 설정한 avg_cpu_used_rto 설정 부분이다. 특별한 디멘션 설정은 없으며 집약 방법(aggregation), 지속 시간(interval) 등의 설정을 볼 수 있다.
아래 코드는 콘솔 설정 확인 및 API문서를 통해 얻은 내용으로 작성한 payload이다.
payload = {
"timeEnd": 원하는 시간의 Timstamp,
"timeStart": 원하는 시간의 Timstamp,
"prodName":"System/Server(VPC)",
"metric": "avg_cpu_used_rto",
"interval": "Min1",
"aggregation": "AVG",
"cw_key": "460438474722512896",
"dimensions": {
"instanceNo": "Server Instance Number",
}
}
이 중 시간 데이터에서도 고생을 많이 했다. 실시간으로 수집되는 Metric 중 내가 원하는 시간의 Metric을 확인하고 싶은데 timeStart,timeEnd에 DATA를 어떻게 넣어야 하는지 API문서에서는 나와있지 않았다. 정확하게는 Millisecond 단위로 입력하라고 나와있는데 나는 이 부분이 timestamp값 즉, Uninx Time을 적는것이라고 생각을 못해서 한참을 또 헤맸다ㅠㅠ
위 payload 데이터를 정리하면, VPC 내 지정한 서버의 평균 CPU 사용량을 1분 간격의 평균 데이터로 요청합니다 라고 정리할 수 있다.
[출력 예]
[[1672185600000, 0.37725687]]
요청 한 시간의 timestamp와 해당 Metric이 출력
평균 CPU 사용량 Metric을 받아오는것도 만만치 않은 작업이였다.
단순한 API 요청 및 응답 이였지만 너무 힘들었다.. 이 또한 내가 무지해서 오래 걸린것이라서 누구를 탓 할수도 없다..
과정이 어떻든 결론은 원하는 시간의 평균 CPU 사용량 Metric을 얻을 수 있어서 기뻣다! 앞으로 갈길이 멀기에 부지런이 공부를 해야겠다 !!
[전체 소스코드]
import hashlib
import hmac
import base64
import requests
import time
import json
# unix timestamp 설정
timestamp = int(time.time() * 1000)
timestamp = str(timestamp)
# Ncloud API Key 설정
ncloud_accesskey = "Access Key"
ncloud_secretkey = "Secert 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"
# 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 = {
"timeEnd": 조회를 원하는 시간의 Timestamp 값,
"timeStart": 조회를 원하는 시간의 Timestamp 값,
"prodName":"System/Server(VPC)",
"metric": "avg_cpu_used_rto",
"interval": "Min1",
"aggregation": "AVG",
"cw_key": "460438474722512896",
"dimensions": {
"instanceNo": "Server instance Number",
}
}
response = requests.get(api_server + api_url, headers=http_header, json=payload)
print(response.text)
real_data = json.loads(response.text)
print(real_data)
너무 유용해요!