지금 구현하려는 전체 시나리오는 다음과 같습니다:

이번 글에서는 트레이딩 뷰에서 알림을 받아서 매매를 수행하고, 텔레그램 봇으로 매매 결과를 전송하는 핵심적인 역할을 담당하는 구글 클라우드, 정확히는 그 중 Cloud Functions 서비스를 이용한 구현을 알아보겠습니다.
여기서는 다음과 같은 시나리오를 만들어 보겠습니다 :

- 구글 클라우드에 가입하고, Cloud Functions 함수를 하나 만듭니다.
- 브라우저로 Cloud Functions 를 실행(트리거)하고 결과를 확인합니다.
- Cloud Functions 가 실행될 때 텔레그램 봇과 연동해서 메시지 알림을 보내는 로직을 추가합니다.
구글 클라우드 서비스 가입
먼저 구글 클라우드에 가입하는 절차가 필요한데, 특별히 설명이 필요한 부분은 아니어서 영상으로 대체하겠습니다:
Cloud Functions 소개
공식 문서에서는 Cloud Functions 를 다음과 같이 설명하고 있습니다:
Google Cloud Functions는 클라우드 서비스를 빌드 및 연결하기 위한 서버리스 실행 환경입니다. Cloud Functions를 사용하면 클라우드 인프라와 서비스에서 발생하는 이벤트에 연결되는 단일 목적의 간단한 함수를 작성할 수 있습니다. 함수는 감시 중인 이벤트 발생 시에 트리거됩니다. 코드는 완전 관리형 환경에서 실행되므로, 인프라를 프로비저닝하거나 서버를 관리할 필요가 없습니다.
다양한 개념과 기능을 포함하다보니 추상적으로 설명하고 있어서 바로 와닿지 않을 것 같습니다. 지금 하고자 하는 일로 한정해서 다시 설명해보면, 트레이딩 뷰나 웹 브라우저로부터 HTTP 요청을 받아서, 특정 명령(함수)를 실행하는 기능을 제공하는 서비스라고 부를 수 있습니다. 이 때 세부적인 실행 과정이나 서버 관리를 사용자가 신경쓸 필요 없이 요청과 응답을 연결하고, 함수를 구현하는 부분에만 집중하면 됩니다.
함수 생성 및 배포
먼저 Functions 로 함수를 하나 만듭니다:
Google Cloud Platform 콘솔 상단의 검색창에서 "Cloud Functions" 를 입력해서 서비스를 찾은 뒤, [함수 만들기] 를 클릭합니다.


함수 구성을 다음과 같이 세팅합니다 :
- 환경 : 1세대를 선택합니다. 2세대가 현재 베타 상태이기도 하고, Cloud Run 을 기본으로 하기 때문에 기능은 파워풀하지만 설정을 위해서는 보다 많은 지식이 필요합니다. 현재 구현하고자 하는 기능은 1세대를 사용해도 충분합니다.
- 함수 이름 : Cloud Functions 는 웹브라우저에서 입력 받은 메시지를 응답해서 해당 메시지를 웹페이지로 출력하고, 텔레그램 봇으로 메시지를 전송하도록 하는 기능이므로 '입력을 그대로 출력한다'는 의미에서 echo 라고 부르는 게 적절해 보입니다.
- 리전 : Cloud Functions 를 실행할 수 있는 가상 머신의 물리적인 위치를 결정합니다. 아무래도 서울에 있는 리전(asia-northeast3)을 선택하는 게 조금이라도 빠를 겁니다.
- 트리거 : Cloud Functions 에서 구현한 함수를 호출하는 방법은 여러가지가 있는데, 여기서는 웹 브라우저에서 호출하는 시나리오이므로 HTTP 프로토콜을 이용해 트리거 되는 상황입니다. 이 때 "인증되지 않은 호출 허용" 을 선택해야 바로 실행이 가능합니다. 만약 "인증 필요"를 선택하면 인증과 관련된 환경을 추가로 구현해야 하므로 관련된 부분을 따로 학습해야 합니다. 개인적으로 쓰는 프로젝트에서는 굳이 이런 수고를 하지 않아도 별 문제 없습니다.
이제 [저장] 을 누르면 2단계인 코드 작성 단계로 넘어갑니다.

