GCP에서 JSON형식으로 된 인증키 파일을 받았다.
이제 스트림릿을 활용한 프로젝트에서 어떻게 적용시키는 지 확인해보자.
전제조건은
1. 인스턴스가 생성되어있고 SSH터미널에 미니콘다가 설치되어있다.
2. 깃허브 연동 및 깃허브액션 연동까지 되어있다. (노헙까지. )
3. 그리고 나중에 나를 위해 같은 환경 테스트를 app.py 파일을 첨부할 것임
그럼 JSON 인증키를 어떻게 관리하는 지 살펴보도록 하자.
우선 environment.yml파일을 프로젝트 폴더에 세팅을 해보겠다.
해당파일은 vs코드에서 파일 추가해서 yml 확장자로 만들고 해당 코드를 복붙한다.
name: condagcp
channels:
- defaults
dependencies:
- python=3.11
- numpy
- pandas
- matplotlib
- plotly
- pip:
- streamlit
- google-cloud-bigquery
- pandas-gbq

여기서 해당파일에 대해 설명을 하고 넘어가자면
그다음에 인증키json파일이 프로젝트 폴더에 있는데 이게 깃허브에 보여지면 안되니까
안보이게 처리를 하자
참조 공식문서 : https://docs.streamlit.io/deploy/streamlit-community-cloud/deploy-your-app/secrets-management

인증키json 파일을
미리 만들어둔 .streamlit 폴더에 넣는다. 그리고

json 파일에 있는 내용을 secrets.toml 파일을 .streamlit 폴더안에 만들어서 사진과 같은식으로 옮겨적는다.
: 을 = 로 바꿔주고 왼쪽에 있는 값들의 따옴표를 뺴준 것이다.
그 다음 깃 이그노어 설정을 해주자

.gitignore 파일에 .streamlit/ 을 추가해주고
터미널에
git add .gitignore
git commit -m '커밋명'
git push
해주고 깃허브 레포를 확인해서 해당 폴더가 깃허브에 없다는 것을 확인해주자.

이렇게 .streamlit 폴더가 깃허브에 푸쉬가 안되면 숨기는데 성공!
계속해서 활용방법을 살펴보자.
app.py는 그냥 코드통으로 올리겠다.

