Naver Cloud Platform

NCP 네이버 클라우드 - Cloud Function, SENS, API, 파이썬을 이용하여 이번 달 사용 요금 조회하여 내 핸드폰으로 사용 요금 메세지 받기

앙뚱이 2023. 4. 17. 17:00

안녕하세요.   ----- 4월 24일 코드 잘못돼있어서 수정함 - 3월만 조회 -> 당월 조회로 변경함.

 

매일 특정 시간에 이번 달 1일부터 현재까지 요금을 확인할 수 있는 시나리오를 공유하려 합니다.

 

Cloud를 사용하다보면 종종 요금 체크를 안해서 감당할 수 없는 과금 사고가 벌어지곤 하죠

최근에 건너건너 들은 소식으로는 뭐 테스트 목적으로 서버 만들었다가 수천만원 나온 사례도 있고 또 취준생이 학습 목적으로 테스트하다가 수백만원 나오기도 하죠.

그래서 자동으로 매일 하루 한번 일정한 시간에 사용 요금을 체크하여 자기 핸드폰으로 메세지 받을 수 있는 방법을 공유하려 합니다.

일단 비용 조회를 위해 제목에서 나열한 서비스들을 이용하면 돈이 많이 드는거 아닌가 생각 드시는 분들을 위해 바로 말씀드려요  예상 비용 알려드립니당 

 

제 시나리오 대로라면 무려 무료입니다!!!!! Free~

Cloud Function은 서버리스 컴퓨팅이라고 하여 특정 트리거에 따라 코드를 실행하는 서비스이구여

SENS도 sms 보내는 SAAS서비스인데 얘도 뭐.. 서버가 따로 필요하지 않습니다. 

과금 형식은 둘다 요청 건수에 따라 과금이 되는데 요금표를 보여드리면..

 

---SENS 요금표----

한달에  SMS 30건에서 40건 쓰겠죠 

 

 

---Cloud Function 요금표----

백만개 이후부터 과금됩니다.

 

--전체 시나리오--

1. Cloud Function 서비스 시작

2. SENS 서비스 시작

3. Cloud Function에 요금 조회 파이썬 코드 + SMS로 요금 보내기 코드 등록

4. function 트리거로 크론 선택 후 매일 아침 9시정도로 설정

 

매일 특정 시간에 이번 달 1일부터 현재까지 요금을 확인할 수 있는 시나리오입니다.

 

일단 등록할 코드는 아래와 같습니다.

접근키나 시크릿키 그리고 센스 생성후 서비스 아이디를 각자 Config에 맞게 넣어주도록 합시다.

코드는 주석으로 설명드릴게요

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

### 헤더값에 넣을 인증값 생성할때 필요한 Config
timestamp=int(time.time() * 1000)
timestamp=str(timestamp)
access_key = "엑세스키"				# access key id (from portal or Sub Account)
secret_key = "시크릿키"				# secret key (from portal or Sub Account)

## 현재 연,월 조회 및 uri에 넣을 값 생성
now = datetime.datetime.now()
year = now.year
month = now.month
check=str(year)+"0"+str(month)


### API 가이드에 나오는 API URL 
url="https://billingapi.apigw.ntruss.com"
uri="/billing/v1/cost/getDemandCostList?startMonth="+check+"&endMonth="+check+"&responseFormatType=json"


### 비용 요청할 때 헤더값에 넣을 인증값 생성하는 함수
def	make_signature(access_key,secret_key,timestamp,uri):
    a=access_key
    s=secret_key
    t=timestamp
    u=uri
    
    s = bytes(s, 'UTF-8')
    method = "GET"
    message = method + " " + u + "\n" + t + "\n" + a
    message = bytes(message, 'UTF-8')
    signingKey = base64.b64encode(hmac.new(s, message, digestmod=hashlib.sha256).digest())
    return signingKey

### sms 전송 요청할 때 헤더값에 넣을 인증값 생성하는 함수
def	post_make_signature(access_key,secret_key,timestamp,uri):
    a=access_key
    s=secret_key
    t=timestamp
    u=uri
    
    s = bytes(s, 'UTF-8')
    method = "POST"
    message = method + " " + u + "\n" + t + "\n" + a
    message = bytes(message, 'UTF-8')
    signingKey = base64.b64encode(hmac.new(s, message, digestmod=hashlib.sha256).digest())
    return signingKey


