1. 소개
Cloud Run은 HTTP 요청으로 호출 가능한 스테이트리스(Stateless) 컨테이너를 실행하는 관리형 컴퓨팅 플랫폼입니다. Knative 오픈소스 프로젝트를 기반으로 빌드되므로 워크로드를 플랫폼 간에 자유롭게 이식할 수 있습니다. Cloud Run은 서버리스이므로 인프라 관리가 필요 없습니다. 따라서 개발자가 본연의 업무인 애플리케이션 개발에 집중할 수 있습니다.
이 튜토리얼의 목표는 간단한 웹 애플리케이션을 만들어 Cloud Run에 배포하는 것입니다.
2. 설정 및 요건
자습형 환경 설정
- Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.
- 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
- 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔은 고유한 문자열을 자동으로 생성합니다. 일반적으로는 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로
PROJECT_ID
로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 다른 임의 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다. - 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
- 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스 또는 프로젝트를 삭제하면 됩니다. Google Cloud 신규 사용자는 300달러(USD) 상당의 무료 체험판 프로그램에 참여할 수 있습니다.
Cloud Shell 시작
노트북에서 Google Cloud를 원격으로 실행할 수도 있지만 이 튜토리얼에서는 Cloud에서 실행되는 명령줄 환경인 Cloud Shell을 사용합니다.
Cloud Shell 활성화
- Cloud Console에서 Cloud Shell 활성화를 클릭합니다.
Cloud Shell을 처음 시작하는 경우에는 무엇이 있는지 설명하는 중간 화면이 표시됩니다. 중간 화면이 표시되면 계속을 클릭합니다.
Cloud Shell을 프로비저닝하고 연결하는 데 몇 분 정도만 걸립니다.
가상 머신에는 필요한 개발 도구가 모두 들어 있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저를 사용하여 수행할 수 있습니다.
Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 자신의 프로젝트 ID로 설정된 것을 확인할 수 있습니다.
- Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.
gcloud auth list
명령어 결과
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Cloud Shell에서 다음 명령어를 실행하여 gcloud 명령어가 프로젝트를 알고 있는지 확인합니다.
gcloud config list project
명령어 결과
[core] project = <PROJECT_ID>
또는 다음 명령어로 설정할 수 있습니다.
gcloud config set project <PROJECT_ID>
명령어 결과
Updated property [core/project].
3. API 사용 설정
Cloud Shell에서 Artifact Registry, Cloud Build, Cloud Run API를 사용 설정합니다.
gcloud services enable \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ run.googleapis.com
다음과 비슷한 성공 메시지가 출력됩니다.
Operation "operations/..." finished successfully.
이제 작업을 시작하고 애플리케이션을 작성할 준비가 되었습니다.
4. 애플리케이션 작성
이 단계에서는 HTTP 요청에 응답하는 간단한 Flask 기반 Python 애플리케이션을 빌드합니다.
작업 디렉터리
Cloud Shell을 사용하여 helloworld-python
이라는 작업 디렉터리를 만들고 이 디렉터리로 전환합니다.
mkdir ~/helloworld-python cd ~/helloworld-python
main.py
main.py
이라는 파일을 만듭니다.
touch main.py
원하는 명령줄 편집기 (nano, vim 또는 emacs)를 사용하거나 Cloud Shell 편집기 버튼을 클릭하여 파일을 수정합니다.
Cloud Shell 편집기로 파일을 직접 편집하려면 다음 명령어를 사용합니다.
cloudshell edit main.py
main.py
from flask import Flask, request
app = Flask(__name__)
@app.get("/")
def hello():
"""Return a friendly HTTP greeting."""
who = request.args.get("who", default="World")
return f"Hello {who}!\n"
if __name__ == "__main__":
# Development only: run "python main.py" and open http://localhost:8080
# When deploying to Cloud Run, a production-grade WSGI HTTP server,
# such as Gunicorn, will serve the app.
app.run(host="localhost", port=8080, debug=True)
이 코드는 친숙한 메시지로 HTTP GET 요청에 응답하는 기본 웹 서비스를 만듭니다.
requirements.txt
requirements.txt
라는 파일을 추가하여 종속 항목을 정의합니다.
touch requirements.txt
Cloud Shell 편집기로 파일을 직접 편집하려면 다음 명령어를 사용합니다.
cloudshell edit requirements.txt
requirements.txt
# https://pypi.org/project/flask
Flask==3.0.2
# https://pypi.org/project/gunicorn
gunicorn==21.2.0
Procfile
마지막으로 Procfile
파일을 추가하여 애플리케이션 제공 방법을 지정합니다.
touch Procfile
Cloud Shell 편집기로 파일을 직접 편집하려면 다음 명령어를 사용합니다.
cloudshell edit Procfile
Procfile
web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
모든 파일이 작업 디렉터리 아래에 있는지 확인합니다.
ls
그러면 다음 파일이 나열됩니다.
main.py Procfile requirements.txt
애플리케이션을 배포할 준비가 되었습니다. 먼저 애플리케이션을 테스트해 보겠습니다.
5. 애플리케이션 테스트
애플리케이션을 테스트하려면 가상 환경을 만듭니다.
virtualenv venv
가상 환경을 활성화합니다.
source venv/bin/activate
종속 항목 설치
pip install -r requirements.txt
다음과 같은 확인 메시지가 표시됩니다.
... Successfully installed Flask ... gunicorn ...
애플리케이션을 시작합니다.
python main.py
로그에 현재 개발 모드라고 표시됩니다.
* Serving Flask app 'main' * Debug mode: on WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on http://localhost:8080 Press CTRL+C to quit ...
Cloud Shell 창에서 Web Preview
아이콘을 클릭하고 Preview on port 8080
을 선택합니다.
그러면 Hello World!
메시지를 표시하는 브라우저 창이 열립니다.
+
아이콘을 클릭하고 로컬에서 실행되는 애플리케이션에 웹 요청을 전송하여 다른 Cloud Shell 세션 (새 터미널 탭)을 열 수도 있습니다.
curl localhost:8080
다음과 같은 답변을 받게 됩니다.
Hello World!
완료되면 기본 Cloud Shell 세션으로 돌아가서 CTRL+C
를 사용하여 python main.py
명령어를 중지합니다.
가상 환경을 종료합니다.
deactivate
마지막으로 가상 환경 디렉터리를 삭제합니다.
rm -r venv/
애플리케이션이 예상대로 작동합니다. 배포해 보겠습니다.
6. Cloud Run에 배포
Cloud Run은 리전을 기반으로 합니다. 즉, Cloud Run 서비스를 실행하는 인프라가 특정 리전에 위치해 있으며, 해당 리전 내의 모든 영역에서 중복으로 사용할 수 있도록 Google에서 관리합니다. 배포에 사용할 리전을 정의합니다. 예를 들면 다음과 같습니다.
REGION="europe-west9"
아직 작업 디렉터리에 있는지 확인합니다.
ls
그러면 다음 파일이 나열됩니다.
main.py Procfile requirements.txt
Cloud Run에 애플리케이션을 배포합니다.
gcloud run deploy helloworld-python \ --source . \ --platform managed \ --region $REGION \ --allow-unauthenticated
- 다음 명령어를 사용하여 기본 리전을 정의할 수 있습니다.
gcloud config set run/region $REGION
- 다음 명령어를 사용하여 Cloud Run을 기본적으로 관리되도록 할 수도 있습니다.
gcloud config set run/platform managed
--allow-unauthenticated
옵션을 사용하면 서비스를 공개적으로 사용할 수 있습니다. 인증되지 않은 요청을 방지하려면 대신--no-allow-unauthenticated
를 사용하세요.
처음에는 Artifact Registry 저장소를 만들라는 메시지가 표시됩니다. Enter를 눌러 확인합니다.
Deploying from source requires an Artifact Registry Docker repository to store built containers. A repository named [cloud-run-source-deploy] in region [REGION] will be created. Do you want to continue (Y/n)?
그러면 Artifact Registry 저장소에 소스 코드를 업로드하고 컨테이너 이미지를 빌드합니다.
Building using Buildpacks and deploying container ... * Building and deploying new service... Building Container. OK Creating Container Repository... OK Uploading sources... * Building Container... Logs are available at ...
그런 다음 배포가 완료될 때까지 잠시 기다립니다. 성공하면 명령줄에 다음과 같은 서비스 URL이 표시됩니다.
... OK Building and deploying new service... Done. OK Creating Container Repository... OK Uploading sources... OK Building Container... Logs are available at ... OK Creating Revision... Creating Service. OK Routing traffic... OK Setting IAM Policy... Done. Service [SERVICE]... has been deployed and is serving 100 percent of traffic. Service URL: https://SERVICE-PROJECTHASH-REGIONID.a.run.app
다음 명령어를 사용하여 서비스 URL을 가져올 수 있습니다.
SERVICE_URL=$( \ gcloud run services describe helloworld-python \ --platform managed \ --region $REGION \ --format "value(status.url)" \ ) echo $SERVICE_URL
그러면 다음과 같이 표시됩니다.
https://helloworld-python-PROJECTHASH-REGIONID.a.run.app
이제 웹브라우저에서 서비스 URL을 열어 애플리케이션을 사용할 수 있습니다.
Cloud Shell에서 애플리케이션을 호출할 수도 있습니다.
curl $SERVICE_URL?who=me
그러면 예상되는 인사말이 표시됩니다.
Hello me!
축하합니다. 이제 Cloud Run에 애플리케이션을 배포했습니다. Cloud Run은 수신된 요청을 처리하기 위해 컨테이너 이미지를 자동 및 수평 확장한 다음 수요가 감소하면 축소합니다. 요청 처리 도중 소비한 CPU, 메모리, 네트워킹에 대해서만 비용을 지불하면 됩니다.
7. 삭제
Cloud Run은 서비스를 사용하지 않을 때 비용을 청구하지 않지만 Artifact Registry에 컨테이너 이미지를 저장하는 데는 요금이 계속 청구될 수 있습니다. 저장소 또는 Cloud 프로젝트를 삭제하면 요금이 청구되지 않습니다. Cloud 프로젝트를 삭제하면 프로젝트 내에서 사용되는 모든 리소스에 대한 청구가 중지됩니다.
컨테이너 이미지 저장소를 삭제하려면 다음 안내를 따르세요.
gcloud artifacts repositories delete cloud-run-source-deploy \ --location $REGION
Cloud Run 서비스를 삭제하려면 다음 안내를 따르세요.
gcloud run services delete helloworld-python \ --platform managed \ --region $REGION
Google Cloud 프로젝트를 삭제하려면 다음 안내를 따르세요.
- 현재 프로젝트 ID를 검색합니다.
PROJECT_ID=$(gcloud config get-value core/project)
- 삭제하려는 프로젝트가 맞는지 확인합니다.
echo $PROJECT_ID
- 프로젝트를 삭제합니다.
gcloud projects delete $PROJECT_ID
8. 축하합니다.
간단한 웹 애플리케이션을 만들어 Cloud Run에 배포했습니다.
자세히 알아보기
- Cloud Run 문서 확인
- Cloud Run을 사용한 간단한 3가지 단계로 개발에서 프로덕션으로를 완료하여 더 많은 옵션 살펴보기
- Cloud Run에서 Django를 완료하여 Cloud SQL DB를 만들고, Secret Manager로 사용자 인증 정보를 관리하고, Django를 배포합니다.
- 자세한 내용은 Cloud Run Codelab을 확인하세요.
라이선스
이 작업물은 Creative Commons Attribution 2.0 일반 라이선스에 따라 사용이 허가되었습니다.