Python으로 Ncloud API를 호출하는 샘플 예제

개요

Ncloud (네이버 클라우드) 인프라와 상품 및 솔루션 등의 활용을 도와주는 API를 Python으로 호출하는 샘플 예제를 정리해봅니다.
Ncloud API는 RESTful API 방식으로 제공되며, XML와 JSON 형식으로 응답합니다 우선 전체 소스코드를 살펴보고 다음으로 주요 코드를 상세하게 살펴보겠습니다.

API 호출 샘플 코드

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

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

# Ncloud API Key 설정
ncloud_accesskey = "네이버 클라우드 AccessKey"
ncloud_secretkey = "네이버 클라우드 SecretKey"

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

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

# API URL 예시 : 상품별 가격 리스트 호출 api
api_url = "/billing/v1/product/getProductPriceList"
api_url = api_url +"?regionCode=KR&productCode=SPCF000000000001&responseFormatType=json"

# 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 = {
    'x-ncp-apigw-timestamp': timestamp,
    'x-ncp-iam-access-key': ncloud_accesskey,
    'x-ncp-apigw-signature-v2': signingKey
}

# api 호출
response = requests.get(api_server + api_url, headers=http_header)

print (response.text)

코드 상세 설명

유닉스 타임 스탬프

Ncloud API를 호출할 때는 13자리 형식의 유닉스 타임 스탬프가 필요합니다.
time.time()은 float 형식의 값을 리턴하므로 1000을 곱하고 정수로 반올림하고, 문자열로 변환합니다.

timestamp = int(time.time() * 1000)
timestamp = str(timestamp)

Ncloud API 인증키 설정

ncloud_accesskey = "네이버 클라우드 AccessKey"
ncloud_secretkey = "네이버 클라우드 SecretKey"

Ncloud API 인증키는 Ncloud 포탈 -> 마이페이지 -> 계정관리 -> 인증키 관리 - API 인증키 관리 메뉴에서 Access Key ID와 Secret Key를 가져오셔야 하며, 아직 만들어진 Key가 없다면 새로 만드셔야 합니다.

Ncloud API 인증키 생성하는 방법

hmac으로 암호화할 문자열 설정

암호화할 문자열을 설정하는데 필요한 값을 사전에 정의합니다.
API 호출 방식은 GET과 POST 둘 다 가능한데, 일반적으로 많이 사용되는 GET 방식으로 소개하고, POST 방식은 아래쪽에 코드만 정리해두었습니다.

apicall_method = "GET"
space = " "
new_line = "\n"

API 서버와 URL 정보

API 서버와 URL 정보를 설정하면서 API 호출 후 리턴되는 결과값을 json, xml 어떤 형태로 받을 것인지를 responseFormatType=json, responseFormatType=xml 형식으로 설정할 수 있습니다. 기본 값은 xml로 값을 설정하지 않으면 xml로 리턴됩니다.

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

# API URL 예시 : 상품별 가격 리스트 호출 api
api_url = "/billing/v1/product/getProductPriceList"
api_url = api_url +"?regionCode=KR&productCode=SPCF000000000001&responseFormatType=json"

암호화 문자열 생성

Ncloud API에서는 호출 방식(GET, POST)과 도메인을 제외한 API URL, 유닉스 타임스탬프, API ACCESSKEY를 공백과 개행문자 \n을 이용해서 하나의 문자열로 설정합니다.

message = apicall_method + space + api_url + new_line + timestamp + new_line + access_key
message = bytes(message, 'UTF-8')

hmac_sha256 방식으로 암호화

hmac sha256 방식으로 Ncloud API SecretKey를 이용하여 message를 암호화 즉, 해시값을 만들고, 다시 base64로 인코딩합니다.

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

http 호출 헤더값 설정

API를 호출할 때는 http 헤더값에 다음 3가지를 추가해서 호출합니다.

  • 유닉스 타임스탬프
  • Ncloud API AccessKey
  • hmac_256 으로 암호화한 문자열
http_header = {
    'x-ncp-apigw-timestamp': timestamp,
    'x-ncp-iam-access-key': ncloud_accesskey,
    'x-ncp-apigw-signature-v2': signingKey
}

api 호출

이제 위에서 준비한 값들을 사용해서 API를 호출합니다.
리턴값은 호출하는 용도별로 json 또는 xml 형태로 반환됩니다.

response = requests.get(api_server + api_url, headers=http_header)

응답 예시

