GKE で実行される Django アプリは、トラフィックに応じて動的にスケーリングされます。
このチュートリアルは、Django ウェブ開発の知識があることを前提としています。Django 開発を初めて使用する場合は、続行する前に最初の Django アプリを作成するを実施することをおすすめします。
このチュートリアルでは Django について具体的に説明しますが、このデプロイ プロセスは Wagtail や Django CMS などの他の Django ベースのフレームワークでも使用できます。
このチュートリアルでは Django 5 を使用します。Django 5 には Python 3.10 以降が必要です。また、Docker もインストールする必要があります。
目標
このチュートリアルの内容は次のとおりです。
- Cloud SQL データベースを作成して接続する。
- Kubernetes Secret 値を作成して使用する。
- Google Kubernetes Engine に Django アプリをデプロイする。
費用
このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud SQL, GKE and Compute Engine APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
gcloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud SQL, GKE and Compute Engine APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
gcloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init
環境を準備する
サンプルアプリのクローンを作成する
Django サンプルアプリのコードは、GitHub の GoogleCloudPlatform/python-docs-samples リポジトリにあります。
ZIP ファイルとしてサンプルをダウンロードして展開するか、ローカルマシンにリポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.gitサンプルコードのあるディレクトリに移動します。
Linux / macOS
cd python-docs-samples/kubernetes_engine/django_tutorialWindows
cd python-docs-samples\kubernetes_engine\django_tutorial
Python の設定を確認する
このチュートリアルでは、Python を使用してサンプル アプリケーションをマシン上で実行します。サンプルコードでは依存関係もインストールする必要があります。
詳細については、Python 開発環境ガイドをご覧ください。
Python のバージョンが 3.10 以降であることを確認します。
python -VPython 3.10.0以上が表示される必要があります。Python 仮想環境を作成し、依存関係をインストールします。
Linux / macOS
python -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txtWindows
python -m venv venv venv\scripts\activate pip install --upgrade pip pip install -r requirements.txt
ローカルマシンから Cloud SQL Auth Proxy をダウンロードして Cloud SQL に接続する
デプロイされると、アプリは Google Kubernetes Engine 環境に組み込まれている Cloud SQL Auth Proxy を使用して Cloud SQL インスタンスと通信します。ただし、アプリをローカルでテストするには、プロキシのローカルコピーを開発環境にインストールして使用する必要があります。詳しくは、Cloud SQL Auth Proxy ガイドをご覧ください。
Cloud SQL Auth Proxy は、Cloud SQL API を使用して SQL インスタンスとやり取りします。これを行うには、gcloud CLI でアプリケーションの認証を行う必要があります。
API の認証情報を取得して認証します。
gcloud auth application-default loginCloud SQL Auth Proxy をダウンロードしてローカルマシンにインストールします。
Linux 64 ビット
- Cloud SQL Auth Proxy をダウンロードします。
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.linux.amd64
- Cloud SQL Auth Proxy を動作可能にします。
chmod +x cloud-sql-proxy
Linux 32 ビット
- Cloud SQL Auth Proxy をダウンロードします。
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.linux.386
curlコマンドが見つからない場合は、sudo apt install curlを実行してダウンロード コマンドを繰り返します。- Cloud SQL Auth Proxy を動作可能にします。
chmod +x cloud-sql-proxy
macOS 64 ビット
- Cloud SQL Auth Proxy をダウンロードします。
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.darwin.amd64
- Cloud SQL Auth Proxy を動作可能にします。
chmod +x cloud-sql-proxy
Mac M1
- Cloud SQL Auth Proxy をダウンロードします。
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.darwin.arm64
- Cloud SQL Auth Proxy を動作可能にします。
chmod +x cloud-sql-proxy
Windows 64 ビット
https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.x64.exe を右クリックして [名前を付けてリンク先を保存] を選択し、Cloud SQL Auth Proxy をダウンロードします。ファイル名をcloud-sql-proxy.exeに変更します。Windows 32 ビット
https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.x86.exe を右クリックして [名前を付けてリンク先を保存] を選択し、Cloud SQL Auth Proxy をダウンロードします。ファイル名をcloud-sql-proxy.exeに変更します。Cloud SQL Auth Proxy Docker イメージ
Cloud SQL Auth Proxy には、
distroless、alpine、busterなど、さまざまなコンテナ イメージがあります。デフォルトの Cloud SQL Auth Proxy コンテナ イメージでは、シェルを含まないdistrolessを使用します。シェルまたは関連ツールが必要な場合は、alpineまたはbusterを基盤とするイメージをダウンロードします。詳細については、Cloud SQL Auth Proxy コンテナ イメージをご覧ください。次のコマンドを使用して、ローカルマシンに最新のイメージを Docker で pull できます。
docker pull gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.21.1
その他の OS
ここに記載されていないその他のオペレーティング システムの場合は、ソースから Cloud SQL Auth Proxy をコンパイルできます。ダウンロード先は、
PATHの場所やホーム ディレクトリなど、一般的な場所に移動できます。これを行う場合は、チュートリアルの後半で Cloud SQL Auth Proxy を起動する際のcloud-sql-proxyコマンド使用時に、選択したロケーションを必ず参照してください。- Cloud SQL Auth Proxy をダウンロードします。
バッキング サービスを作成する
このチュートリアルでは、さまざまな Google Cloud サービスを使用して、デプロイ済みの Django プロジェクトをサポートするデータベース、メディア ストレージ、シークレット ストレージを準備します。これらのサービスは、特定のリージョンにデプロイされます。サービス間の効率を高めるために、すべてのサービスを同じリージョンにデプロイすることをおすすめします。最も近いリージョンの詳細については、リージョン別に提供されるプロダクトをご覧ください。
Cloud SQL for PostgreSQL インスタンスを設定する
Django は正式に複数のリレーショナル データベースに対応していますが、PostgreSQL に最も対応しています。PostgreSQL は Cloud SQL でサポートされているため、このチュートリアルではそのようなタイプのデータベースを使用します。
次のセクションでは、アプリ用の PostgreSQL インスタンス、データベース、データベース ユーザーの作成について説明します。
PostgreSQL インスタンスを作成します。
コンソール
Google Cloud コンソールで、[Cloud SQL インスタンス] ページに移動します。
[インスタンスを作成] をクリックします。
[PostgreSQL を選択] をクリックします。
[SQL Edition] で、[Enterprise] を選択します。
[エディションのプリセット] で、[サンドボックス] を選択します。
[インスタンス ID] フィールドに「
INSTANCE_NAME」と入力します。postgres ユーザーのパスワードを入力します。
他のフィールドはデフォルト値を使用します。
[インスタンスを作成] をクリックします。
インスタンスを使用できるようになるまで数分かかります。
gcloud
PostgreSQL インスタンスを作成します。
gcloud sql instances create INSTANCE_NAME \ --project PROJECT_ID \ --database-version POSTGRES_16 \ --tier db-n1-standard-2 \ --region REGION
以下を置き換えます。
INSTANCE_NAME: Cloud SQL インスタンス名PROJECT_ID: Google Cloud プロジェクト IDREGION: Google Cloud リージョン
インスタンスの作成と使用準備が完了するまでに数分かかります。
作成したインスタンス内に、データベースを作成します。
Console
- インスタンス ページで、[データベース] タブに移動します。
- [データベースを作成] をクリックします。
- [データベース名] ダイアログで「
DATABASE_NAME」と入力します。 - [作成] をクリックします。
gcloud
最近作成したインスタンス内にデータベースを作成します。
gcloud sql databases create DATABASE_NAME \ --instance INSTANCE_NAMEDATABASE_NAMEを、このインスタンス内のデータベースの名前に置き換えます。
データベース ユーザーを作成するには:
Console
- インスタンス ページで、[ユーザー] タブに移動します。
- [ユーザー アカウントを追加] をクリックします。
- [組み込み認証] の [認証方法を選択してください] ダイアログで、次の操作を行います。
DATABASE_USERNAMEというユーザー名を入力します。DATABASE_PASSWORDというパスワードを入力します。- [追加] をクリックします。
gcloud
最近作成したインスタンス内にデータベース ユーザーを作成します。
gcloud sql users create DATABASE_USERNAME \ --instance INSTANCE_NAME \ --password DATABASE_PASSWORDPASSWORDを安全なパスワードに置き換えます。
サービス アカウントを作成する
プロキシには、Cloud SQL インスタンスに対する編集者の権限を持つサービス アカウントが必要です。サービス アカウントの詳細については、Google Cloud 認証の概要をご覧ください。
- Google Cloud コンソールで、[サービス アカウント] ページに移動します。
- Cloud SQL インスタンスを含むプロジェクトを選択します。
- [サービス アカウントを作成] をクリックします。
- [サービス アカウント名] フィールドに、サービス アカウントのわかりやすい名前を入力します。
- [サービス アカウント ID] を一意のわかりやすい値に変更し、[作成して続行] をクリックします。
-
[ロールを選択] フィールドをクリックして、以下のいずれかのロールを選択します。
- [Cloud SQL] > [Cloud SQL クライアント]
- [Cloud SQL] > [Cloud SQL 編集者]
- [Cloud SQL] > [Cloud SQL 管理者]
- [完了] をクリックして、サービス アカウントの作成を完了します。
- 新しいサービス アカウントの操作メニューをクリックし、[鍵を管理] を選択します。
- [鍵を追加] プルダウン メニューをクリックして、[新しい鍵を作成] をクリックします。
-
鍵のタイプが JSON であることを確認し、[作成] をクリックします。
秘密鍵ファイルがマシンにダウンロードされます。秘密鍵ファイルは、別の場所に移動できます。安全な場所に鍵ファイルを保管してください。
データベースを構成する
データベースにアクセスするための環境変数を設定するには、次のコマンドを使用します。 これらの環境変数はローカルテストに使用されます。
Linux / macOS
export DATABASE_NAME=DATABASE_NAME
export DATABASE_USER=DATABASE_USERNAME
export DATABASE_PASSWORD=DATABASE_PASSWORD
Windows
set DATABASE_USER=DATABASE_USERNAME
set DATABASE_PASSWORD=DATABASE_PASSWORD
GKE の構成を設定する
このアプリケーションは、
pollsという名前の単一の Kubernetes 構成で表されます。polls.yamlで、<your-project-id>を実際のGoogle Cloud プロジェクト ID(PROJECT_ID)に置き換えます。次のコマンドを実行して、
connectionNameの値をメモします。gcloud sql instances describe INSTANCE_NAME --format "value(connectionName)"polls.yamlファイルで、<your-cloudsql-connection-string>をconnectionName値に置き換えます。
ローカル コンピュータでアプリを実行する
バッキング サービスを設定したら、パソコン上でアプリを実行できます。この設定により、ローカルでの開発、スーパーユーザーの作成、データベース移行の適用が可能になります。
別のターミナルで Cloud SQL Auth Proxy を起動します。
Linux / macOS
./cloud-sql-proxy PROJECT_ID:REGION:INSTANCE_NAMEWindows
cloud-sql-proxy.exe PROJECT_ID:REGION:INSTANCE_NAMEこのステップで、ローカル パソコンから Cloud SQL インスタンスへのローカルテスト用接続が確立されます。ローカルでのアプリのテストが終了するまで、Cloud SQL Auth Proxy を実行したままにしてください。このプロセスを別のターミナルで実行すると、このプロセスの実行中も作業を継続できます。
元のターミナルで、プロジェクト ID をローカルに設定します。
Linux / macOS
export GOOGLE_CLOUD_PROJECT=PROJECT_IDWindows
set GOOGLE_CLOUD_PROJECT=PROJECT_IDDjango の移行を実行してモデルとアセットを設定します。
python manage.py makemigrations python manage.py makemigrations polls python manage.py migrate python manage.py collectstaticDjango ウェブサーバーを起動します。
python manage.py runserver 8080ブラウザで、http://localhost:8080 にアクセスします。
Cloud Shell を使用している場合は、[ウェブでプレビュー] ボタンをクリックし、[ポート 8080 でプレビュー] を選択します。
「Hello, world. You're at the polls index.」というテキストを含む簡単なウェブページが表示されます。コンピュータで実行されている Django ウェブサーバーは、サンプルアプリのページを配信します。
Ctrl/Cmd+Cキーを押して、ローカル ウェブサーバーを停止します。
Django 管理コンソールを使用する
Django の管理コンソールにログインするには、スーパー ユーザーを作成する必要があります。データベースにはローカルにアクセスできるため、管理コマンドを実行できます。
スーパーユーザーを作成します。ユーザー名、メールアドレス、パスワードの入力を求められます。
python manage.py createsuperuserローカル ウェブサーバーを起動します。
python manage.py runserverブラウザで、http://localhost:8000/admin にアクセスします。
createsuperuserの実行時に使用したユーザー名とパスワードで管理サイトにログインします。
アプリを GKE にデプロイします。
アプリが Google Cloudにデプロイされると、Gunicorn サーバーが使用されます。Gunicorn は静的コンテンツを処理しないため、アプリは Cloud Storage を使用して静的コンテンツを処理します。
静的リソースの収集とアップロード
Cloud Storage バケットを作成して、一般公開します。
gcloud storage buckets create gs://PROJECT_ID_MEDIA_BUCKET gcloud storage buckets add-iam-policy-binding gs://PROJECT_ID_MEDIA_BUCKET --member=allUsers role=roles/storage.legacyObjectReaderすべての静的コンテンツをローカルで 1 つのフォルダにまとめます。
python manage.py collectstatic静的コンテンツを Cloud Storage にアップロードします。
gcloud storage rsync ./static gs://PROJECT_ID_MEDIA_BUCKET/static --recursivemysite/settings.pyで、STATIC_URLの値を次の URL に設定します。[YOUR_GCS_BUCKET]は実際のバケット名に置き換えます。http://storage.googleapis.com/PROJECT_ID_MEDIA_BUCKET/static/
GKE の設定
GKE を初期化するには、[クラスタ] ページに移動します。
プロジェクトで初めて GKE を使用する場合は、[Kubernetes Engine is getting ready. This may take a minute or more] というメッセージが消えるまで待ちます。
-
gcloud container clusters create polls \ --scopes "https://www.googleapis.com/auth/userinfo.email","cloud-platform" \ --num-nodes 4 --zone "us-central1-a"Project is not fully initialized with the default service accountsのようなエラー メッセージが表示された場合は、Google Kubernetes Engine を初期化する必要があります。GKE の初期化
エラーが表示された場合は、 Google Cloud コンソールに移動してプロジェクトの GKE を初期化します。
[Kubernetes Engine is getting ready. This can take a minute or more」というメッセージが消えるまで待ちます。
クラスタを作成したら、gcloud CLI と統合されている
kubectlコマンドライン ツールを使用して、GKE クラスタとやり取りします。gcloudとkubectlは別々のツールであるため、kubectlが適切なクラスタとやり取りするように構成されていることを確認してください。gcloud container clusters get-credentials polls --zone "us-central1-a"
Cloud SQL の設定
GKE アプリを Cloud SQL インスタンスに接続できるようにするには、いくつかのシークレットが必要です。1 つはインスタンスレベルのアクセス(接続)に必要となり、他の 2 つはデータベース アクセスに必要となります。この 2 つのレベルのアクセス制御の詳細については、インスタンスのアクセス制御をご覧ください。
インスタンス レベルのアクセス用のシークレットを作成するには、サービス アカウントの作成時にダウンロードした JSON サービス アカウント キーの場所
PATH_TO_CREDENTIAL_FILEを指定します(サービス アカウントの作成を参照)。kubectl create secret generic cloudsql-oauth-credentials \ --from-file=credentials.json=PATH_TO_CREDENTIAL_FILEデータベース アクセスのシークレットを作成するには、バッキング サービスの作成時に定義した SQL データベース、ユーザー名、パスワードを使用します。Cloud SQL for PostgreSQL インスタンスを設定するをご覧ください。
kubectl create secret generic cloudsql \ --from-literal=database=DATABASE_NAME \ --from-literal=username=DATABASE_USERNAME \ --from-literal=password=DATABASE_PASSWORD
Cloud SQL プロキシのパブリック Docker イメージを取得します。
docker pull b.gcr.io/cloudsql-docker/gce-proxyDocker イメージをビルドします。
<your-project-id>は実際のプロジェクト ID に置き換えます。docker build -t gcr.io/PROJECT_ID/polls .認証ヘルパーとして
gcloudを使用するように Docker を構成します。これにより、イメージを Container Registry に push できます。gcloud auth configure-dockerDocker イメージを push します。
<your-project-id>を実際のプロジェクト ID に置き換えます。docker push gcr.io/PROJECT_ID/pollsGKE リソースを作成します。
kubectl create -f polls.yaml
GKE にアプリをデプロイする
リソースを作成すると、クラスタ上に polls ポッドが 3 つ生成されます。ポッドのステータスを確認します。
kubectl get pods
ポッドのステータスが Running と表示されるまで数分待ちます。ポッドの準備ができていない場合や再起動が発生した場合は、特定のポッドのログを取得して問題を確認できます。[YOUR-POD-ID] は、前の kubectl get pods コマンドで返された出力の一部です。
kubectl logs [YOUR_POD_ID]
Google Cloudでアプリが実行されていることを確認する
Pod の準備ができたら、ロードバランサの外部 IP アドレスを取得します。
kubectl get services polls
EXTERNAL-IP アドレスをメモしてブラウザで http://[EXTERNAL-IP] に移動し、Django ポーリング ランディング ページを表示して管理者コンソールにアクセスします。
コードを理解する
サンプル アプリケーション
Django サンプルアプリは、Django の標準ツールを使用して作成されています。次のコマンドは、プロジェクトとアンケート アプリを作成します。
django-admin startproject mysite
python manage.py startapp polls
ベースビュー、モデル、ルート構成は、最初の Django アプリを作成する(パート 1およびパート 2)からコピーされました。
データベース構成
settings.py には、SQL データベースの構成が含まれています。
Kubernetes Pod の構成
polls.yaml ファイルには、2 つの Kubernetes リソースが指定されています。1 つ目はServiceで、Django ウェブアプリの一貫した名前と内部 IP アドレスを定義します。2 つ目は、一般公開される外部 IP アドレスを持つ HTTP ロードバランサです。
このサービスはネットワーク名と IP アドレスを提供し、GKE ポッドはこのサービスの背後でアプリのコードを実行します。polls.yaml ファイルは、GKE Pod の宣言型更新を行う deployment を指定します。このサービスは、サービスのセレクタを deployment のラベルと照合し、トラフィックを deployment に送信します。この場合、セレクタ polls はラベル polls と一致します。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトを削除する
- Google Cloud コンソールで [リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
個々のリソースの削除
プロジェクトを削除しない場合は、個々のリソースを削除します。
Google Kubernetes Engine クラスタを削除します。
gcloud container clusters delete pollsContainer Registry に push した Docker イメージを削除します。
gcloud container images delete gcr.io/PROJECT_ID/pollsCloud SQL インスタンスを削除します。
gcloud sql instances delete INSTANCE_NAME
次のステップ
- PostgreSQL を本番環境用に構成する方法を学習する。
- Google Cloudでの Django について詳細を学習する。