본문 바로가기

백엔드 개발

파이썬으로 구글 클라우드 함수 만들기

 

node.js 환경에서 javascript로 진행했던 구글 클라우드 함수 만들기를 파이썬으로도 해 보고 있다. 

이번에는 클라이언트로 부터 post 방식으로 전달 받은 데이터를 firestore database에 저장하는 클라우드 함수를 해 보았습니다. 

javascript인 경우에는 functions 폴더 내의 index.js 파일에 함수 코드를 넣었지만, 파이썬은 해당 폴더의 main.py를 이용한다. 

 

ChatGPT로 함수 코드 짜기

 

먼저, 다음과 같은 질문을 통해 해당 기능을 하는 함수를 ChatGPT(Grimoire GPTs)에게 요청하였습니다. 

[Prompt]
다음과 같은 post 방식으로 데이터가 전송되어 올 경우에 이를 firestore database에 db로 저장하는 cloud functions의 코드를 파이썬으로 작성하고 싶습니다.
---
* 환경 : python(node.js)
* 함수명 : add_userdb
* 위치 : "userDB" 콜렉션
* 방식 : post
* 전달 데이터 형식 : json
   json = {
        'id' : user_id,
        'email' : user_email,
        'name' : user_name
   }
* 작업 : post 방식으로 전달된 json 형식의 데이터를 add_userDB 콜렉션에 새로운 문서로 저장한다.

 

ChatGPT(Grimoire GPTs)가 작성한 코드는 다음과 같습니다. 

from flask import request
from google.cloud import firestore

def add_userdb(request):
    """Responds to any HTTP request.
    Args:
        request (flask.Request): HTTP request object.
    Returns:
        The response text or any set of values that can be turned into a Response object using
        `make_response` <http://flask.pocoo.org/docs/1.0/api/#flask.Flask.make_response>.
    """
    request_json = request.get_json(silent=True)
    
    if request_json and all(k in request_json for k in ('id', 'email', 'name')):
        user_id = request_json['id']
        user_email = request_json['email']
        user_name = request_json['name']

        # Initialize Firestore DB
        db = firestore.Client()
        doc_ref = db.collection('userDB').document()
        doc_ref.set({
            'id': user_id,
            'email': user_email,
            'name': user_name
        })

        return f'User {user_name} added to the database.'

    else:
        return 'Invalid data', 400

 

이 코드는 JSON 형식의 데이터를 받아 필요한 Key(id, email, name)이 존재하는지를 확인한 후, Firestore의 ueseDB 콜렉션에 문서를 생성하거나 업데이트 합니다. 

 

위 코드를 main.py 파일에 복사 붙여넣기해도 되는데, 이번에는 별도의 파일(userdb_functions.py)로 만들고 이것을 main.py에서 import 하는 방식으로 구성을 하였습니다. 

from userdb_functions import add_userdb

 

함수 배포

 

이렇게 작성된 함수를 Google Cloud Functions에 배포하기 위해서는 다음 단계를 거칩니다. 

 

1. Google Cloud SDK를 사용하여 로그인

gcloud auth login

이 때, 인증을 하라는 alert이 뜰 수 있는데, 늘 했던 것 처럼 진행하면 인증 절차가 완료 됩니다. 

 

2. 사용 중인 프로젝트 설정

gcloud config set project YOUR_PROJECT_ID

보통은 이미 프로젝트 설정이 완료된 상태여서 별 신경 안 써도 되는 단계.

 

3. 배포

gcloud functions deploy add_userdb --runtime python312 --trigger-http --allow-unauthenticated

이 명령어는 add_userdb 함수를 Python3.12 런타임으로 배포하고, HTTP트리거로 설정하고, Google Cloud SDK Shell(또는 Node.js command promt) 창에 입력하고 실행합니다. 

 

배포가 완료되면, HTTP POST  요청을 통해 JSON 데이터를 함수에 전송할 수 있으며, 함수는 이 데이터를 Firebase의 userDB 콜렉션에 저장합니다. 

 

배포 완료 이후 Firebase Console 화면에 다음과 같이 add_userdb 함수가 올라가 있습니다. 

 

이 함수를 실행시키기 위해 이전에 만들어 놓았던 streamlit 입력 폼(client_side_v2.py)을 활용하였습니다. 

# 제출 버튼 클릭 시 "완료 메세지" + "다시 가입하기" 버튼 생성

import streamlit as st
import requests

def show_form():
    st.title('User Data Submission')
    with st.form("user_form"):
        user_id = st.text_input("ID")
        user_email = st.text_input("Email")
        user_name = st.text_input("Name")
        submitted = st.form_submit_button("Submit")

        if submitted:
            response = requests.post('add_userdb 함수의 트리거 URL', json={
                'id': user_id,
                'email': user_email,
                'name': user_name
            })
            if response.ok:
                st.session_state['submitted'] = True
                st.rerun()  # 스크립트 재실행
            else:
                st.error("An error occurred.")

def show_success():
    st.markdown("<h1 style='text-align: center;'>회원 가입이 완료 되었습니다</h1>", unsafe_allow_html=True)
    if st.button("다시 가입하기"):
        st.session_state['submitted'] = False
        st.rerun()  # 스크립트 재실행

if 'submitted' not in st.session_state:
    st.session_state['submitted'] = False

if st.session_state['submitted']:
    show_success()
else:
    show_form()

 

 

 

다음은 Firestore Database에서 문서가 생성된 화면입니다.  

 

반응형