여기서는 파이썬을 이용하므로 다음과 같이 설정합니다:
- 런타임 : Python 3.8
- 진입점 : hello_world -> echo
- 함수명 : hello_world -> echo
이 코드는 파이썬의 웹 프레임워크인 Flask 에서 HTTP 요청이 들어왔을 때의 함수(핸들러)를 포함하고 있습니다. 간단히 설명하면, (1) 브라우저가 Functions 의 트리거 URL 을 호출하면, (2) Functions 는 진입점으로 설정된 echo 함수를 실행하고, (3) 함수의 리턴 값을 클라이언트에 응답으로 보내면 (4) 브라우저는 응답을 화면에 표시합니다.
echo 함수 코드 살펴보기
다음의 echo 함수의 실행 과정을 살펴보겠습니다:
def echo(request): # (1)
request_json = request.get_json() # (2)
if request.args and 'message' in request.args: # (3)
return request.args.get('message') # (4)
elif request_json and 'message' in request_json: # (5)
return request_json['message'] # (6))
else:
return f'Hello World!' # (7)
Functions 트리거 URL 이 다음과 같은 경우:
https://asia-northeast3-acquired-day-342708.cloudfunctions.net/echo?message=안녕
Cloud Functions 의 echo() 함수가 호출될 때 라인 별 실행 내용은 다음과 같습니다 :
- echo(request) 함수가 호출될 때, request.args 에 { "message" : "안녕" } 이라는 파이썬 딕셔너리 값이 들어갑니다.
- 만약 요청이 JSON 형식의 HTTP Body 값으로 들어오면, 그 값을 request_json 에 할당합니다. 이 경우에는 Body 가 아닌 URL query string 형식으로 들어오므로 값이 할당되지 않습니다. HTTP 프로토콜에 대한 이해가 부족하면 어려울 수도 있는 내용인데, 일단 무시해도 됩니다.
- (1) 에 설명한 것과 같이 request.args 에 값이 존재하고, 'message' 라는 딕셔너리 키 값이 존재하므로,
- request.args 에서 'message' 키에 대한 값, 즉 '안녕' 이라는 문자열을 리턴합니다.
- (2) 에 설명한 것과 같이 request_json 에 값이 존재하고, 'message' 라는 딕셔너리 키 값이 존재하는 경우,
- request_json 에서 'message' 키에 대한 값을 리턴합니다. 이 예제에서는 실행되지 않습니다.
- 만약 트리거 URL 을 호출할 때 meesage 파라미터가 없으면 'Hello World!' 를 응답합니다.
위의 설명에 따라, 다음과 같이 message 파라미터가 없이 트리거 URL 을 호출하면, (7) 번 로직이 실행되어 화면에는 'Hello World!' 가 실행됩니다:
https://asia-northeast3-acquired-day-342708.cloudfunctions.net/echo
https://asia-northeast3-acquired-day-342708.cloudfunctions.net/echo?dummy_message=안녕
텔레그램 봇 연결
이제 파이썬과 Google Colab 퀵스타트에서 다루었던 telegram bot 만들기 코드 중 텔레그램 봇에 메시지를 보내는 코드를 복사합니다:
def send_message(message):
ACCESS_TOKEN='YOUR_ACCESS_TOKEN'
CHAT_ID='YOUR_CHAT_ID'
url=f'https://api.telegram.org/bot{ACCESS_TOKEN}/sendMessage?chat_id={CHAT_ID}&text={message}'
response=json.loads(requests.get(url).text)
print(response)
여기서 ACCESS_TOKEN과 CHAT_ID는 텔레그램 봇 API 퀵스타트 에서 설명한 바 있습니다. 여기서는 텔레그램 봇의 호출은 별도로 설명하지 않습니다.
이제 echo 코드는 다음과 같이 작성하면 됩니다.
def echo(request):
if request.args and 'message' in request.args:
message = request.args.get('message')
send_message(message)
return message
else:
return f'Hello World!'
전체 코드는 다음 링크를 참고하면 됩니다:
https://gist.github.com/quantro-kr/2315b0bc561b679cf41dbfb2ef3c2d84
Cloud Functions echo function
Cloud Functions echo function. GitHub Gist: instantly share code, notes, and snippets.
gist.github.com
main.py 는 위 코드에서 ACCESS_TOKEN 과 CHAT_ID 를 수정해서 입력하면 되고,
requirements.txt 에는 requests 를 추가해야 정상적으로 실행이 됩니다. 이에 대한 내용은 Cloud Functions 가이드 문서를 참고하세요.
이제 작성된 함수를 배포하고, 트리거 URL 을 호출해 봅니다:
https://<트리거 URL>?message=안녕
브라우저 화면에는 "안녕" 이 표시되고 텔레그램 봇으로부터 "안녕" 이라는 메시지를 받게 되는데, 전체적인 흐름을 시각화하면 다음과 같습니다:

이상 설명한 내용은 다음 영상에서 확인할 수 있습니다:
'가상화폐 투자자 가이드' 카테고리의 다른 글
파이썬과 Google Colab 퀵스타트 (1) | 2022.03.10 |
---|---|
텔레그램 봇 API 퀵스타트 (0) | 2022.03.05 |
트레이딩 뷰 퀵스타트 (3) - 알림 설정 (1) | 2022.03.04 |
트레이딩 뷰 퀵스타트 (2) - 전략 작성 (0) | 2022.03.03 |
트레이딩 뷰 퀵스타트 (1) - 지표 작성 (0) | 2022.03.02 |