이 가이드에서는 Google Compute Engine에서 Python Bookshelf 앱을 실행하는 방법을 보여줍니다. 이 가이드에 따라 기존 Python 웹 앱을 Compute Engine에 배포합니다. App Engine 표준 환경에 대한 가이드의 일부로 Bookshelf 앱 설명서를 살펴봐야 합니다.
목표
- Bookshelf 샘플 앱을 단일 Compute Engine 인스턴스에 배포
- 관리형 인스턴스 그룹을 사용하여 앱을 수평으로 확장
- HTTP 부하 분산을 사용하여 트래픽 전달
- 자동 확장을 사용하여 트래픽 변경에 대응
비용
이 가이드에서는 비용이 청구될 수 있는 다음을 비롯한 Google Cloud Platform(GCP)의 구성요소를 사용합니다.
- Compute Engine
- Cloud Storage
- Cloud Datastore
- Stackdriver Logging
- Cloud Pub/Sub
가격 계산기를 사용하여 예상 사용량을 기준으로 예상 비용을 산출합니다. GCP 신규 사용자는 무료 평가판을 사용할 수 있습니다.
시작하기 전에
-
Google 계정에 로그인합니다.
아직 계정이 없으면 새 계정을 등록하세요.
-
Google Cloud Platform 프로젝트를 선택하거나 만듭니다.
-
Google Cloud Platform 프로젝트에 결제가 사용 설정되어 있는지 확인하세요.
- Cloud Datastore, Cloud Storage, Cloud Pub/Sub APIs를 사용 설정합니다.
- Cloud SDK 설치 및 초기화.
- 시스템에 Python, pip, virtualenv를 설치합니다. 안내는 Google Cloud Platform용 Python 배포 환경 설정을 참조하세요.
Cloud Datastore 초기화
Bookshelf 앱은 Cloud Datastore를 사용하여 도서를 저장합니다. 프로젝트에서 Cloud Datastore를 처음으로 초기화하려면 다음 안내를 따르세요.
GCP Console에서 Cloud Datastore를 엽니다.
데이터 저장소 지역을 선택하고 계속을 클릭합니다. 항목 만들기 페이지까지 진행하면 이 창을 닫습니다. Bookshelf 앱이 Cloud Datastore에서 항목을 만들 수 있습니다.
Cloud Storage 버킷 만들기
다음 안내에서는 Cloud Storage 버킷을 만드는 방법을 보여줍니다. 버킷은 Cloud Storage에서 데이터를 보관하는 기본 컨테이너입니다.
터미널 창에서 다음 명령어를 입력합니다.
gsutil mb gs://[YOUR-BUCKET-NAME]
각 항목의 의미는 다음과 같습니다.
[YOUR-BUCKET-NAME]
은 Cloud Storage 버킷의 이름을 의미합니다.
버킷의 기본 액세스제어 목록(ACL)을
public-read
로 설정하여 Bookshelf 앱에 업로드된 이미지를 확인합니다.gsutil defacl set public-read gs://[YOUR-BUCKET-NAME]
샘플 앱 복제
샘플 앱은 GitHub(GoogleCloudPlatform/getting-started-python)에서 제공됩니다.
저장소를 복제합니다.
git clone https://github.com/GoogleCloudPlatform/getting-started-python.git
샘플 디렉토리로 이동합니다.
cd getting-started-python/7-gce
앱 구성
수정하기 위해
config.py
를 엽니다.PROJECT_ID
값을 프로젝트 ID로 설정합니다.CLOUD_STORAGE_BUCKET 값을 Cloud Storage 버킷 이름으로 설정합니다.
config.py
를 저장하고 닫습니다.
로컬 컴퓨터에서 앱 실행
격리된 Python 환경을 만들고 종속 항목을 설치합니다.
Linux/macOS
virtualenv -p python3 env source env/bin/activate pip install -r requirements.txt
Windows
virtualenv -p python3 env env\scripts\activate pip install -r requirements.txt
Honcho를 사용하여 애플리케이션과 작업 작업자를 모두 로컬에서 실행합니다. 가이드의 Cloud Pub/Sub 부분에서 Honcho 사용에 대해 자세히 알아보세요.
honcho start -f ./procfile worker bookshelf
웹브라우저에서 다음 주소를 입력합니다.
두 로컬 작업을 모두 중단하려면 Control+C를 누릅니다.
단일 인스턴스에 배포
이 섹션에서는 Compute Engine에서 앱의 단일 인스턴스 실행을 단계별로 알아봅니다.
저장소에 코드 푸시
Cloud Source Repositories를 사용하여 프로젝트에서 Git 저장소를 쉽게 만들고 이 저장소에 앱 코드를 업로드할 수 있습니다. 그러면 인스턴스를 시작할 때 저장소에서 앱 코드의 최신 버전을 가져올 수 있습니다. 이 방법은 앱을 업데이트할 때 새 이미지 또는 인스턴스를 구성할 필요가 없으므로 편리합니다. 기존 인스턴스를 다시 시작하거나 새 인스턴스를 만들기만 하면 됩니다.
Git를 처음 사용하는 경우
git config --global
을 사용하여 ID를 설정하세요.Google Cloud Platform Console에서 저장소를 만듭니다.
또는
gcloud
를 사용하여 저장소를 만듭니다.gcloud source repos create [YOUR_REPO]
각 항목의 의미는 다음과 같습니다.
[YOUR_PROJECT_ID]
는 프로젝트 ID입니다.[YOUR_REPO]
는 방금 만든 저장소의 이름입니다.
앱의 코드를 프로젝트 저장소로 내보냅니다.
git commit -am "Updating configuration" git config credential.helper gcloud.sh git remote add cloud https://source.developers.google.com/p/[YOUR_PROJECT_ID]/r/[YOUR_REPO] git push cloud master
시작 스크립트를 사용하여 인스턴스 초기화
Compute Engine 인스턴스에서 코드에 액세스할 수 있으므로 인스턴스에서 코드를 다운로드하고 실행하도록 지시하는 방법이 필요합니다. 인스턴스를 시작하거나 재시작할 때마다 실행되는 시작 스크립트를 인스턴스에 포함하면 됩니다.
다음은 Bookshelf 샘플 앱에 포함된 시작 스크립트입니다.
이 스크립트를 사용하려면
[YOUR_REPO_NAME]
을 저장소 이름으로 바꿉니다.시작 스크립트는 다음과 같은 작업을 수행합니다.
Stackdriver Logging 에이전트를 설치합니다. 에이전트는 syslog에서 자동으로 로그를 수집합니다.
Python 및 Supervisor를 설치합니다. Supervisor는 앱을 데몬으로 실행합니다.
Cloud Source Repositories에서 앱의 소스 코드를 복제하고 종속 항목을 설치합니다.
앱을 실행하도록 Supervisor를 구성합니다. Supervisor는 앱이 예기치 않게 종료되거나 관리자 또는 다른 프로세스에 의해 종료되는 경우 애플리케이션이 다시 시작되는지 확인합니다. 또한 Cloud Logging 에이전트에서 syslog가 수집되도록 앱의
stdout
및stderr
을 syslog로 보냅니다.
Compute Engine 인스턴스 만들기 및 구성
Compute Engine 인스턴스를 생성합니다. 다음 명령어는 새 인스턴스를 만들어 GCP 서비스에 액세스하도록 허용하고 시작 스크립트를 실행합니다. 인스턴스 이름은
my-app-instance
입니다.Linux/macOS
gcloud compute instances create my-app-instance \ --image-family=debian-9 \ --image-project=debian-cloud \ --machine-type=g1-small \ --scopes userinfo-email,cloud-platform \ --metadata-from-file startup-script=gce/startup-script.sh \ --zone us-central1-f \ --tags http-server
Windows
gcloud compute instances create my-app-instance ^ --image-family=debian-9 ^ --image-project=debian-cloud ^ --machine-type=g1-small ^ --scopes userinfo-email,cloud-platform ^ --metadata-from-file startup-script=gce/startup-script.sh ^ --zone us-central1-f ^ --tags http-server
인스턴스 생성의 진행 상황을 확인합니다.
gcloud compute instances get-serial-port-output my-app-instance --zone us-central1-f
시작 스크립트가 완료되면 명령어 출력 끝 부분에
Finished running startup script
가 표시됩니다.인스턴스로 가는 트래픽을 허용하도록 방화벽 규칙을 만듭니다.
Linux/macOS
gcloud compute firewall-rules create default-allow-http-8080 \ --allow tcp:8080 \ --source-ranges 0.0.0.0/0 \ --target-tags http-server \ --description "Allow port 8080 access to http-server"
Windows
gcloud compute firewall-rules create default-allow-http-8080 ^ --allow tcp:8080 ^ --source-ranges 0.0.0.0/0 ^ --target-tags http-server ^ --description "Allow port 8080 access to http-server"
인스턴스의 외부 IP 주소를 가져옵니다.
gcloud compute instances list
실행 중인 애플리케이션을 보려면
http://[YOUR_INSTANCE_IP]:8080
으로 이동합니다.[YOUR_INSTANCE_IP]
는 인스턴스의 외부 IP 주소입니다.
인스턴스 관리 및 모니터링
Google Cloud Platform Console을 사용하여 인스턴스를 모니터링하고 관리할 수 있습니다.
실행 중인 인스턴스를 확인하고
ssh
를 사용하여 연결하려면 Compute > Compute Engine으로 이동합니다.Compute Engine 리소스에서 생성된 모든 로그를 보려면 모니터링 > 로그로 이동합니다. Stackdriver Logging이 자동으로 구성되어 syslog를 포함한 다양한 공통 서비스의 로그를 수집합니다.
여러 인스턴스로 수평 확장
Compute Engine은 수평으로 쉽게 확장할 수 있습니다. Compute Engine은 관리형 인스턴스 그룹과 Compute Engine 자동 확장 처리를 사용하여 필요할 때 자동으로 앱의 새 인스턴스를 만들고 수요가 적은 인스턴스를 종료할 수 있습니다. 또한 HTTP 부하 분산기를 설정하여 관리형 인스턴스 그룹의 인스턴스에 트래픽을 분산시킬 수 있습니다.
배포 스크립트
샘플 앱에는 다음 배포 단계를 자동화하는 스크립트가 포함되어 있습니다.
deploy.sh
라는 스크립트는 여러 인스턴스로 수평 확장의 설명대로 자동 확장되고 부하가 분산된 완전한 앱의 리소스를 배포합니다.다음 단계를 각각 실행하거나
$IMAGE_FAMILY, $IMAGE_PROJECT, $MACHINE_TYPE, $SCOPES 등 환경 변수의 기본값은gce
디렉토리에서gce/deploy.sh
를 실행할 수 있습니다.gce/deploy.sh
의 초기화 섹션에서 검토할 수 있습니다.관리형 인스턴스 그룹 만들기
관리형 인스턴스 그룹은 같은 인스턴스 템플릿을 기반으로 하는 동종 인스턴스 그룹입니다. 인스턴스 템플릿은 소스 이미지, 디스크 크기, 범위, 메타데이터(시작 스크립트 포함) 등 인스턴스 구성을 정의합니다.
먼저 템플릿을 만듭니다.
인스턴스 그룹을 만듭니다.
--size
매개변수는 인스턴스 그룹의 인스턴스 수를 지정합니다. 모든 인스턴스가 시작 스크립트 실행을 완료한 후에 인스턴스의 외부 IP 주소 및 포트8080
을 사용하여 인스턴스에 개별적으로 액세스할 수 있습니다. 인스턴스의 외부 IP 주소를 찾으려면gcloud compute instances list
를 입력하세요. 관리형 인스턴스의 이름은--base-instance-name
매개변수에서 지정한 동일한 프리픽스my-app
으로 시작합니다.
부하 분산기 만들기
테스트 또는 디버깅에는 개별 인스턴스를 사용해도 문제가 없지만 웹 트래픽 전달에는 부하 분산기를 사용하여 사용 가능한 인스턴스에 자동으로 트래픽을 전달하는 것이 좋습니다. 부하 분산기를 만들려면 다음 단계를 따르세요.
상태 확인을 만듭니다. 부하 분산기는 상태 확인을 사용하여 트래픽을 전달할 수 있는 인스턴스를 결정합니다.
이름이 지정된 포트를 만듭니다. HTTP 부하 분산기는 트래픽을 전달할 포트를 파악하기 위해
http
서비스를 확인합니다. 기존 인스턴스 그룹에서 포트8080
에http
라는 이름을 지정합니다.백엔드 서비스를 만듭니다. 백엔드 서비스는 부하 분산된 트래픽의 타겟이며 트래픽을 전달해야 하는 인스턴스 그룹과 사용할 상태 확인을 정의합니다.
백엔드 서비스를 추가합니다.
URL 맵과 프록시를 만듭니다. URL 맵은 어떤 URL을 어떤 백엔드 서비스로 전달해야 하는지를 정의합니다. 이 샘플에서는 백엔드 서비스 하나가 모든 트래픽을 전달합니다. 여러 지역 또는 그룹 사이에서 요청 부하를 분산하려면 백엔드 서비스를 여러 개 만들면 됩니다. 프록시는 트래픽을 수신한 후 URL 맵을 사용하여 백엔드 서비스에 전달합니다.
URL 맵을 만듭니다.
프록시를 만듭니다.
전역 전달 규칙을 만듭니다. 전역 전달 규칙은 공개 IP 주소와 포트를 프록시에 연결합니다.
자동 확장 처리 구성
부하 분산기는 정상적인 모든 인스턴스에 트래픽을 분산시킵니다. 하지만 인스턴스에서 처리할 트래픽이 너무 많은 경우에는 어떻게 해야 할까요? 인스턴스를 직접 더 추가하는 방법이 있습니다. 하지만 더 좋은 방법은 트래픽 요청에 따라 인스턴스를 자동으로 만들고 삭제하도록 Compute Engine 자동 확장 처리를 구성하는 것입니다.
자동 확장 처리를 만듭니다.
위 명령어는 관리형 인스턴스 그룹에서 자동 확장 처리를 만들어 인스턴스를 최대 10개로 자동 확장합니다. 부하 분산기의 사용률이 50%가 넘으면 새 인스턴스가 추가되고 사용률이 50% 아래로 떨어지면 인스턴스가 삭제됩니다.
방화벽 규칙을 만듭니다.
인스턴스 중 하나 이상이
HEALTHY
상태를 보고할 때까지 진행 상태를 확인합니다.gcloud compute backend-services get-health my-app-service --global
앱 보기
부하 분산기의 전달 IP 주소를 가져옵니다.
gcloud compute forwarding-rules list --global
IP 주소의 전달 규칙은
IP_ADDRESS
열에 있습니다.브라우저에서 목록의 IP 주소를 입력합니다. 이제 부하가 분산되고 자동 확장된 앱이 Compute Engine에서 실행 중입니다.
배포 관리 및 모니터링
여러 인스턴스를 관리하는 것도 단일 인스턴스를 관리하는 것처럼 쉽습니다. GCP Console을 사용하여 부하 분산, 자동 확장, 관리형 인스턴스 그룹을 모니터링할 수 있습니다.
인스턴스 그룹과 자동 확장 구성 관리는 Compute > Compute Engine > 인스턴스 그룹 섹션에서 수행할 수 있습니다.
URL 맵과 백엔드 서비스 등 부하 분산 구성 관리는 네트워크 서비스 > 부하 분산 섹션에서 수행할 수 있습니다.
삭제
이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하는 방법은 다음과 같습니다.
teardown 스크립트 실행
deploy.sh
스크립트를 실행한 경우 teardown.sh
스크립트를 실행하여 deploy.sh
스크립트에서 만든 모든 리소스를 삭제합니다. 그러면 프로젝트가 deploy.sh
스크립트를 실행하기 전의 상태가 되고 추가로 청구되는 것을 방지합니다. 이 가이드의 앞 부분에서 만든 단일 인스턴스와 Storage 버킷을 삭제하려면 다음 섹션의 안내를 따르세요.
수동으로 리소스 삭제
이 가이드의 단계를 수동으로 수행한 경우, 생성된 클라우드 리소스를 수동으로 삭제할 수 있습니다.
부하 분산기 삭제
GCP Console에서 부하 분산 페이지로 이동합니다.
삭제하려는 부하 분산기 옆에 있는 체크박스를 클릭합니다.
페이지 맨 위에 있는 삭제 버튼을 클릭하여 부하 분산기를 삭제합니다.
부하 분산기 삭제 대화상자에서 연결된 백엔드 서비스와 상태 확인 리소스를 선택합니다.
부하 분산기 삭제 버튼을 클릭하여 부하 분산기 및 연결된 리소스를 삭제합니다.
Compute Engine 관리형 인스턴스 그룹 삭제
Compute Engine 인스턴스 그룹을 삭제하는 방법은 다음과 같습니다.
- GCP Console에서 인스턴스 그룹 페이지로 이동합니다.
- 다음 옆에 있는 체크박스를 클릭합니다. 삭제할 인스턴스 그룹
- 페이지 상단의 삭제 delete를 클릭하여 인스턴스 그룹을 삭제합니다.
단일 Compute Engine 인스턴스 삭제
Compute Engine 인스턴스를 삭제하는 방법:
- GCP Console에서 VM 인스턴스 페이지로 이동합니다.
- 다음 옆에 있는 체크박스를 클릭합니다. 삭제할 인스턴스
- 페이지 상단의 삭제 삭제를 클릭하여 인스턴스를 삭제합니다.
Cloud Storage 버킷 삭제
Cloud Storage 버킷을 삭제하는 방법은 다음과 같습니다.
- GCP Console에서 Cloud Storage 브라우저 페이지로 이동합니다.
- 삭제할 버킷 옆의 체크박스를 클릭합니다.
- 페이지 상단의 삭제 삭제를 클릭하여 버킷을 삭제합니다.