Deployment Manager를 사용하여 Python Bookshelf 배포

이 가이드에서는 Google Cloud Deployment Manager를 사용하여 Python Bookshelf 샘플을 배포하는 방법을 보여줍니다.

Deployment Manager는 반복 가능한 선언적 방법으로 Google Cloud Platform(GCP) 리소스를 만드는 방법을 제공하므로, 배포에 필요한 모든 리소스를 한 번에 손쉽게 만들 수 있습니다. Deployment Manager를 사용하면 배포를 업데이트하고 시간 경과에 따라 수정사항을 추적할 수 있습니다. Jinja 또는 Python을 사용하여 템플릿을 만들어서 매개변수화할 수 있으므로 유사한 배포에 대해 템플릿을 공유할 수 있습니다.

목표

  • Bookshelf 샘플 앱 복제 및 구성
  • Create Deployment Manager 구성 및 템플릿
  • Create Deployment Manager 배포
  • Deployment Manager를 사용하여 Bookshelf 샘플 앱 배포

비용

이 가이드에서는 비용이 청구될 수 있는 다음과 같은 Cloud Platform 구성요소를 사용합니다.

  • Compute Engine
  • Cloud Storage
  • Cloud Datastore
  • Cloud Logging
  • Cloud Pub/Sub

가격 계산기를 사용하여 예상 사용량을 기준으로 예상 비용을 산출합니다. GCP 신규 사용자는 무료 평가판을 사용할 수 있습니다.

시작하기 전에

  1. Google 계정에 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

  2. GCP Console의 프로젝트 선택기 페이지에서 GCP 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기 페이지로 이동

  3. Google Cloud Platform 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. Cloud Datastore, Cloud Storage, Cloud Pub/Sub필요한 API를 사용 설정합니다.

    API를 사용 설정합니다.

  5. Cloud SDK 설치 및 초기화.
  6. 시스템에 Python, pip, virtualenv를 설치합니다. 안내는 Google Cloud Platform용 Python 배포 환경 설정을 참조하세요.

Cloud Storage 버킷 만들기

다음 안내에서는 Cloud Storage 버킷을 만드는 방법을 보여줍니다. 버킷은 Cloud Storage에서 데이터를 보관하는 기본 컨테이너입니다.

  1. 터미널 창에서 다음 명령어를 입력합니다.

    gsutil mb gs://[YOUR-BUCKET-NAME]

    입력할 항목의 의미는 다음과 같습니다.

    • [YOUR-BUCKET-NAME]은 Cloud Storage 버킷의 이름을 의미합니다.
  2. 버킷의 기본 액세스제어 목록(ACL)을 public-read로 설정하여 Bookshelf 앱에 업로드된 이미지를 확인합니다.

    gsutil defacl set public-read gs://[YOUR-BUCKET-NAME]

샘플 앱 복제

샘플 애플리케이션은 GitHub(GoogleCloudPlatform/getting-started-python)에서 확인할 수 있습니다.

  1. 저장소를 복제합니다.

    git clone https://github.com/GoogleCloudPlatform/getting-started-python.git
    
  2. 샘플 디렉토리로 이동합니다.

    cd getting-started-python/7-gce
    

앱 구성

  1. 수정하기 위해 config.py를 엽니다.

  2. PROJECT_ID 값을 프로젝트 ID로 설정합니다.

  3. CLOUD_STORAGE_BUCKET 값을 이전 단계에서 만든 버킷 이름으로 설정합니다.

  4. config.py를 저장하고 닫습니다.

로컬 컴퓨터에서 앱 실행

  1. 격리된 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
    

  2. 애플리케이션을 실행합니다.

    python main.py
    
  3. 웹브라우저에서 다음 주소를 입력합니다.

    http://localhost:8080

로컬 웹 서버를 중지하려면 Control+C를 누릅니다. 가상 환경을 종료하려면 deactivate를 입력합니다.

샘플 앱 배포

저장소에 코드 푸시

