본문 바로가기
NCloud(NCP)

NCP API를 사용하는 방법(with. SENS)

by 간식주인 2022. 8. 26.

일반적으로 NCP 콘솔에서 생성 후 바로 사용하는 서비스들과 달리 AI.Application Service 카테고리에 속해 있는 서비스들은 생성 후 API를 통해 사용할 수 있습니다.

예를들어 Simple & Easy Notification Service라는 이름의 문자 발송 서비스를 이용한다면 콘솔에서 문자 발송을 제어할 수 있지만, 코딩을 통해서도 문자 발송을 할 수 있습니다.(ex)2차 인증, 알람등)

 

요건

- NCP에서 제공하는 API를 이용하여 문자 발송 서비스인 SENS를 사용하여 핸드폰으로 메시지를 발송하기 

 

환경

  • NCP Simple & Easy Notification Service
  • 개인 핸드폰(?)

Process

  1. NCP에서 API를 사용하는 서비스
  2. NCP Simple & Easy Notification Service 구축 및 메시지 발송

주의 사항

- API 서비스 사용되는 Access Key와 Secret Key의 취급을 주의하시기 바랍니다.(만약 해당 정보를 탈취 당할 경우 과도하게 인프라 자원들을 생성하여 과금 폭탄을 맞을 수 있습니다.)

 

==================================================================================

1. NCP에서 API를 사용하는 서비스

NCP의 AI.Application Service 카테고리에서 다양한 서비스들을 사용할 수 있었는데, 한 가지 특이한 점은 해당 서비스를 사용하기 위해서는 서비스를 생성 후 *API를 통해 사용할 수 있다는 점이었습니다.

(물론 해당 카테고리 외에도 SENS와 같이 API를 사용하여 제어할 수 있는 서비스들이 있습니다.)

 
 
AI . Naver API 서비스 이미지

이번 글에서는 개발에 조금 생소하신 엔지니어 분들도 API를 이용하여 서비스를 제어할 수 있도록 가이드를 드릴 예정입니다.

 

*Application Programming Interface(API) : 특정 서버 혹은 서비스에서 제공하는 기능을 쉽게 사용하기 위한 것

 

 

2. NCP Simple & Easy Notification Service 구축 및 메시지 발송

API를 사용하는 서비스들 중 NCP의 *SENS 서비스 구축을 진행해보도록 하겠습니다.

(*Simple & Easy Notification Service, 문자 발송 서비스)

 

SENS 서비스의 경우 NCP 콘솔에서 Application Services > Project로 이동한 후, 서비스를 신청하고 "프로젝트 생성"을 클릭합니다.

  • 문자만 발송할 예정이므로 서비스 Type은 SMS으로 지정합니다.

 

프로젝트를 생성했다면 웹 포탈에서 SMS 메시지를 발송하는 것이 가능합니다.

  • 문자 발송을 위해서는 발신번호를 등록해야 하며 개인 소유 번호와 계정 생성 시 인증한 번호가 동일해야 합니다.
  • 사업자의 경우 별도의 서류 심사를 통해 회사 번호를 등록할 수 있습니다.

 

이번에는 포탈에서 SMS 문자 메시지를 발송하지 않고 API를 통해 발송할 예정이므로 NCP SENS API 공식 문서를 통해 아래와 같은 내용을 확인합니다.

https://api.ncloud-docs.com/docs/ai-application-service-sens-smsv2

 

API 공식 문서에서는 API를 사용하기 위한 공통적인 헤더를 확인할 수 있고 실제로 호출할 API URL을 확인할 수 있습니다.

SESN 서비스에 대해 Curl 명령어로 호출할 경우 다음과 같은 형태가 됩니다.

curl -X POST "https://sens.apigw.ntruss.com/sms/v2/services/{serviceId}/messages"

 

위의 명령어에 NCP SMS API 가이드에서 확인한 API Header를 추가하게 되면 아래와 같은 형태가 됩니다.

curl -X POST "https://sens.apigw.ntruss.com/sms/v2/services/{serviceId}/messages" -H "x-ncp-apigw-timestamp: {Timestamp}" -H "x-ncp-iam-access-key: {Sub Account Access Key}" -H "x-ncp-apigw-signature-v2: {API Gateway Signature}" -H "Content-Type: application/json; charset=utf-8"

 

이제 해당 명령어를 사용하기 위해 필요한 헤더 값인 Timestamp, Sub Account Access Key, API Gateway Signature, Service ID를 채워야 합니다.

먼저 Service ID의 경우 해당 서비스가 가진 아이디로 Project 생성 시 서비스 ID 컬럼을 클릭하면 확인할 수 있습니다.

  • NCP의 Resource Manager를 통해서도 Service ID 확인이 가능합니다.

 Access Key의 경우 NCP 포탈(www.ncloud.com)에 메인 계정으로 인증키를 생성하면 확인할 수 있습니다.

  • 메인 계정 로그인 후 마이페이지 > 인증키 관리로 이동합니다.
  • 신규 API 인증키 생성을 클릭하면 Access Key ID와 Secret Key를 확인할 수 있습니다.