## 인증값 만들고 헤더값에 넣어주기
signingkey=make_signature(access_key,secret_key,timestamp,uri)
header={
"Content-Type": "application/json; charset=utf-8",
"x-ncp-apigw-timestamp": timestamp, 
"x-ncp-iam-access-key": access_key,
"x-ncp-apigw-signature-v2": signingkey
}

### 비용 요청
res=requests.get(url+uri,headers=header)
res=json.loads(res.text)
TotalCost=[]

### json 파싱 후 월 토탈 비용값 저장 TotalCost 변수에다가
for i in res['getDemandCostListResponse']['demandCostList']:
    TotalCost.append(i['totalDemandAmount'])
TotalCost=list(map(int,TotalCost))
TotalCost=sum(TotalCost)



##----------------------------------##


## 여기는 이제 저 TotalCost(월 이용비)를 메세지로 전달하는 코드에요 
## 아 이 부분은 뺴도 되곘네요 어차피 엑세스키랑 시크릿 키는 같으니까요.
access_key = ""				# access key id (from portal or Sub Account)
secret_key = ""				# secret key (from portal or Sub Account)

## sms API URL 전송 URL이에요 센스를 생성하고 sms 프로젝트를 생성하면 서비스 아이디가 생기는데 그 아이디를 넣는겁니다.
url="https://sens.apigw.ntruss.com"
uri="/sms/v2/services/서비스 아이디/messages"

## 인증값 생성하기 및 헤더에 필요정보 넣기.
signingkey=post_make_signature(access_key,secret_key,timestamp,uri)
header = {
"Content-Type": "application/json; charset=utf-8",
"x-ncp-apigw-timestamp": timestamp, 
"x-ncp-iam-access-key": access_key,
"x-ncp-apigw-signature-v2": signingkey
}

## data값에 수신/발신 번호 넣어줍니다. content(메세지내용)도요 
data = {
	"type":"SMS",
    "from":"본인 명의 핸드폰 번호",
    "content":str(TotalCost)+"원",
	"subject":"SENS",
    "messages":[
        {
            "to":"핸드폰 번호",
        }
    ]
}

## 요청~~~
res = requests.post(url+uri,headers=header,data=json.dumps(data))

## 이 부분은 결과값 확인 차 만든건데 지우셔도 됩니다.
datas=json.loads(res.text)

 

1. Cloud Function 서비스 시작 

 

1) 왼쪽 상단에서 Package 생성을 누릅니다 -> 그러면 왼쪽 탭에서 패키지를 확인할 수 있고 패키지를 누르고 Action 생성을 누릅니다.

 

2) 액션에서 트리거를 생성합니다.

- 트리거는 크론 형태로 일정한 시간의 반복 작업을 수행할 수 있습니다.

하루에 한번 10시에 실행할 수 있도록 크론을 설정하였습니다.

 

3) 그리고 액션을 설정할건데 이름과 패키지를 선택합니다. 그리고 알맞은 언어를 선택하여 파이썬 코드를 넣어주도록 합니다.

아 근데 아직 SENS 서비스를 생성을 안해서 코드에 넣어야할 Service ID를 확인할 수 없네요. SENS 서비스 생성은 제 다른 게시물에서 확인할 수 있습니다. 

2022.09.01 - [분류 전체보기] - NCP API 활용 - Sens로 메세지 보내기(Python) - 파이썬 초보 #1

 

NCP API 활용 - Sens로 메세지 보내기(Python) - 파이썬 초보 #1

파이썬도 처음.. 자바는 학부생 시절에 좀 만져봤지만 졸업하고 7-8년 거의 안만져봤네요. 여튼간 그랬지만 요즘 흥미가 붙어서 이것 저것 만들어 보구 있네여 파이썬으로 소스를 짜기 전에 일단

angddoong.tistory.com

!!!#### 주의점 : Cloud Function을 사용하려면 VPC와 서브넷이 외부 통신이 되는 걸 선택해야 한다네요 참. ㅋㅋ NAT GateWay 설정하셔야돼요

 

4) 각자 Config에 맞게 설정을 완료하고 저는 테스트를 위해 크론으로 1분마다 코드를 실행하도록 설정하였습니다.

잘 되네요

 

이상  Cloud Function의 Cron 기능과 SENS를 이용하여 매일 특정 시간에 월 총 비용 조회하여 메세지로 금액을 내 핸드폰으로 받아보는  시나리오였습니다.