안녕하세요.
클라우드를 사용하다 보면 청구서를 확인하지 않아 감당할 수 없는 청구 사고가 자주 발생합니다.
최근 뉴스를 통해 테스트용으로 서버를 만들어서 몇만원씩 나오는 경우도 있고, 학습용으로 테스트를 하다가 구직자가 수백만원씩 나오는 경우도 있다고 들었습니다.
그래서 매일 정해진 시간에 자동으로 이용요금을 확인하고 휴대폰으로 문자를 받을 수 있는 방법을 공유하고자 합니다.
Cloud Functions와 SENS를 사용하면 요금이 얼마인지 궁금하신 분들이 계실 것 같아서 대략적인 비용을 알려드리겠습니다.
완전 무료입니다!!!!! 무료~
Cloud Function은 서버리스 컴퓨팅이라는 특정 트리거에 따라 코드를 실행하는 서비스입니다.
SENS도 SMS를 보내는 SAAS 서비스이지만 별도의 서버가 필요하지 않습니다.
두 청구 유형 모두 요청 수에 따라 청구됩니다. 요금표를 보여주면…
—SENS 수수료 목록—-
매월 30~40개의 SMS

—클라우드 기능 가격표—-
100만 이후에 청구됩니다.

–전체 시나리오–
1. Cloud Function 서비스 시작
2. SENS 서비스 시작
3. Cloud Function에 과금조회 Python 코드 + SMS 과금코드 등록
4. cron을 함수 트리거로 선택한 후 매일 아침 9시경으로 설정
매일 특정 시간에 이달 1일부터 현재까지의 요금을 확인할 수 있는 시나리오입니다.
한번 등록하는 코드는 다음과 같습니다.
access key, secret key, sense를 생성한 후 각각의 Config에 따라 서비스 ID를 삽입해 봅시다.
코드는 주석으로 설명하겠습니다.
import sys
import os
import hashlib
import hmac
import base64
import requests
import time
import json
### 헤더값에 넣을 인증값 생성할때 필요한 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)
### API 가이드에 나오는 API URL
url="https://billingapi.apigw.ntruss.com"
uri="/billing/v1/cost/getDemandCostList?startMonth=202303&endMonth=202303&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) 왼쪽 상단의 Create Package 클릭 -> 좌측 탭에서 패키지를 확인할 수 있으며, Package 클릭 후 Create Action 클릭.

2) 작업에서 트리거를 만듭니다.
– 트리거는 크론 형태로 일정 시간 동안 반복적인 작업을 수행할 수 있습니다.
하루에 한 번 10시에 cron이 실행되도록 설정했습니다.

3) 그리고 액션을 설정할 것이므로 이름과 패키지를 선택합니다. 그런 다음 적절한 언어를 선택하고 Python 코드를 삽입합니다.
아, 그런데 아직 SENS 서비스를 생성하지 않아서 코드에 넣어야 하는 Service ID를 확인할 수가 없네요. SENS 서비스 생성은 제 다른 글에서 확인하실 수 있습니다.
2022.09.01 – (전체 카테고리 보기) – NCP API 활용 – Sens에 메시지 보내기(Python) – Python Beginner #1
NCP API 활용 – Sens에 메시지 보내기(Python) – Python 초보자 #1
파이썬도 새롭네요.. 학부시절 자바를 조금 만졌는데 졸업하고 7~8년동안 손을 안댔습니다. 암튼 그랬는데 최근에 관심이 생겨서 이것저것 만들고 있어요.
angddoong.tistory.com
!!!#### 참고: Cloud Function을 사용하려면 외부 통신을 위한 VPC와 서브넷을 선택해야 합니다. NAT GatewayWay를 설정해야 합니다.

4) 각 Config에 따라 설정을 완료한 후 테스트를 위해 cron으로 1분마다 실행되도록 코드를 설정합니다.

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