Timestamp는 https://www.unixtimestamp.com/ 해당 홈페이지에서 확인할 수 있으며, time 메서드를 이용해서도 확인할 수 있습니다.

  • 한 가지 주의할 점은 API를 사용하는 시점이 Timestamp 정보값과 5분 이상 차이나면 안됩니다.

https://www.unixtimestamp.com/

 

API Gateway Signature는 특정 API를 사용할 때 body를 Access Key Id와 맵핑되는 Secret Key로 암호화한 서명(HMAC 암호화 알고리즘은 HmacSHA256 사용)으로 Access key와 함께 확인할 수 있는 Secret Key를 별도의 작업을 거쳐 사용해야 합니다.

필요한 Header 값들을 모두 확인한 결과 Curl 명령어로 바로 사용하기에는 API Gateway Signature 값을 필요로 하므로, 별도의 코드 작성을 통해 API를 호출해야 합니다.

NCP API를 사용하기 위해 이번에는 python 코드로 작성을 진행해보았습니다.

  1. Visual studio Code와 같은 에디터 툴을 이용하여 코드를 작성할 폴더를 생성합니다.

 

2. main.py를 작성하여 Header 값으로 전달할 Access Key, Secret Key, Timestamp 값을 입력 후 실질적으로 api를 호출할 메서드에 전달 합니다.

main.py

import requests
import json
import time
from sesn_api import sensapi

accesskey = "발급 받은 Access Key"
secretkey = "발급 받은 Secret Key"
timestamp = str(int(time.time() * 1000))

sensapi(accesskey,secretkey,timestamp)

3. 다음으로는 main에서 전달받은 매개변수를 통해 SENS API를 호출할 코드를 작성합니다.

sens_api.py

import hashlib
import hmac
import base64
import requests
import json

def sensapi(accesskey,secret_key,timestamp):
    method = "POST"
    host = "https://sens.apigw.ntruss.com"
    uri = "/sms/v2/services/"
    serviceId = "SENS Project에서 확인한 Service ID"
    uri2 = "/messages"
    url = host + uri + serviceId + uri2
    #시그니쳐 키 생성
    secret_key = bytes(secret_key, 'UTF-8')
    message = method + " " + uri + serviceId + uri2 + "\n" + timestamp + "\n" + accesskey
    message = bytes(message, 'UTF-8')
    sigkey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())

    headers = {
        'Content-Type': 'application/json', 
        'charset': 'UTF-8', 
        'Accept': '*/*',
        
        'x-ncp-apigw-timestamp': timestamp,
        'x-ncp-iam-access-key': accesskey, 
        'x-ncp-apigw-signature-v2': sigkey 
    }
    
    body = {
        "type" :"SMS",
        "contentType" : "COMM",
        "from" : "SENS에 등록한 발신번호",
        "subject" : "subject",
        "content" : "안녕하세요\n반갑습니다.",
        "messages" : [
            {
                "to" : "메시지를 받을 상대방 전화번호"
            }
        ]
    }
    body2 = json.dumps(body)

    response = requests.post(url, headers=headers, data=body2)
    response.request
    response.status_code
    response.raise_for_status()
 
요청 header 및 body에 대한 자세한 정보는 아래 링크를 통해 확인할 수 있습니다.
  • SMS API — SENS (ncloud-docs.com)
  • body 부분에는 더 다양한 옵션이 있지만 이번에는 문자 발송을 위해 필요한 값들을 넣어서 진행하였습니다.

 

4. 로컬에서 python3 main.py와 같은 명령어로 작성한 파이썬 파일을 실행시키게되면 등록한 핸드폰 번호로 작성한 문자 메세지가 발송된 것을 확인할 수 있습니다.

 

[여담]

저도 개발과 연고가 없는 엔지니어로 혼자 독학하면서 수많은 에러를 낸 끝에 겨우 NCP API에 대해서 이해할 수 있게 된 것 같습니다. 

처음은 어려울 수 있지만 한 번, 두 번 하시다보면 감을 잡으실 것 같습니다.

 

현재 SENS 문자 발송의 경우 월 50건까지 무료로 지원하니 해당 게시글을 보고 테스트 해보시면 좋을 것 같습니다.

이후에는 더 다양한 서비스들을 API로 제어하는 방법에 대해 소개드리도록 하겠습니다.

 

 

참고

https://api.ncloud-docs.com/docs/ai-application-service-sens-smsv2

 

SMS API

 

api.ncloud-docs.com

 www.ncloud.com

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

https://www.unixtimestamp.com/ 

 

Unix Time Stamp - Epoch Converter

Epoch and unix timestamp converter for developers. Date and time function syntax reference for various programming languages.

www.unixtimestamp.com