일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 3D프린터 입문
- 3D프린터
- docker container
- NAS HDD교체
- docker
- linux job
- 3D 프린터 용어
- git
- 3d프린터 초보
- C언어
- 3D
- 3D프린터입문
- 데이터 직렬화 포맷
- 네이버클라우드
- octoprint
- 코틀린개발환경
- 리눅스 파일동기화
- Jenkins
- OnlineIDE
- IoTNetwork
- ci/cd
- 3D모델링
- kubernetes
- github
- data serialization formats
- Token인증방식
- nas
- gitlab
- Kotlin
- Notification
- Today
- Total
0과 1을 공부하다.
[Cloud] 문자(sms) 매크로 만들기 - Cloud Functions(Naver Cloud) 본문
이전 포스팅에서는 네이버 클라우드의 Simple & Easy Notification Service를 이용하여 문자메세지를 보내는 방법에 대해 알아보았다. 앞선 포스팅을 통해서 원하는 문자 메세지를 자동으로 실행하는 코드를 작성하였는데 해당 코드를 매일 정해진 시간에 실행하여 발송하기 위해서는 특정 시간 또는 24시간 가동중인 서버가 필요하다. 하지만 앞선 코드를 실행하기 위해서 지속적으로 서버를 가동하는 행위는 서버 가격 및 전기세 측면에서 매우 비효율적이다. 또한 해당 서버의 가용성을 보장하기 위해 주기적인 관리가 필요하므로 시간적인 손해도 증가하게 된다.
해당 단점을 보완하기 위해서는 클라우드의 Serverless 개념을 이용하면 된다. serverless의 개념은 말 그대로 서버가 없다는 뜻인데 사실 서버가 없는 개념은 아니다. 클라우드 프로바이더가 갖고 있는 서버 컴퓨팅 자원에 사용자는 원하는 소스코드(Function)을 등록하여 실행하면 실행 결과를 주게 되고 사용자는 프로바이더에게 소스코드를 실행한 단위만큼만 지불하는 방식(on demand)으로 이뤄지게 된다. 실제로 서버는 존재하지만 사용자는 본인이 소유하여 운용하는 개념이 아니기 때문에 이와 같은 방식을 serverless 개념으로 불린다. 이와 같이 클라우드 프로바이드가 제공하는 서비스를 FaaS(Function as a Service)으로 불린다. 아주 대표적으로 AWS의 Lambda가 있으며, 현재 사용하고 있는 네이버 클라우드에서는 FaaS 서비스로 Cloud Functions가 있다.
서비스 소개
서비스 기능으로는 아래 사진과 같이 Action, Package, Web-Action, Trigger 그리고 Dashboard 가 있다.
각 기능에 대한 설명은 아래와 같다.
- DashBoard : Cloud Fuction의 상태, 기간별 실행, 월간 사용량, 실행 비율, 기간별 액션 실행 결과를 직관적이며 가시적으로 확인하는 기능.
- Action : 실질적으로 실행되는 코드, 런타임 정보 등을 생성 및 설정할 수 있다. 현재 사용 가능한 언어는 dotnet, go, java, nodejs, php, python, swift가 있다.
- Package : Package는 여러 Action을 관리하는 단위로, 공통적으로 사용되는 파라미터가 있다면 하나의 패키지로 묶어 관리하는 방법으로 사용한다.
- Web-Action : 웹 서비스를 제공할 수 있는 Cloud Functions의 액션이다. 간단한 코드 작성만으로도 http, html, svg, json, text 등 형식의 웹 페이지나 데이터 등을 인터넷에 공개할 수 있다.
- Trigger : Trigger는 의미적으로 '방아쇠'라는 의미로 어느 특정한 동작에 반응해 자동으로 필요한 동작을 실행하는 것을 의미한다. Trigger의 종류로는 Basic, Cron, GitHub 이벤트, Cloud Insight, Object Storage, Cloud IoT Core가 존재하며, 예시로 Cron 트리거를 사용하게 될 경우 연결된 Action은 Cron에 설정한 시간에 맞춰서 코드가 동작하고
Cloud Insight 트리거를 사용하게 되면 Cloud Insight의 Event Rule 알림에 맞춰서 트리거가 동작하게 된다.
Cloud Functions 서비스는 On-Demand 형태로 과금된다.
금액은 실행요청이 1,000,000이하이고 실행 소요시간이 400,000(GB/s)이하이면 무료이고 실행요청이 1,000,000 초과하고 실행 소요시간이 400,000(GB/s)초과하면 요청은 건당 200원, 초당 0.017원의 과금이 부과된다.
기능 소개 및 코드(Python) 적용
앞서 Cloud Functions 서비스에 대해 알아보았다. 이제 앞선 글에서 작성한 python 코드를 적용하기 위해 각 기능에 대해 알아본다. 콘솔에서 Cloud Functions을 사용하는 절차는 Action 및 Package 생성 -> Trigger 생성 -> Action & Trigger 연결 -> 실행 및 결과 확인 절차로 수행한다.
가. Dashboard
Cloud Fuction의 상태, 기간별 실행, 월간 사용량, 실행 비율, 기간별 액션 실행 결과를 직관적이며 가시적으로 확인할 수 있다. 과도한 과금을 받지 않으려면 주기적인 모니터링이 필요하다.
나. Action / Package
Action 메뉴에는 Package와 Action이 있다. Package 파트와 Action 파트를 나눠서 알아보고 각각 생성한다.
(1) Package
Package는 여러 Action을 관리하는 단위로, 공통적으로 사용되는 파라미터가 있다면 하나의 패키지로 묶어 관리하는 방법으로 사용한다. 실행 액션이 단일이거나 액션을 공통적으로 관리할 필요가 없다면 Package로 생성할 필요는 없다.
- 패키지 이름: 패키지의 이름을 기입한다.
- 패키지 설명: 패키지에 대한 설명을 기입한다. (생략가능)
- 디폴트 파라미터: 액션에서 공통으로 필요한 디폴트 파라미터를 JSON 형태로 전달한다. (디폴트 파라미터 우선 순위: 트리거 > 액션 > 패키지)
(2) Action
Action은 실질적으로 실행되는 코드, 런타임 정보 등을 생성 및 설정할 수 있다.
사용 가능한 트리거의 목록은 Basic, cron, GitHub, Cloud insight, Cloud IoT Core, Object Storage 가 있다. 본 프로젝트에서는 cron을 사용할 예정이므로 cron 트리거를 선택한다. 각 트리거별 항목에 대한 설명은 아래 'Trigger'에서 다룬다. 트리거의 종류를 선택하고 생성한 트리거를 추가하고 '다음' 버튼을 눌러 진행한다.
기본 정보를 입력한다.
- 패키지: 생성한 패키지를 선택한다. (생략 가능)
- 타입: 기본은 하나의 액션을 실행하며, 시퀸스는 여러 액션을 연결하여 순차적으로 실행하는 타입이다.
- 이름: 액션 이름을 기입한다.
- 설명: 액션에 대한 설명을 기입한다. (생략가능)
다음은 소스코드를 추가한다.
이전 게시글에서 작성했던 코드를 적용하기 앞서 Python 코드를 Action에 적용하는 Convention은 아래 가이드 문서를 참고한다.
가이드 문서를 요약하자면
- main 함수는 프로그램의 시작점으로서 반드시 선언되어야 한다.
- 의존성 파일을 함께 zip파일로 패키징 하기 위해서는 함수에 접근하기 위한 entry point인 main 함수는 __main__.py 파일 안에 정의되어 있어야 한다.
- Cloud Functions에서 기본으로 제공되는 라이브러리 외의 추가 라이브러리를 사용하기 위해 virtual environment(virtualenv)를 사용하여 함께 패키징한다.
이전 게시글에서 예시로 작성하였던 코드를 적용하기 위해 Python 3.7 버전을 선택하고 아래와 같이 main 함수 안에 포함시켜 소스코드를 추가 한다. 코드에 대한 자세한 내용은 이전 게시글을 참고한다.
import json
import requests
import time
import base64
import hashlib
import hmac
def main(args):
# 1970년1월 1일 00:00:00 협정 세계시(UTC)부터의 경과 시간을 밀리초(Millisecond)로 나타낸 것
timestamp = str(int(time.time() * 1000))
phone_number = '수신 번호'
content = 'serverless test'
user_access_key = "사용자 access-key" # 사용자 access-key
user_secret_key = "사용자 secret_key" # 사용자 secret_key
user_secret_key = bytes(user_secret_key,'UTF-8')
sms_service_id = "sms 서비스 id" # sms 서비스 id
url = "/sms/v2/services/"+sms_service_id+"/messages" # 사용자 서명을 위한 URL
api_url = 'https://sens.apigw.ntruss.com/sms/v2/services/'+sms_service_id+'/messages' #requests를 위한 full URL
# HMAC 암호화 알고리즘은 HmacSHA256 사용
def make_signature(url,access_key):
method = "POST"
message = method + " " + url + "\n" + timestamp + "\n" + access_key
message = bytes(message,'UTF-8')
signingkey = base64.b64encode(hmac.new(user_secret_key,message, digestmod=hashlib.sha256).digest())
return signingkey
# 헤더 값
headers = {
'Content-Type': 'application/json; charset=utf-8',
'x-ncp-apigw-timestamp': timestamp,
'x-ncp-iam-access-key': user_access_key,
'x-ncp-apigw-signature-v2': make_signature(url,user_access_key)
}
# body(data) 값
body = {
"type" : "SMS",
"contentType" : "COMM",
"countryCode" : "82",
"from" : "발신 번호",
"content" : content,
"messages" : [
{
"to":phone_number,
}
]
}
body_result = json.dumps(body)
response = requests.post(api_url,headers=headers,data=body_result)
response.request
response.status_code
response.raise_for_status()
response_result = response.json()
send_result = response_result['statusCode']
# 발송 결과 출력
if send_result == "202":
return {"result":"Sending Success"}
else:
return {"result":"Sending Fail"}
옵션을 설정한다.
- Main 함수: main 함수의 이름을 기입한다.
- 액션 메모리: 실행에 필요한 메모리를 선택한다. 128MB, 256MB, 512MB 단위로 선택가능하다.
- 액션 Timeout: 액션의 실행 가능한 시간을 설정한다. 500 ~ 300000 사이 정수값으로 ms 단위로 입력한다.
- 웹 액션 설정: 별도의 사용자 인증 없이 호출 가능한 URL을 제공하는 웹 액션을 만들 수 있다. 웹 액션은 다양한 REST API 형태의 요청(GET, POST, PUT, DELETE 등)을 모두 지원한다.
현재 액션에서 필요한 디폴트 파라미터를 JSON 형태로 전달한다. (디폴트 파라미터 우선 순위: 트리거 > 액션 > 패키지)
다. Trigger
Trigger는 의미적으로 '방아쇠'라는 의미로 어느 특정한 동작에 반응해 자동으로 필요한 동작을 실행하는 것을 의미한다. Trigger의 종류로는 Basic, cron, GitHub, Cloud insight, Cloud IoT Core, Object Storage 가 있다.
각 Trigger에 대한 간략한 설명은 아래와 같다.
- Basic : Basci 타입 트리거는 생성된 외부 연결 주소를 호출하여 실행하는 기능을 제공함.
- Cron : Cron 타입 트리거는 특정 액션을 일정 주기로 실행하는 기능을 제공합니다. 이러한 특성으로 Cron 타입 트리거는 모니터링과 같이 주기적으로 예약된 작업을 실행하는 데에 유용하며, Jenkins와 같은 CI tool의 짧은 Batch 작업을 대체할 수 있음.
- GitHub : GitHub 이벤트 트리거는 사용자의 코드 관리와 배포, 이슈 처리를 위해 Github에서 지원하는 이벤트를 트리거로 사용할 수 있는 기능을 제공.
- Cloud insight : Cloud Insight는 네이버 클라우드 플랫폼이 제공하는 서비스의 성능 지표를 통합 관리하고, 장애 발생 시 담당자에게 장애 정보를 신속히 전달할 수 있는 모니터링 서비스.
- Cloud IoT Core : Cloud IoT Core는 디바이스로부터 생성된 수많은 데이터를 편리하고 안전하게 수집하고 실시간으로 처리할 수 있는 네이버 클라우드 플랫폼의 서비스.
- Object Storage : Object Storage는 사용자가 언제 어디서나 원하는 데이터를 저장하고 탐색할 수 있도록 파일 저장 공간을 제공하는 네이버 클라우드 플랫폼의 서비스.
'Trigger' 생성을 눌러 생성을 진행한다.
- 트리거 종류 : 현 프로젝트에서는 시간에 따른 주기로 Action에 기입한 코드를 실행할 예정이므로 Cron을 선택한다.
- 이름 : 트리거의 이름을 지정한다.
- 설명 : 트리거의 설명을 입력한다. (생략가능)
- 디폴트 파리미터 (JSON) : 트리거에서 공통으로 필요한 디폴트 파라미터를 JSON 형태로 전달한다. (디폴트 파라미터 우선 순위: 트리거 > 액션 > 패키지)
- Cron 정보 설정 : 트리거를 실행 시킬 주기를 입력한다.
자세한 내용은 아래 가이드를 참고한다.
테스트
이제 적용한 코드가 정상적으로 작동하는지 테스트를 진행한다. 테스트를 위해 Trigger cron의 실행 시간을 1분마다 실행하도록 변경한다.
이후 아래 사진과 같이 정상적으로 1분단위로 메세지가 발송됨을 확인할 수 있다.
로그 기록을 확인하기 위해 Action - 모니터링 으로 이동한다. 현황을 보면 6건은 정상적으로 실행되었고 1건은 실패하였다. (초기 키 값을 잘못 삽입하였음.)
수행한 각 ID를 '자세히 보기'를 통해 확인하면 결과에 메인함수에서 리턴 했던 값을 볼 수 있다. 로그에는 표준 출력 내용을 보여준다. 현재 코드에서는 별다른 표준출력이 없기 때문에 비어있다. 아마도 실행 실패에는 표준 출력 내용이 보여질 것이다.
참고사이트
- 서버리스 개념: https://velog.io/@xgro/MSA%EC%99%80-%EC%84%9C%EB%B2%84%EB%A6%AC%EC%8A%A4
- Naver Cloud Blog: https://manvscloud.com/?p=1803
※ 본 게시글의 정보가 잘못 되었거나 부족한 부분에 대한 피드백을 환영합니다.
* CopyRight 2023. Jay Park All rights reserved.
'Study > ETC' 카테고리의 다른 글
[CI/CD] Jenkins 설치 (0) | 2023.08.08 |
---|---|
[Cloud] Naver Cloud - Object Storage 사용법 및 예제 (0) | 2023.01.22 |
[Cloud] 문자(sms) 매크로 만들기 - Simple & Easy Notification Service (Naver Cloud) (0) | 2023.01.08 |
[Git] 자주쓰는 깃 명령어 모음 (CLI) (0) | 2022.11.11 |
[NAS] 시놀로지 NAS 데이터를 안전하게 보관(백업)하는 방법 - Hyper Backup (0) | 2022.11.01 |