Cloud Deployment Manager를 사용하여 Python Bookshelf 앱 배포

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

Deployment Manager를 사용하면 선언적이고 반복 가능한 프로세스를 통해 배포에 필요한 Google Cloud 리소스를 한 번에 만들 수 있습니다. Deployment Manager를 사용하면 배포를 업데이트하고, 시간 경과에 따라 수정 사항을 추적하고, Jinja 또는 Python을 사용하여 템플릿을 만들고, 템플릿을 매개변수화하여, 유사한 배포에 하나의 템플릿이 공유되도록 할 수 있습니다.

목표

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

비용

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

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. API Datastore API, Cloud Storage API, Pub/Sub API 사용 설정

    API 사용 설정

  5. Google Cloud CLI를 설치합니다.
  6. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  7. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  8. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  9. API Datastore API, Cloud Storage API, Pub/Sub API 사용 설정

    API 사용 설정

  10. Google Cloud CLI를 설치합니다.
  11. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  12. Python, pip, virtualenv를 시스템에 설치합니다. 자세한 내용은 Google Cloud를 위한 Python 개발 환경 설정을 참조하세요.

Cloud Storage 버킷 만들기

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

  1. 터미널 창에서 Cloud Storage 버킷을 만듭니다. YOUR_BUCKET_NAME은 버킷의 이름을 나타냅니다.

    gsutil mb gs://YOUR_BUCKET_NAME
    
  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 -b steps
    
  2. 샘플 디렉토리로 이동합니다.

    cd getting-started-python/7-gce
    

앱 구성

  1. 수정할 config.py을 엽니다.

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

    • CLOUD_STORAGE_BUCKET 값을 Cloud Storage 버킷의 이름으로 설정합니다.

  2. 저장 후 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 저장소를 사용하면 앱을 업데이트할 때 새 이미지 또는 인스턴스를 구성할 필요가 없으므로 편리합니다. 기존 인스턴스를 다시 시작하거나 새 인스턴스를 만들기만 하면 됩니다.

  1. Git를 처음 사용하는 경우 git config --global을 사용하여 ID를 설정합니다.

  2. Cloud Console에서 저장소를 만듭니다.

    저장소 만들기

  3. 그런 다음 [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
    

배포를 만듭니다.

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

  1. deployment_manager 디렉터리로 이동합니다.

    cd getting-started-python/7-gce/gce/deployment_manager
    
  2. 배포를 만듭니다.

    gcloud deployment-manager deployments create my-deployment --config config.yaml
    
  3. 모든 배포 목록을 확인합니다.

    gcloud deployment-manager deployments list
    
  4. 배포 및 리소스에 대한 설명을 가져옵니다.

    gcloud deployment-manager deployments describe my-deployment
    

앱 보기

전달 규칙을 만든 후 구성이 적용되고 트래픽이 인스턴스로 라우팅되기까지 몇 분이 걸릴 수 있습니다.

  1. 진행 상태를 확인하려면 다음 안내를 따르세요.

    gcloud compute backend-services get-health bookshelf-my-deployment-frontend --global
    
  2. 인스턴스 중 하나 이상이 HEALTHY를 보고하면 부하 분산기의 전달 IP 주소를 가져옵니다.

    gcloud compute forwarding-rules list --global
    

    IP 주소 전달 규칙은 IP_ADDRESS 열에 있습니다.

  3. 브라우저에서 목록의 IP 주소를 입력합니다.

    이제 앱이 Google Cloud에서 실행됩니다.

코드 이해하기

배포 구성

배포가 구성된 방법은 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

구성 파일은 템플릿 파일을 리소스로 가져오고 이를 사용해서 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보다 읽고 이해하기 쉽다는 이점이 있습니다. 복잡한 배포의 경우 Python의 완전한 표현 능력을 활용하면 더 간편하게 작업할 수 있습니다. 이 경우 Jinja로도 충분히 필요한 리소스를 만들 수 있습니다.

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

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

템플릿은 Compute Engine 가이드에 사용된 것과 동일한 시작 스크립트를 사용합니다. 스크립트의 콘텐츠가 템플릿에 삽입되고 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 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

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

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

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

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

배포 삭제

배포를 삭제하려면 다음 명령어를 입력합니다. 이 명령어는 배포와 연결된 부하 분산기 및 모든 Compute Engine 인스턴스를 삭제합니다.

gcloud deployment-manager deployments delete my-deployment

다음 단계