이 파일인데 여기서 세팅해야할 부분이 있기 떄문이다.
# -*- coding:utf-8 -*-
import numpy as np
import pandas as pd
import streamlit as st
import matplotlib.pyplot as plt
from google.oauth2 import service_account
from google.cloud import bigquery
import plotly.express as px
import google.auth
from google.auth import compute_engine
# 해당 코드가 핵심이다!! 저기에 인증키json파일명이랑 경로를 잘맞춰서 써주면 된다
# Local에 저장된 json 파일 불러오기
try:
credentials = service_account.Credentials.from_service_account_file(r'.streamlit/mulcamp-project-8108-81901a478f2d.json')
except:
credentials, project_id = google.auth.default()
credentials = compute_engine.Credentials(
service_account_email=credentials.service_account_email)
#위 3줄이 gce에서 쓰는 코드( 핵심코드!!)
# GCP 프로젝트
project_id = 'mulcamp-project-8108' #gcp프로젝트 명을 써줬다.
client = bigquery.Client(credentials = credentials, project=project_id)
@st.cache_data(ttl=600)
def getData(query):
data = client.query(query).to_dataframe()
int64_columns = data.select_dtypes(include='Int64').columns
data[int64_columns] = data[int64_columns].astype('float64')
print(data.info())
return data
def plotly_chart(data, feature):
main_features = ['LotArea', 'GrLivArea', 'SalePrice']
chart_features = main_features + [feature]
DF = data[chart_features]
# main plot (scatter)
fig = px.scatter(DF,
x='GrLivArea',
y='SalePrice',
color=feature,
size='LotArea',
width=750,
height=400)
# annotation (text)
fig.add_annotation(text="Possible outliers",
xref="x", yref="y",
x=6200,y=160000,
showarrow = True,
yshift=30,
xshift=-60,
font=dict(
family="sans serif",
size=12,
color="LightSeaGreen"
)
)
# annotation (box)
fig.add_shape(type="rect",
xref="x", yref="y",
x0=4500, x1=5800, y0=100000, y1=250000,
fillcolor="lightgray",
line_color="black",
opacity=0.3
)
# update the plot
fig.update_layout(title='<b>House Price vs GrLivArea<b>',
titlefont={'size': 24}
)
st.plotly_chart(fig)
def main():
st.title("Hello GCP from Local")
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot([1, 2, 3, 4, 3, 2, 1])
ax.set_title("Hello Plot from Local PC")
st.pyplot(fig)
st.markdown("<hr>", unsafe_allow_html = True)
st.markdown("""
<style>
.gcp-font {
font-size:32px !important;
}
</style>
""", unsafe_allow_html=True)
st.markdown('<p class="gcp-font">BigQuery with Streamlit</p>', unsafe_allow_html=True)
# 이런식으로 여기에 필요한 데이터를 가져오는 쿼리문을 작성한다!
# 여기에 해당 프로젝트에 있는 데이터에 해당하는 쿼리문을 쓰자.
query = '''
SELECT * FROM `mulcamp-project-8108.kaggle.train`
'''
data = getData(query)
st.dataframe(data.head(3))
object_feature = st.selectbox("Select....", ("OverallQual", "ExterQual", "RoofStyle"), index=0)
plotly_chart(data, object_feature)
st.markdown('<p class="gcp-font">BigQuery with Streamlit in GCP 성공!!</p>', unsafe_allow_html=True)
if __name__ == "__main__":
main()
app.py를 통으로 가져왔다. 주석을 유심히 보면 된다.
json파일 이름쓰는곳과, gcp프로젝트이름쓰는곳하고 쿼리문 쓰는곳을 세팅해주면 된다.
=======================================================================
이제 로컬과 ssh터미널 둘다 작업을 해줄건데
방식은 해당 공식문서를 참조했다.
로컬 vs코드에서 파워셸 터미널에서
conda env create -f .\environment.yml
를 실행해준다
그리고 ssh 터미널에서
conda env create -f environment.yml
를 실행해준다.
그리고
conda activate condagcp 로(로컬이랑 ssh터미널 둘다)
가상환경을 진입해준다
(condagcp)라고 진입한 것을 확인해준다.
그리고 app.py파일에서 위에서 언급한 3가지포인트를 수정안했으면 수정해준다
(json파일명 및 경로작성/ project_id 변경/ 필요한 쿼리문 작성 )
그리고 streamlit run app.py 로 실행해보자
(혹시나 no module name 이딴 에러뜨면 가상환경 삭제후 다시 해보면 된다.)
(conda deactivate --> conda remove -n condagcp --all --> conda env create -f .\environment.yml (다시 가상환경 생성)

이렇게 로컬에서 스트림릿 실행이 잘 됐으니
그 다음에 로컬에서 잘 된걸 반영을 해야함
깃 커밋 푸쉬하면 된다. 그리고 ssh에서 streamlit run app.py 해주고

서버는 깃허브액션연동을 하면서 nohub 코드를 적용했으니 계속 돌아간다.(중지시키지 않는한)
돌아가고 있는 상태에서 주소창에 고정시켰던 인스턴스 외부아이피주소:8501(스트림릿 포트번호) 로 들어가보자
그러면 동일하게 화면을 볼 수 있다. (12345는 로컬에서 깃푸시하고 서버에 적용된거 확인하다 생긴 것.)
app.py에서
streamlit run app.py로 테스트하고 적용된거 확인하고 업뎃확인
이렇게 로컬에서 확인하고
코드 추가가되었네 그러면 깃푸쉬하면서 그때그떄마다 반영해주면 됨.
여기까지 확인되면 이제 이런식으로 프로젝트를 관리하면 되겠다.
--------------------
(추가)
conda env update -f environment.yml
작업하다 보면 필요한 라이브러리가 추가가 되겠죠
추가가 된것을 수동으로 설치하지마시고
environment.yml 파일에 업데이트한다음에 저 명령어로 한번에 하라는 것
dependencies에 올려놓고 명령어로 업뎃을 하라는 것
그럼 알아서 추가적으로 설치가 됨 .
업데이트 했으니까 그러면 아시겠지만 콘다는 계속적으로 돌아가고 있다.
(노헙을 썼으니까)
서버 중단할 필요없이
여기서 업뎃한걸 그대로 깃푸시.