실행 중인 Compute Engine 인스턴스로 코드를 가져오는 방법에는 여러 가지가 있습니다. 하나는 Cloud Source Repositories를 사용하는 것입니다. 모든 프로젝트에는 Compute Engine 인스턴스에서 손쉽게 사용할 수 있는 Git 저장소가 포함되어 있습니다. 그렇기 때문에 인스턴스를 시작할 때 애플리케이션 코드의 최신 버전을 가져올 수 있습니다. 이 방법은 애플리케이션을 업데이트할 때 새 이미지 또는 인스턴스를 구성할 필요가 없으므로 편리합니다. 기존 인스턴스를 다시 시작하거나 새 인스턴스를 만들기만 하면 됩니다.

Git를 처음 사용하는 경우 git config --global을 사용하여 ID를 설정하세요.

우선 GCP 콘솔의 여기에서 저장소를 만듭니다. 또는 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

[YOUR_PROJECT_ID]는 프로젝트 ID입니다.

배포 만들기

구성이 커밋되고 코드가 Cloud Source Repositories에 업로드되면 Deployment Manager 구성을 사용하여 배포를 만들 수 있습니다.

deployment_manager 디렉토리로 이동합니다.

cd getting-started-python/7-gce/gce/deployment_manager

배포를 만듭니다.

gcloud deployment-manager deployments create my-deployment --config config.yaml

모든 배포 목록을 확인합니다.

gcloud deployment-manager deployments list

배포 및 리소스에 대한 설명을 가져옵니다.

gcloud deployment-manager deployments describe my-deployment

애플리케이션 보기

전달 규칙을 만든 후 구성이 적용되고 트래픽이 인스턴스로 라우팅되기까지 몇 분이 걸릴 수 있습니다. 진행 상황을 확인하려면 다음 명령어를 입력합니다.

gcloud compute backend-services get-health bookshelf-my-deployment-frontend --global

최소 하나 이상의 인스턴스가 HEALTHY를 보고할 때 다음 명령어를 입력하여 부하 분산기의 전달 IP 주소를 가져옵니다.

gcloud compute forwarding-rules list --global

IP 주소의 전달 규칙은 IP_ADDRESS 열에 있습니다. 브라우저에서 목록의 IP 주소를 입력합니다.

이제 앱이 부하 분산 및 자동 확장을 지원하는 Google Cloud Platform에서 실행됩니다.

코드 이해하기

배포 구성

배포가 config.yaml에서 어떻게 구성되는지 확인할 수 있습니다.

imports:
- name: bookshelf.jinja
  path: ./bookshelf.jinja

resources:
- name: bookshelf
  type: bookshelf.jinja
  properties:
    zone: us-central1-f
    machine-type: n1-standard-1
    machine-image: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-9
    min-instances: 1
    max-instances: 10
    target-utilization: 0.6
    scopes:
    - https://www.googleapis.com/auth/cloud-platform

config 파일은 템플릿 파일을 리소스로 가져오고 이를 사용하여 bookshelf 리소스를 정의합니다. 템플릿은 여러 속성을 매개변수로 사용합니다. Deployment Manager 구성 파일 만들기에 대한 자세한 내용은 구성 만들기를 참조하세요.

배포 템플릿의 스키마 구성

다음으로 배포의 구성 파일에서 제공할 것으로 예상되는 매개변수를 정의하고 문서화하는 스키마 파일 bookshelf.jinja.schema를 살펴봅니다. 구성 스키마에 대한 자세한 내용은 스키마 사용을 참조하세요.

info:
  title: Bookshelf GCE Deploy
  author: Google Inc.
  description: Creates a GCE Deployment

imports:
- name: startup-script
  path: ../startup-script.sh

required:
- zone
- machine-type
- min-instances
- max-instances
- scopes