{"getProductPriceListResponse": {
  "requestId": "3e4fa6**-f967-4***-a8a9-9dd75****2d65",
  "returnCode": "0",
  "returnMessage": "success",
  "totalRows": 1,
  "productPriceList": [
    {
      "productItemKind": {
        "code": "CF",
        "codeName": "Cloud Functions"
      },
      "productItemKindDetail": {},
      "productCode": "SPCF000000000001",
      "productName": "Cloud Functions",
      "productDescription": "Cloud Functions",
      "softwareType": {},
      "productTypeDetail": {},
      "gpuCount": 0,
      "cpuCount": 0,
      "memorySize": 0,
      "baseBlockStorageSize": 0,
      "dbKind": {},
      "osInfomation": "",
      "platformType": {},
      "osType": {},
      "platformCategoryCode": "",
      "diskType": {},
      "diskDetailType": {},
      "generationCode": "",
      "priceList": [
        {
          "priceNo": "3870",
          "priceType": {
            "code": "MTRAT",
            "codeName": "Meter rate"
          },
          "chargingUnitType": {
            "code": "QUERY",
            "codeName": "Query"
          },
          "ratingUnitType": {
            "code": "SECT",
            "codeName": "Period unit"
          },
          "chargingUnitBasicValue": "1000000",
          "productRatingType": {
            "code": "CFREQ",
            "codeName": "Cloud Functions Request"
          },
          "unit": {
            "code": "REQ_CNT",
            "codeName": "Number of requests (per month)"
          },
          "price": 0,
          "conditionType": {},
          "conditionPrice": 0,
          "priceDescription": "Number of requests (1000000) * Price",
          "freeUnit": {},
          "freeValue": 0,
          "meteringUnit": {
            "code": "REQ_CNT",
            "codeName": "Number of requests (per month)"
          },
          "startDate": "2018-04-10T00:00:00+0900",
          "periodUnitList": [
            {
              "startValue": 0,
              "endValue": 1000000,
              "price": 0
            },
            {
              "startValue": 1000000,
              "endValue": -1,
              "price": 200
            }
          ],
          "countryUnitList": [],
          "packageUnitList": []
        }
      ]
    }
  ]
}}

POST 방식 호출 코드

Ncloud API는 일반적으로 GET 방식으로 호출하지만, POST 방식으로 호출하는 경우는 다음처럼 구성할 수 있습니다.

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

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

# Ncloud API Key 설정
ncloud_accesskey = "네이버 클라우드 AccessKey"
ncloud_secretkey = "네이버 클라우드 SecretKey"

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

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

# API URL 예시 : 상품별 가격 리스트 호출 api
api_url = "/billing/v1/product/getProductPriceList"

# hmac으로 암호화할 문자열 생성
message = apicall_method + space + api_url + new_line + timestamp + new_line + access_key
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 = {
    'x-ncp-apigw-timestamp': timestamp,
    'x-ncp-iam-access-key': ncloud_accesskey,
    'x-ncp-apigw-signature-v2': signingKey
}

# POST 파라미터
post_data =(
    ('regionCode','KR'),
    ('productCode','SPCF000000000001'),    
    ('responseFormatType','json')
)

# api 호출
response = requests.post(api_server + api_url, headers=http_header, data=post_data)

print (response.text)

오류 상황

Python으로 코드를 작성할 때 발생할 수 있는 오류를 정리해보겠습니다.

import requests 오류

requests는 Python에서 http 호출에 필요한 라이브러리입니다. 설치되어 있지 않으면 다음과 같은 오류가 발생할 수 있습니다.

다음과 같이 requests 라이브러리를 설치하면 해결 됩니다.

D:\python> pip install requests

Collecting requests
  Downloading requests-2.27.1-py2.py3-none-any.whl (63 kB)
     |████████████████████████████████| 63 kB 790 kB/s
Collecting urllib3<1.27,>=1.21.1
  Downloading urllib3-1.26.8-py2.py3-none-any.whl (138 kB)
     |████████████████████████████████| 138 kB ...
Collecting idna<4,>=2.5
     |████████████████████████████████| 61 kB ...
Collecting certifi>=2017.4.17
  Downloading certifi-2021.10.8-py2.py3-none-any.whl (149 kB)
     |████████████████████████████████| 149 kB 6.4 MB/s
Collecting charset-normalizer~=2.0.0
  Downloading charset_normalizer-2.0.12-py3-none-any.whl (39 kB)
Installing collected packages: urllib3, idna, charset-normalizer, certifi, requests
Successfully installed certifi-2021.10.8 charset-normalizer-2.0.12 idna-3.3 requests-2.27.1 urllib3-1.26.8f

pip upgrade 오류

Python 코드 작성과 직접 관계가 있는 것은 아니지만 Windows 환경에서 pip 버전을 업그레이드 하라는 메시지가 나타나서 아래와 같이 업그레이드를 하려고 할 때 오류 메시지가 발생하는 경우가 있습니다.

D:\python> pip install --upgrade pip

이럴 때는 Command Prompt를 관리자 권한으로 실행하시면 해결 됩니다.

참고 URL

https://api.ncloud-docs.com/docs/ko/home/

Tags: api python