• [NCP(Naver Cloud Platform)] - API 통신

    2024. 8. 6.

    by. Daramu

    NCP에는 API통신을 통한 기능을 제공한다.

    단순 UI나 콘솔상에서 가능한 것보다 많은 것을 지원하는데, 해당하는 항목에 대해서는 아래를 참고

    https://api-gov.ncloud-docs.com/docs/api-overview

     

    API 개요

     

    api-gov.ncloud-docs.com

     

    아무튼 API를 잘 활용한다면 콘솔 그 이상의 것도 가능하다.

    가령 CDB의 경우 백업을 주기적으로 실행 가능하고, OBJ또한 다른 리전으로 주기적 복제가 가능하지만 CDB -> OBJ는 주기적으로 불가능하다.

     

    이럴떄 Bastion 서버등에 CDB->OBJ API를 주기적(cron)으로 등록해 놓는다면 자동으로 OBJ 백업이 되는 효과등을 누릴 수 있다.

     

    하지만 쉽게는 불가능하고, API 가이드에 나와있지만 이해가 안가는 부분도 존재하다.

    그에 대부분의 Linux의 기본으로 설치되는 Python으로 API 기본 코드를 공유한다.

    import sys
    import os
    import hashlib
    import hmac
    import base64
    import requests
    import time
    import json
    
    # API server information
    api_server = "https://cw.apigw.gov-ntruss.com"
    api_uri = "/cw_server/real/api/plugin/process/add"
    
    # Ncloud API Key settings
    ncloud_accesskey = ""
    ncloud_secretkey = ""
    
    # Unix timestamp setting
    timestamp = int(time.time() * 1000)
    timestamp = str(timestamp)
    
    def make_signature():
        access_key = ncloud_accesskey  # Replace with your actual access key
        secret_key = ncloud_secretkey
        secret_key = bytes(secret_key, 'UTF-8')
    
        method = "POST"
        uri = api_uri
    
        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
    
    # HTTP headers
    http_header = {
        'x-ncp-apigw-timestamp': timestamp,
        'x-ncp-iam-access-key': ncloud_accesskey,
        'x-ncp-apigw-signature-v2': make_signature(),
        'Content-Type': 'application/json',
        'x-ncp-dmn_cd': 'GOV',
        'x-ncp-region_code': 'KR'
    }
    
    # Payload
    payload = {
        "configList": ["*nginx*"],
        "instanceNo": "",
        "type": "VPCServer"
    }
    
    # API call
    try:
        response = requests.post(api_server + api_uri, headers=http_header, data=json.dumps(payload))
        response.raise_for_status()  # Raise exception for HTTP errors
        print(response.text)
    except requests.exceptions.RequestException as e:
        print("HTTP 요청 오류:", e)

     

    위의 예시는 post이며, API는 api_url 과 같다.

    여기서 사용자의 입맞에 맞는 API로 변경하면 되는데 변경법은 아래와 같다.

     

    1. 사용할 API를 확인한다.

    2. 해당 API의 url 주소를 확인한다.

     

    예를 들어 clusters(클러스터 생성) API 사용한다고 가정한다.

    https://api-gov.ncloud-docs.com/docs/nks-createcluster

     

    위의 링크에서 "개요"로 접속하여 API URL 공통 설정과 요청 헤더를 확인한다.

    확인하였다면 이제는 API를 확인한다.

    친절하게 예시까지 잘 나와있다.

    얻을 수 있는 정보는 요청 헤더값과 API 요청형식(get)이다.

     

    이제 위의 API 스크립트를 수정하면 된다.

     

    #api_server = "https://cw.apigw.gov-ntruss.com"
    #api_uri = "/cw_server/real/api/plugin/process/add"
    
    #API 공식 홈페이지를 참고하여 수정
    api_server = "https://nks.apigw.gov-ntruss.com/vnks/v2"
    api_uri = "/clusters"

     

    이렇게 수정하고, API 형식도 필요하다면 수정한다.

    예시와 동일한 post이기에 건들일 필요 없지만, 만약 get이거나 Body값이 필요 없다면 아래처럼 수정한다.

    #response = requests.post(api_server + api_uri, headers=http_header, data=json.dumps(payload))
    #    response.raise_for_status()  # Raise exception for HTTP errors
    #    print(response.text)
    #except requests.exceptions.RequestException as e:
    #    print("HTTP 요청 오류:", e)
    
    #Body 값이 필요없으니 삭제, get요청이니 post에서 get으로 변경
    response = requests.get(api_server + api_uri, headers=http_header)
        response.raise_for_status()  # Raise exception for HTTP errors
        print(response.text)
    except requests.exceptions.RequestException as e:
        print("HTTP 요청 오류:", e)

     

    하지만 clusters에서는 필요하니 그대로 두고, Body 값만 수정하면 끝!

    # Payload
    #payload = {
    #    "configList": ["*nginx*"],
    #    "instanceNo": "",
    #    "type": "VPCServer"
    #}
    
    
    # Payload
    payload = {
        "name": "ㄴㅁㄷㅀㅁㄶㄴㅁㅎ",
      "clusterType": "ㅋㅋㅋ",
      "k8sVersion": "1.27.?",
      "loginKeyName": "String",
      "hypervisorCode": "String",
      "regionCode": "String",
      "zoneCode": "String",
      "zoneNo": "Integer",
      "publicNetwork": "Boolean",
      "kubeNetworkPlugin": "String",
      "vpcNo": "Integer",
      "subnetNoList": [
        "Integer"
      ],
      "subnetLbNo": "Integer",
      "lbPrivateSubnetNo": "Integer",
      "lbPublicSubnetNo": "Integer",
      "log": {
        "audit": "Boolean"
      },
      "nodePool": [
        {
          "name": "String",
          "nodeCount": "Integer",
          "subnetNo": "Integer",
          "subnetNoList": [
            "Integer"
          ],
          "softwareCode": "String",
          "productCode": "String",
          "labels": [
            {
              "key": "String",
              "value": "String"
            }
          ],
          "taints": [
            {
              "key": "String",
              "value": "String",
              "effect": "String"
            }
          ],
          "serverSpecCode": "String",
          "storageSize": "Integer",
          "serverRoleId": "String"
        }
      ]
    }

    마지막으로 헤더값을 추가하면 끝.

     

    직접 적기에는 너무 많지만.... 어떻게 했는지는 감을 잡았을거라 생각한다.

     

    이처럼 NCP API를 작동시키면 된다.

    댓글