Easy CloudRun
GCP Cloud Run 을 사용 할 때 테스트, 빌드, 배포, GCP 이미지 삭제 등을 간단하게 해주는 패키지입니다.
📝 Table of Contents
🧐 About
GCloud 로 배포하려면 GCR 에 배포 한 뒤 Cloud Run 에 배포해야하며, 배포 매개변수를 매번 설정해주어야 하는 문제가 있습니다.
그 작업을 간단하게 하기 위하여 사용하기 쉽게 만들어진 패키지입니다.
아래의 함수들을 사용 할 수 있습니다.
🏁 Getting Started
Installing
pip install easy_cloudrun
Prerequisites
-
Docker 를 설치합니다.
-
GCloud 를 설치합니다.
https://cloud.google.com/sdk/docs/quickstarts?hl=ko
-
gcloud 를 설치 후 아래의 명령어를 입력하여 초기화를 합니다.
gcloud init
-
이메일을 선택합니다..
Choose the account you would like to use to perform operations for this configuration
-
프로젝트를 선택합니다.
Please enter numeric choice or text value (must exactly match list item)
-
기본 Region 을 선택합니다.
Do you want to configure a default Compute Region and Zone? (Y/n)?
-
아래의 명령어로 Google Continaer Registry 에 접근 할 수 있도록 합니다.
gcloud auth configure-docker
-
🚀 Tutorial
1. 서비스 만들기
-
서비스 폴더를 원하는 곳에 생성합니다.
-
아래처럼 파일들(Dockerfile, app.py)을 생성합니다.
만든_서비스_폴더/ Dockerfile src/ app.py
-
만든_서비스_폴더/src/app.py
파일에 아래의 코드를 입력합니다.import os from flask import Flask, request app = Flask(__name__) @app.route("/", methods=['GET']) def main(): return f"{os.environ['FRUIT']}" app.run(host='0.0.0.0', port=os.environ["PORT"])
-
만든_서비스_폴더/src/Dockerfile
에 아래의 코드를 입력합니다.FROM ubuntu:18.04 RUN apt-get update -y RUN apt-get install python3 -y RUN apt-get install python3-pip -y RUN pip3 install --upgrade pip RUN pip3 install flask COPY ./src /app WORKDIR /app CMD python3 app.py
2. 서비스를 로컬에서 실행해보기
-
아래의 코드를 실행하여 핸들러를 초기화합니다.
import easy_cloudrun handler = easy_cloudrun.EasyCloudRun() print(handler)
-
아래의 코드를 이용하여 서버를 로컬에서 실행해봅니다.
service_name = "sample" dockerfile_dir = "local_dir/services/sample" environ = {"FRUIT": "Cherry"} port = 3040 handler.run(service_name, dockerfile_dir,environ=environ, port=3040)
실행결과:
Building docker sample [Command] cd local_dir/services/sample&&docker build --tag gcr.io/hello-266101/sample . Sending build context to Docker daemon 3.584kB Step 1/9 : FROM ubuntu:18.04 ---> 2eb2d388e1a2 Step 2/9 : RUN apt-get update -y ---> Using cache ---> 9afa5d8f29f4 ... [Command] docker run --rm --network easy_cloudrun --name sample -p 3040:3040 -e FRUIT=Cherry -e HELLO=WORLD -e PORT=3040 gcr.io/hello-266101/sample * Serving Flask app "app" (lazy loading) * Environment: production * Running on http://0.0.0.0:3040/ (Press CTRL+C to quit) WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off
-
로컬에서 실행된 서버에 요청을 보내봅니다.
>>> import requests >>> requests.get("http://localhost:3040").text 'Cherry'
2. 서비스를 CloudRun 에 배포하기
-
아래의 코드로 CloudRun 에 배포해보겠습니다.
service_name = "sample" dockerfile_dir = "local_dir/services/sample" environ = {"FRUIT": "Cherry", "HELLO": "WORLD"} commands = { "--memory": "2Gi", "--allow-unauthenticated": "" } handler.build_push_deploy(service_name, dockerfile_dir, environ=environ, commands=commands)
실행결과:
Building docker sample [Command] cd local_dir/services/sample&&docker build --tag gcr.io/hello-266101/sample . Sending build context to Docker daemon 3.584kB Step 1/9 : FROM ubuntu:18.04 ---> 2eb2d388e1a2 Step 2/9 : RUN apt-get update -y ---> Using cache ---> 9afa5d8f29f4 Step 3/9 : RUN apt-get install python3 -y ... Creating Revision.....................................................................................................................done Routing traffic......done Done. Service [sample] revision [sample-00008-wox] has been deployed and is serving 100 percent of traffic at https://sample-y2i4cvxklq-an.a.run.app
-
https://cloud.google.com/container-registry 에서 이미지가 배포가 되었는지 확인합니다.
-
https://cloud.google.com/run 에서 클라우드런 서비스가 배포되었는지 확인합니다. 그리고 클릭합니다.
-
복사 버튼을 클릭하여 주소를 복사합니다.
-
아래의 코드를 실행하여 요청이 보내지는지 확인해봅니다.
>>> import requests >>> requests.get("복사한_URL").text 'Cherry'
-
완료했습니다.
⛄ References
🌱 --allow-unauthenticated 를 사용하지 않은 서비스에 요청을 보내고 싶은 경우
-
아래의 링크를 참조하세요.
🌱 도커 빌드가 너무 오래걸릴 경우
-
아래처럼 어떤 도커의 기본이 되는 도커파일을 생성합니다.
FROM ubuntu:18.04 RUN apt-get update -y RUN apt-get install python3 -y RUN apt-get install python3-pip -y RUN cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime RUN echo "Asia/Seoul" > /etc/timezone RUN pip3 install --upgrade pip RUN pip3 install Flask
-
아래의 명령어로 배포합니다.
>>> handler.build_push(service_name, dockerfile_dir)
-
만드려는 서비스 도커파일에
FROM gcr.io/프로젝트_이름/위에서_배포한_도커파일_이름
을 적고 배포합니다.
🎈 Usage
Please check Prerequisites before starting Usage
.
🌱 run
도커를 로컬에서 실행 할 때 사용합니다.
Parameters
-
(required) service_name
: str -
(required) dockerfile_dir
: str도커파일이 위치해있는 디렉토리 이름입니다.
-
environ
: dict (default = {})도커에 적용 할 환경변수 이름입니다.
-
port
: int (default = 8080)도커에 적용할 포트 이름입니다.
-
user_command
: str (default = "")docker run 명령어 이후에 사용 할 유저의 커스텀 커맨드입니다.
-
test
: bool (default = False)이 매개변수는 환경변수
TEST
를true
로 바꿔줍니다. 다른 기능은 없습니다.
Returns
None
🌱 build_push
도커를 빌드하고 Google Continaer Registry 에 배포 할 때 사용합니다.
클라우드런에 배포하려면 GCR(Google Continaer Registry) 에 먼저 배포해야합니다.
클라우드런에 배포하지 않아도, 다른 도커의 기본이 되는 도커파일로 사용하고 싶을 때 이 함수를 사용합니다.
Parameters
-
(required) service_name
: str -
(required) dockerfile_dir
: str도커파일이 위치해있는 디렉토리 이름입니다.
Returns
None
🌱 build_push_deploy
도커를 빌드하고 Google Continaer Registry 에 배포 한 후 Cloud Run 에 배포 할 때 사용합니다.
클라우드런에 배포하려면 GCR(Google Continaer Registry) 에 먼저 배포해야합니다.
Parameters
-
(required) service_name
: str -
(required) dockerfile_dir
: str도커파일이 위치해있는 디렉토리 이름입니다.
-
environ
: dict (default = {})클라우드런에 배포할 도커의 환경변수입니다.
-
commands
: dict (default = {})gcloud run deploy 에서 사용하는 매개변수에 사용자가 추가하고싶은 매개변수입니다.
예를들면 아래와 같이 사용 할 수 있습니다.
{ "--memory": "2Gi", "--allow-unauthenticated": "" }
자세한 내용은 아래의 링크를 참조하세요.
Returns
None
🌱 build
도커만 빌드 할 때 사용합니다.
Parameters
-
(required) service_name
: str -
(required) dockerfile_dir
: str도커파일이 위치해있는 디렉토리 이름입니다.
Returns
None
🌱 push
빌드된 도커를 푸쉬 할 때 사용합니다.
Parameters
-
(required) service_name
: str
Returns
None
🌱 deploy
GCR에 배포된 도커를 Clodu Run 에 배포 할 때 사용합니다.
Parameters
-
(required) service_name
: str -
environ
: dict (default = {})클라우드런에 배포할 도커의 환경변수입니다.
-
commands
: dict (default = {})gcloud run deploy 에서 사용하는 매개변수에 사용자가 추가하고싶은 매개변수입니다.
예를들면 아래와 같이 사용 할 수 있습니다.
{ "--memory": "2Gi", "--allow-unauthenticated": "" }
자세한 내용은 아래의 링크를 참조하세요.
Returns
None
🌱 rmi
GCR 에 배포하면 계속 쌓이는데 이 이미지들을 서비스 이름만으로 한번에 제거 할 수 있게 도와주는 함수입니다.
Parameters
-
(required) service_name
: str
Returns
None
Examples
>>> service_name = "sample"
>>> handler.rmi(service_name)
실행결과
[Command] gcloud container images delete gcr.io/hello-266101/sample@sha256:cb0e44aacba8a5f59b4664418c968daf18aaadd5b98f423c2584c0996e89fd7f --force-delete-tags -q
Digests:
- gcr.io/hello-266101/sample@sha256:cb0e44aacba8a5f59b4664418c968daf18aaadd5b98f423c2584c0996e89fd7f
Associated tags:
- latest
Deleted [gcr.io/hello-266101/sample:latest].
Deleted [gcr.io/hello-266101/sample@sha256:cb0e44aacba8a5f59b4664418c968daf18aaadd5b98f423c2584c0996e89fd7f].
Deleted image sample in the cloud.
🌱 run_cloud
클라우드에 올라가 있는 도커를 로컬에서 실행하고 싶을 때 사용하는 함수입니다.
Parameters
-
(required) service_name
: str -
(required) dockerfile_dir
: str도커파일이 위치해있는 디렉토리 이름입니다.
-
environ
: dict (default = {})도커에 적용 할 환경변수 이름입니다.
-
port
: int (default = 8080)도커에 적용할 포트 이름입니다.
-
user_command
: str (default = "")docker run 명령어 이후에 사용 할 유저의 커스텀 커맨드입니다.
-
test
: bool (default = False)이 매개변수는 환경변수
TEST
를true
로 바꿔줍니다. 다른 기능은 없습니다.
Returns
None