GCP App Engine으로 Streamlit 웹 어플리케이션 배포하기

John
9 min readApr 11, 2020

--

이번 포스팅은 Google Cloud Platform(GCP)의 Google Cloud SDK & App Engine을 활용하여 파이썬 기반의 웹 어플리케이션을 배포하는 방법에 대해서 공유해보고자 합니다.

1. streamlit.py 파일 작성

(1) 샘플로 Uber의 공간 시각화 라이브러리인 Pydeck을 활용하여 도시별 코로나 총 확진자 수를 지도 시각화 한 후 streamlit을 통해 웹 어플리케이션을 만드는 코드를 작성합니다.

(데이터는 https://github.com/jihoo-kim/Data-Science-for-COVID-19 에서 구할 수 있었습니다.)

시각화에 쓰일 데이터 프레임 (regional_count)
import streamlit as st
import pydeck
import pandas as pd
# 데이터 importpatientinfo = pd.read_csv('/app/PatientInfo.csv')
region = pd.read_csv('/app/Region.csv')
# 지도 시각화에 필요한 데이터만 전처리regional_patient = pd.merge(patientinfo[['patient_id','confirmed_date','sex','age','province','city']],region[['province','city','latitude','longitude']], how = 'left', on = ['province','city'])regional_count = regional_patient[['city','latitude','longitude']].dropna()layer = pydeck.Layer('HexagonLayer',
regional_count,
get_position='[longitude, latitude]',
auto_highlight=True,
elevation_scale=50,
pickable=True,
elevation_range=[0, 3000],
extruded=True,
coverage=1)
view_state = pydeck.ViewState(
longitude=127.986,
latitude=36.165,
zoom=7,
min_zoom=4,
max_zoom=12,
pitch=40.5)
# Renderr = pydeck.Deck(layers=[layer], initial_view_state=view_state)st.title('코로나 map deploy')
st.pydeck_chart(r)

(2) 이렇게 streamlit.py 파일을 작성한 후 터미널에서 다음과 같이 입력하여 정상적으로 웹 페이지가 만들어졌는지 확인합니다.

streamlit run steramlit.py

해당 명령어를 작동시키면 웹 기반의 코로나 시각화 지도가 만들어진 것을 알 수 있습니다. 하지만 “localhost:8501” 로 자신의 로컬 환경에서만 접속할 수 있는 상태이므로 이를 배포하는 단계를 진행해보도록 합니다.

2. Google Cloud SDK 설치

(1) 각자 해당 웹을 배포할 수 있는 GCP project를 생성한 이후에 Google Cloud SDK를 설치합니다.

(2) 위 URL 접속 후, 운영환경에 맞는 파일을 다운로드 하고 해당 documentation에 있는 내용대로 설치 및 인증을 이어서 진행하시면 됩니다. (해당 도큐먼트에 설명이 잘 나와있으니 본문에는 생략)

(3) 설치 및 인증이 완료되면 Gcloud SDK 세팅을 진행합니다.

# 현재 활성화 되어 있는 프로젝트 확인
gcloud projects list
# app engine을 통해 deploy할 프로젝트 선택
gcloud config set project [프로젝트 이름]
# 선택한 프로젝트 확인
gcloud config get-value project

3. Dockerfile / App.yaml 파일 작성

이제 Gcloud SDK 세팅이 완료되었으면, 자신이 작성한 streamlit.py와 같은 레포지터리에 Dockerfileapp.yaml 파일을 작성합니다.

(1) Dockerfile 생성

Dockerfile은 도커 이미지와 컨테이너를 만들고 설정하기 위한 지침과 단계를 포함하는 파일로, “Dockerfile” 이름 그대로 사용하는 것을 권장 드립니다

여기서 가장 중요한 것은 streamlit의 기본 포트인 8501이 아닌 8080을 사용 한다는 것입니다.

FROM python:3.7WORKDIR /appCOPY requirements.txt ./requirements.txt # 설치 필요한 라이브러리COPY PatientInfo.csv ./PatientInfo.csv # 사용되는 데이터셋COPY Region.csv ./Region.csv # 사용되는 데이터셋RUN pip3 install -r requirements.txtEXPOSE 8080COPY . /appCMD streamlit run --server.port 8080 --server.enableCORS false streamlit.py

(2) app.yaml 생성

app.yaml 파일을 통해 런타임과 환경 유형을 아래와 같이 설정합니다.

runtime: custom
env: flex

4. 웹 어플리케이션 배포하기

현 레포지터리

(1) 이제 모든 배포를 위한 모든 환경이 설정되었으니 배포를 진행합니다.

gcloud app deploy

(2) 자신의 프로젝트에 관한 정보를 확인 후 진행 여부에 ‘y’를 입력합니다.

(3) ‘y’를 입력하면 실제 로컬에서 수행하는 것처럼 “Dockerfile”을 이용하여 image를 생성해줍니다.

(4) 그 후 3–5분 이내로 [프로젝트 ID + appspot.com]으로 이루어진 url이 형성되고 정상적으로 배포 완료된 것을 확인할 수 있습니다.

(5) 정상적으로 배포가 된 것을 확인하기 위해 아래 명령어를 입력하거나 만들어진 url을 크롬 브라우저에 입력하시면 됩니다.

gcloud app browse

-> 정상적으로 배포된 것을 확인할 수 있습니다.

6. 자신이 배포한 app은 해당 페이지에서 상세 정보를 확인할 수 있으며 나아가서 cron 작업도 진행할 수 있습니다.

테스트용으로 Deploy하는 경우 대부분 GCP 계정 발급 시 지원하는 $300로 충분히 커버 가능하며, 충분히 고도화 된 웹 어플리케이션을 효율적으로 만들 수 있을 것이라고 생각합니다.

--

--