properties:
  zone:
    description: Zone to create the resources in.
    type: string
  machine-type:
    description: Type of machine to use
    type: string
  machine-image:
    description: The OS image to use on the machines
    type: string
  min-instances:
    description: The minimum number of VMs the autoscaler will create
    type: integer
  max-instances:
    description: The maximum number of VMs the autoscaler will create
    type: integer
  target-utilization:
    description: The target CPU usage for the autoscaler to base its scaling on
    type: number
  scopes:
    description: A list of scopes to create the VM with
    type: array
    minItems: 1
    items:
      type: string

배포 템플릿 구성

템플릿은 자동 확장 및 부하 분산이 되는 관리형 인스턴스 그룹을 만들기 위해 여러 리소스를 정의합니다. 생성된 리소스에 대한 전체 설명은 템플릿의 주석을 참조하고 생성 중인 리소스에 대한 자세한 설명은 Compute Engine의 Bookshelf를 검토하세요.

Deployment Manager는 클라우드 리소스를 선언적으로 정의하는 방법을 제공하지만, 리소스의 구성 대부분은 API에 의해 정의됩니다. 예를 들어 인스턴스 템플릿 리소스의 구성 옵션 대부분은 Compute Engine API 참조 문서의 인스턴스 템플릿 리소스 정의에서 찾을 수 있습니다.

템플릿은 Jinja 템플릿 언어를 사용하여 작성됩니다. Deployment Manager 템플릿을 작성할 때 Jinja 또는 Python을 사용할 수 있습니다. Jinja는 선언적인 면이 강해서 읽고 이해하기 쉽다는 이점이 있습니다. 복잡한 배포의 경우에는, Python의 완전한 표현 능력을 통해 작업이 더 간단해질 수 있습니다. 이 경우에는 Jinja가 필요한 리소스를 만드는 데 충분합니다.

템플릿에서 env 사전을 통해 액세스할 수 있는 특정 환경 변수가 자동으로 설정됩니다, 이 경우에는 생성된 리소스에 이름을 할당할 때 다시 사용할 수 있는 이름으로 배포 이름을 참조합니다. 이용 가능한 환경 변수에 대한 자세한 내용은 Deployment Manager 문서에서 템플릿 추가를 참조하세요.

{% set NAME = "bookshelf-" + env["deployment"] %}
{% set SERVICE = "bookshelf-" + env["deployment"] + "-frontend" %}

템플릿은 Compute Engine 가이드에서 사용되는 것과 동일한 시작 스크립트를 사용합니다. 값은 config.yaml을 통해 가져온 다음 여기에 삽입됩니다. 스크립트의 공백이 템플릿에서 제대로 유지되는 것이 중요합니다. Jinja의 들여쓰기 간격 지시문을 사용하여 이 작업을 수행합니다.

            value: |
{{imports['startup-script']|indent(14, true)}}

Deployment Manager Jinja 템플릿에서 템플릿의 다른 곳에서 생성된 리소스를 참조할 수도 있습니다. 이 예에서는 백엔드 서비스가 관리형 인스턴스 그룹의 참조를 사용하여 가리켜야 하는 인스턴스 그룹을 가져옵니다.

- group: $(ref.{{ NAME }}-frontend-group.instanceGroup)
  zone: {{ properties['zone'] }}

config.yaml에서 지정된 속성을 템플릿에서 사용할 수 있습니다.

minNumReplicas: {{ properties['min-instances'] }}
maxNumReplicas: {{ properties['max-instances'] }}
loadBalancingUtilization:
  utilizationTarget: {{ properties['target-utilization'] }}

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하는 방법은 다음과 같습니다.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트를 삭제하는 방법은 다음과 같습니다.

  1. GCP Console에서 리소스 관리 페이지로 이동합니다.

    리소스 관리 페이지로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제 를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

배포 삭제

다음 명령어를 입력하여 배포를 삭제합니다. 이렇게 하면 배포와 관련된 부하 분산기 및 모든 Compute Engine 인스턴스가 삭제됩니다.

gcloud deployment-manager deployments delete my-deployment

다음 단계