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. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Datastore API, Cloud Storage API, Pub/Sub API APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Datastore API, Cloud Storage API, Pub/Sub API APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Python、pipvirtualenv をシステムにインストールします。手順については、Google Cloud 用の Python 開発環境の設定をご覧ください。

Cloud Storage バケットの作成

以下では、Cloud Storage バケットの作成方法を詳しく説明します。バケットとは、Cloud Storage 内でデータを保持する基本のコンテナです。

  1. ターミナル ウィンドウで Cloud Storage バケットを作成します。ここで、YOUR_BUCKET_NAME はバケットの名前を表します。

    gsutil mb gs://YOUR_BUCKET_NAME
    
  2. Bookshelf アプリでアップロードした画像を表示するには、バケットのデフォルトのアクセス制御リスト(ACL)を public-read に設定します。

    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

ローカル ウェブサーバーを停止するには、Ctrl+C キーを押します。 仮想環境を終了する場合は、「deactivate」と入力します。

サンプルアプリのデプロイ

コードをリポジトリに push する

コードを実行中の Compute Engine インスタンスに取得するにはいくつかの方法があります。そのうちの 1 つは、Cloud Source Repositories を使用するという方法です。 Compute Engine インスタンスに使用可能なすべてのプロジェクトには、Git リポジトリが含まれています。インスタンスは、起動時に最新バージョンのアプリのコードを pull します。Git リポジトリを使用すると、アプリの更新時に新しいイメージやインスタンスを構成する必要がないため便利です。既存のインスタンスを再起動するか、インスタンスを作成するだけで済みます。

  1. Git を初めて使用する場合は、git config --global を使用して自分の ID を設定します。

  2. Cloud Console でリポジトリを作成します。

    リポジトリを作成

  3. アプリのコードをプロジェクトのリポジトリに push します。[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. 少なくとも 1 つのインスタンスで 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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

デプロイを削除する

デプロイを削除するには、次のコマンドを入力します。このコマンドを実行すると、デプロイに関連付けられたロードバランサと Compute Engine インスタンスが削除されます。

gcloud deployment-manager deployments delete my-deployment

次のステップ