NCP 도입일지 - 공공기관용 NCP에서 API  활용 도전기 1(Feat. Python, POST)
June/NCP

NCP 도입일지 - 공공기관용 NCP에서 API 활용 도전기 1(Feat. Python, POST)

시작하면서

CSAP 인증 취득을 위해 NCP 환경을 사용하기 시작했다.(CSAP 취득 성공!!)
이미 올해 4월부터 다양한 테스트와 인프라로 기본적인 서비스 환경은 구성되어 있다.
이제는 단순한 NCP 콘솔 사용이 아닌 좀 더 IaC에 가까워지고자 NCP API를 활용하고자 한다.
(참고로 여기서 NCP는 공공기관용 NCP 이다. 일반 NCP가 아님에 주의)

공공기관용 API는 2020년 4월에만해도 정말 그 수가 다양하지 않았는데, 지금은 제법 쓸만해졌다.
NCP를 사용하면서 가장 크게 느낀 점은 NCP도 과도기에 있다는 점이다.
현재 모든 서비스를 AWS로 운용하고 있는 환경 특성상 NCP는 아직 가야할 길이 많이 남았다.
쉽게 말해서 기존에는 장애가 발생하면 개발인지 운영인지 그 원인을 찾아야 했다면, NCP 환경에서는 개발, 운영, NCP 세 가지를 장애 원인으로 봐야한다. 

하지만 우리가 CSAP 취득을 받기 위해 KMS, Objest Storage 권한 설정 등과 같은 많은 기능들을 요구하였다. 다행히 NCP에서 굉장히 협조적으로 모든 출시일정도 당겨주고 많은 도움을 주었다.
NCP 환경 자체는 불완전하고 아직 지속적인 발전중에 있지만, NCP의 파트너사 쌍용과 NCP 기술담당 매니저님들의 실력이 출중하여 많은 도움을 받을 수 있었다.

다시 본론으로 돌아가서,
NCP 환경에서 API를 사용하려고 하는데 도무지 NCP 공공기관용 참조서만 봐서는 무엇하나 제대로 작동하지 않는다. 그래서 내가 겪은 시행착오들을 여기에 기록하여 우리의 후발주자로 나설 다른 NCP 고객사들이 삽질(?)을 최소화 하였으면 좋겠다.

목표

파이썬 requests 모듈을 사용하고, POST 방식으로 NCP API를 호출하여 사용하기

NCP API 너란 녀석..

NCP API 참조서 : https://apidocs.ncloud.com/ko/

 

API 참조서

""에 대한 건이 검색되었습니다. ""에 대한 검색 결과가 없습니다.

apidocs.ncloud.com

위의 글 처럼 NCP APU는 버전 2가 릴리즈 되었다.
그렇기 때문에 버전 1로 쓸 건데,,, 미리 스포하자면 역시나 안내서 만으로 무언가를 동작시키기는 쉽지가 않다.

NCP API 에 발을 담가보자

 

API 가이드 → Naver Cloud Platform API 를 클릭해보면 API를 사용하기 전에 어떤 녀석들이 기본값으로 필요한지 나와있다.

크게 필요한 녀석들은 위의 세 가지 헤더이다. 
해당 매뉴얼에서 Python에 대해 어떻게 해당 값들을 얻을 수 있는지 나와있기 때문에 여기까지는 아주 순조롭다고 할 수 있다. 아래를 참고하여 나오는 signingKey값이 위 헤더 중 x-ncp-apigw-signature-v2의 값이 된다. timestamp도 함수에 포함되어 있기에 그냥 쓰면 된다.

import sys
import os
import hashlib
import hmac
import base64
import requests
import time

def	make_signature():
	timestamp = int(time.time() * 1000)
	timestamp = str(timestamp)

	access_key = "{accessKey}"				# access key id (from portal or Sub Account)
	secret_key = "{secretKey}"				# secret key (from portal or Sub Account)
	secret_key = bytes(secret_key, 'UTF-8')

	method = "GET"
	uri = "/photos/puppy.jpg?query1=&query2"

	message = method + " " + uri + "\n" + timestamp + "\n"
	+ access_key
	message = bytes(message, 'UTF-8')
	signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())
	return signingKey

이제 실습을 시작할 것인데 시작하기 전에 기본적인 사전 지식은 알고 가자.
1) URL과 URI : https://medium.com/@js230023/url-과-uri의-차이-154d70814d2a#:~:text=URI의 존재는 인터넷,가 URL의 상위 개념.
2) POST와 GET : https://hongsii.github.io/2017/08/02/what-is-the-difference-get-and-post/
사실 나도 파이썬으로 API 호출을 진행하는게 낯설다. 보통 가벼운 호출이기에 get을 써도 무관하지만 그나마 body에 담겨 전송되는 보안성 + 코딩의 유연함 때문에 POST로 진행해보기로 하였다.

실습 -> Autoscaling Group의 정보 가져오기

실제 API를 호출하여 볼 것이다. 한 번 천천히 참조서를 따라 가보면서 어떤 점이 부족하고 어떻게 해결하는지 알아보자. 우선, 액세스 키와 시크릿 키는 NCP 유저라면 전부 가지고 있을 것이다.
API를 호출하려면 아래와 같은 조건이 만족되어야 한다.

1) 공통 header
2) URL
3) URI

다시 API 참조서를 활용하여 Auto Scaling에 들어가 본다.

그러면 간편하게 URL과 헤더 정보를 얻을 수 있다.
이제 URI를 확인해보자.

구체적으로 getAutoScalingGroupList 라는 API를 호출하여 볼테다!
해당 API 참조서는 [개요] - [요청] - [응답] - [예시] 카테고리로 이루어져 있다.
그런데 응답 예시가 XML 이다. 요즘 대부분 응답은 JSON으로 제공되는 줄 알았는데, XML에서부터 당황하였다. 그리고 아래와 같이 요청 파라미터가 나와있는데,

 

예시는 api url 한 줄 밖에 없다.

무엇보다 요청 파라미터와 예시에서 사용된 autoScalingGroupNameList 변수 사용이 다르다.
예시에는 “.1”이 붙어있다. 이렇게 다른 상황이 참조서의 끝이다. 과연 이 난관을 어떻게 헤쳐나갈 수 있을까?
실제로 이 참조서만 보고 실제로 구성해 보았을 때에는 전체의 리스트를 가져오는데는 문제 없었지만 요청 파라미터를 활용해서 특정 값을 가져오는 것은 작동하지 않았다. 또한 xml로 응답이 오기 떄문에 이를 변환까지 해주어야만 했다.(지금은 해결했다)

2편에서는 실질적으로 어떻게 API를 호출하고 무엇을 더 참조할 수 있는지에 대해서 알아보자.