GOAL
- Cloud Computing 에 대한 내용을 Google Cloud Platform 을 통해서 학습
- 각 서비스들의 목적성에 집중하여 수강하기
Further Question
- Compute Engine 인스턴스 띄우고 삭제해보기
- Compute Engine 인스턴스에서 Shell Command 연습하기
- Cloud Storage Bucket 생성하고 파일 업로드, 삭제해보기
- Python Cloud Storgage API 를 사용해 Cloud Storage 에 업로드한 파일을 파이썬에서 사용하는 코드 작성 ( 참고자료 - Python Client for Google Cloud Storage API )
뒷 강의에서 할 것
- Instance 생성하고 IP 고정하기
- 방화벽 설정하기
✨ Cloud Service 를 사용하면 확장성 및 물리적 제약이 줄어든다.
Cloud Computing Service 는 Infrastructure-as-a-Service, Platforms-as-a-Service, Software-as-a-Service 의 3가지 기본 유형에 해당하는 서비스를 제공한다.
Computing Service(Server) : 가상 컴퓨터, 서버
Serverless Computing : Computing Service 와 유사하지만, 서버 관리를 클라우드 쪽에서 진행한다.
Auto Scaling
Object Storage : 다양한 Object 를 저장할 수 있는 저장소, 다양한 형태의 데이터를 저장할 수 있고, API 를 사용해 데이터에 접근할 수 있다.
Database(RDB) : 서비스에서 사용하는 데이터의 경우 Database 에, 분석용 데이터는 Object Storage 에 저장한다.
Data Warehouse : Database + Object Storage 데이터 분석에 특화
AI Platform : AI Research, AI Develop 과정을 편리하게 해주는 제품으로 MLOps 관련 서비스를 제공한다.
- 참고 : GCP 무료 등급 제품 보기
- Compute Engine 인스턴스 띄우고 삭제해보기
- Compute Engine 인스턴스에서 Shell Command 연습하기
- Cloud Storage Bucket 생성하고 파일 업로드, 삭제해보기
- Python Cloud Storgage API 를 사용해 Cloud Storage 에 업로드한 파일을 파이썬에서 사용하는 코드 작성 ( 참고자료 - Python Client for Google Cloud Storage API )
참고
Python 3.9.2
sudo apt install python-setuptools
sudo apt-get install python3-pip
sudo pip install virtualenv
virtualenv <your-env>
<your-env>\Scripts\activate
<your-env>\Scripts\pip.exe install google-cloud-storage
from google.cloud import storage
import io
def download_blob_to_stream(bucket_name, source_blob_name, file_obj):
"""Downloads a blob to a stream or other file-like object."""
# The ID of your GCS bucket
# bucket_name = "your-bucket-name"
# The ID of your GCS object (blob)
# source_blob_name = "storage-object-name"
# The stream or file (file-like object) to which the blob will be written
# import io
# file_obj = io.BytesIO()
storage_client = storage.Client()
bucket = storage_client.bucket(bucket_name)
# Construct a client-side representation of a blob.
# Note `Bucket.blob` differs from `Bucket.get_blob` in that it doesn't
# retrieve metadata from Google Cloud Storage. As we don't use metadata in
# this example, using `Bucket.blob` is preferred here.
blob = bucket.blob(source_blob_name)
blob.download_to_file(file_obj)
print(f"Downloaded blob {source_blob_name} to file-like object.")
return file_obj
# Before reading from file_obj, remember to rewind with file_obj.seek(0).
def main():
target_file = io.BytesIO()
target_obj = download_blob_to_stream("your bucket name","target file name", target_file)
target_obj.seek(0)
# Write the stuff
with open("output.txt", "wb") as f:
f.write(target_obj.getbuffer())
pip install gcsfs
from google.cloud import storage
import pandas as pd
import io
def main():
training_file_path = 'gs://level3-example/jjinmack2.csv'
train_df = pd.read_csv(training_file_path, encoding='utf-8')
print(train_df.head())
if __name__ == "__main__" :
main()
gsutil cp gs://level3-example/jjinmack2.csv mydata.csv
참고
: gsutil 과 pythonGOAL
- CI/CD(Continious Integration/Continuous deploymen) 로 자동화하기
Further More
- Github Action Workflow 만들기
- Github Action을 사용해 Voila, Streamlit 코드 배포하기
- 나만의 Jupyter Notebook Server 만들기
- Github Action의 결과를 Slack 채널에 메세지 보내기(배포 실패, 배포 성공 등)
- 특정 Branch가 main에 Merge된 경우 Branch 자동으로 삭제하는 Github Action 만들기
일반적으로
main<>prod server
,stating<>staging server
,dev<>dev server
,feat/기능 이름
원하는 기능이 있는 경우 <기능> github action 등으로 검색해보자
Action Marketplace : https://github.com/marketplace?type=actions
Awesome Github Action : https://github.com/sdras/awesome-actions
제약 : 하나의 레포 당 최대 20개의 workflow 등록 가능하고 job 은 최대 6시간 수행 가능, 동시 실행 가능한 workflow 의 수 제한 있음
Workflow, Event, Job, Step, Action, Runner
name: CICD-SSH
on:
push:
branches: [ main ]
paths:
- 'part2/04-cicd/**'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: 8398a7/action-slack@v3
with:
status: ${{ job.status }}
fields: repo,message,commit,author,action,eventName,ref,workflow,job,took,pullRequest # selectable (default: repo,message)
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required
if: always() # Pick up events even if the job fails or is canceled.
예를 들어
참고
하나의 Job에선 데이터를 공유할 수 있음단계
- Compute Engine 실행
- SSH 키 생성 및 Github Secrets 설정
- 터미널에서 최초로 서비스 실행
- Github Action 을 통한 배포 자동화
참고 : pip 없으면 설치
sudo apt install python-setuptools
sudo apt-get install python3-pip
cd ~/.ssh/
ssh-keygen -t rsa -b 4096 -C "email"
passphrase 는 enter
browser 에서 server 열기
authorized_keys 에 public key 가 등록되면 외부에서 접근 가능하다.
cat id_rsa.pub >> authorized_keys
하지만, GCP 는 주기적으로 authorized_keys 파일을 삭제해서 외부에 키 파일을 등록하는 과정이 필요하다.
cat id_rsa.pub
Metadata 에 SSH Key 등록하기
SSH Key 등록하면 왼편에 아이디가 뜸 ( 정상 )
Github 에 Secret 등록
**(참고) Github Action 에서 Secret 활용할 수 있다.
git config --global credential.helper store
git clone {glone repository}
sudo apt-get update
sudo apt-get install3.8-venv -y
폴더 이동
cd CI/CD
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
error: invalid command 'bdist_wheel'은 무시해도 됨 ( 10분 가량 소요 )
/usr/bin/nohup streamlit run app.py --server.runOnSave true &
cat nohup.out
참고
Repository 명과 폴더 명이 일치해야 한다.
- cd ${{ github.event.repository.name }}/part2/04-cicd
.github/workflows/deploy_ssh.yml
name: CICD-SSH
on:
push:
branches: [ main ]
paths:
- 'part2/04-cicd/**'
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: executing remote ssh commands using ssh key
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH_KEY }}
port: 22
script: |
cd ${{ github.event.repository.name }}/part2/04-cicd
sh deploy_ssh.sh
error
.ssh : handshake error 가 뜨면 SSH_KEY 값을 다시 한 번 잘 입력해보자.
main branch 와 merge 되었을 때 자동으로 반영이 된다.
주의
고정되지 않은 IP 는 인스턴스가 재실행될 때 마다 변경된다.
Reserve 를 눌려서 고정 IP 를 할당 받으면 된다.
이 글은 커넥트 재단 Naver AI Boost Camp 교육자료를 참고했습니다.