본문 바로가기

카테고리 없음

GCP(구글클라우드)에서 받은 JSON 인증키/ 스트림릿에서 활용하기

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

 

위와같이  파일을 세팅해주고

여기서 해당파일에 대해 설명을 하고 넘어가자면

# 이걸 복제를 해서 로컬이랑 gce 환경이랑 동일하게 세팅을 해주는것 콘다환경을 통해서  
# 미니콘다를 쓴 이유가 파이썬 같은것들 버전 설치를 하면 원래는 로컬에서 파이썬 3.11 설치를하면  
# 우리 gce에서도 파이썬 3.11로 세팅을 해줘야하는데 통일을 시키려고 아나콘다 환경으로 쓴다고 생각  
 
# 실제로 프로젝트를 하게 되면 아나콘다설치안되어있으면 강제적으로 다 맞춰줘야함 실무가면    
# 클라우드를 안쓸 수도 있고 리눅스서버만 깡통으로 줄 수도 있다.    
# 이 환경을 동일하게 가져가야함 (포인트)    

# pip 구분된 이유는 아나콘다랑 미니콘다는 데이터과학을 용도임
# 데이터과학과 관련된것만 지원해주는게 목적이라 pip으로 한 애들은 conda install이 안되는 애들임
# 그럼 pip을써야하는지 conda를 써야하는 지 어떻게 아는가? 모른다. 다 찾아봐야한다.
# 물론 다 통으로 pip으로 해도되긴 하는데 그래도 위와같이 되어있는 경우가 있으니 알아봐야하니까 설명
# 라이브러리가 프로젝트하면서 늘어나게 되면 콘다설치가 가능한지 확인해주고 (공식문서가서 설치페이지 확인)
# 가능하지 않다면 pip에다가 진행하고 되면 그냥위에처럼 쓰고
# 더 쉽게 그냥 보면 콘다에서 지원해주는 4개는 그냥 써놓고 나머지 다 pip으로 하는 거기도 함

 

 

그다음에 인증키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터미널 둘다 작업을 해줄건데 

방식은 해당 공식문서를 참조했다. 

https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#managing-environments

 

로컬 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에 올려놓고 명령어로 업뎃을 하라는 것 
그럼 알아서 추가적으로 설치가 됨 .

업데이트 했으니까 그러면 아시겠지만 콘다는 계속적으로 돌아가고 있다.
(노헙을 썼으니까) 
서버 중단할 필요없이 
여기서 업뎃한걸 그대로 깃푸시.