App Engine スタンダード環境で実行される Django アプリは、トラフィックに応じて動的に拡張されます。
このチュートリアルは、Django ウェブ開発の知識があることを前提としています。Django 開発を初めて使用する場合は、続行する前に最初の Django アプリを作成するを実施することをおすすめします。
このチュートリアルでは Django について具体的に説明しますが、このデプロイ プロセスは Wagtail や Django CMS などの他の Django ベースのフレームワークでも使用できます。
このチュートリアルでは Django 4 を使用します。Django 4 には Python 3.8 以降が必要です。App Engine スタンダード環境では、Python 3.8 を含めて、Python 3.7 以降がサポートされています。
目標
このチュートリアルの内容は次のとおりです。
- Cloud SQL データベースを作成して接続する。
- Secret Manager のシークレット値を作成して使用する。
- Django アプリを App Engine スタンダード環境にデプロイする。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud SQL Admin API, Secret Manager, and Cloud Build APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- まだ行っていない場合は、App Engine を初期化し、使用するリージョンをまだ選択します。
gcloud app create
環境を準備する
サンプルアプリのクローンを作成する
Django サンプルアプリのコードは、GitHub の GoogleCloudPlatform/python-docs-samples リポジトリにあります。
ZIP ファイルとしてサンプルをダウンロードして展開するか、ローカルマシンにリポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
サンプルコードのあるディレクトリに移動します。
cd python-docs-samples/appengine/standard_python3/django
cd python-docs-samples\appengine\standard_python3\django
Python の設定を確認する
このチュートリアルでは、Python を使用してサンプル アプリケーションをマシン上で実行します。サンプルコードでは依存関係もインストールする必要があります。
詳細については、Python 開発環境ガイドをご覧ください。
Python のバージョンが 3.8 以降であることを確認します。
python -V
Python 3.8.0
以上が表示される必要があります。Python 仮想環境を作成し、依存関係をインストールします。
python -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt
python -m venv venv venv\scripts\activate pip install --upgrade pip pip install -r requirements.txt
ローカルマシンから Cloud SQL Auth Proxy をダウンロードして Cloud SQL に接続する
デプロイされたアプリは、App 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 login
Cloud SQL Auth Proxy をダウンロードしてローカルマシンにインストールします。
- Cloud SQL Auth Proxy をダウンロードします。
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.14.2/cloud-sql-proxy.linux.amd64
- Cloud SQL Auth Proxy を動作可能にします。
chmod +x cloud-sql-proxy
- Cloud SQL Auth Proxy をダウンロードします。
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.14.2/cloud-sql-proxy.linux.386
curl
コマンドが見つからない場合は、sudo apt install curl
を実行してダウンロード コマンドを繰り返します。- Cloud SQL Auth Proxy を実行可能にします。
chmod +x cloud-sql-proxy
- Cloud SQL Auth Proxy をダウンロードします。
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.14.2/cloud-sql-proxy.darwin.amd64
- Cloud SQL Auth Proxy を実行可能にします。
chmod +x cloud-sql-proxy
- Cloud SQL Auth Proxy をダウンロードします。
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.14.2/cloud-sql-proxy.darwin.arm64
- Cloud SQL Auth Proxy を動作可能にします。
chmod +x cloud-sql-proxy
https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.14.2/cloud-sql-proxy.x64.exe を右クリックして [名前を付けてリンク先を保存] を選択し、Cloud SQL Auth Proxy をダウンロードします。ファイル名を cloud-sql-proxy.exe
に変更します。https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.14.2/cloud-sql-proxy.x86.exe を右クリックして [名前を付けてリンク先を保存] を選択し、Cloud SQL Auth Proxy をダウンロードします。ファイル名を cloud-sql-proxy.exe
に変更します。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.14.2
ここに記載されていないその他のオペレーティング システムの場合は、ソースから Cloud SQL Auth Proxy をコンパイルできます。 ダウンロード先は、
PATH
の場所やホーム ディレクトリなど、一般的な場所に移動できます。これを行う場合は、チュートリアルの後半で Cloud SQL Auth Proxy を起動する際のcloud-sql-proxy
コマンド使用時に、選択したロケーションを必ず参照してください。- Cloud SQL Auth Proxy をダウンロードします。
バッキング サービスを作成する
このチュートリアルでは、 Google Cloud の複数のサービスを使用して、デプロイされた Django プロジェクトをサポートするデータベース、メディア ストレージ、シークレット ストレージを準備します。これらのサービスは、特定のリージョンにデプロイされます。サービス間の効率を高めるために、すべてのサービスを同じリージョンにデプロイすることをおすすめします。最も近いリージョンの詳細については、リージョン別に提供されるプロダクトをご覧ください。
このチュートリアルでは、App Engine スタンダード環境で統合された静的アセット ホスティング メカニズムを使用します。Cloud SQL for PostgreSQL インスタンスを設定する
Django は正式に複数のリレーショナル データベースに対応していますが、PostgreSQL に最も対応しています。PostgreSQL は Cloud SQL でサポートされているため、このチュートリアルではそのようなタイプのデータベースを使用します。
次のセクションでは、アプリ用の PostgreSQL インスタンス、データベース、データベース ユーザーの作成について説明します。
PostgreSQL インスタンスを作成します。
Google Cloud のコンソールで、[Cloud SQL インスタンス] ページに移動します。
[インスタンスを作成] をクリックします。
[PostgreSQL を選択] をクリックします。
[SQL エディション] で [Enterprise] を選択します。
[エディションのプリセット] で [サンドボックス] を選択します。
[インスタンス ID] フィールドに「
」と入力します。INSTANCE_NAME postgres ユーザーのパスワードを入力します。
他のフィールドはデフォルト値を使用します。
[インスタンスを作成] をクリックします。
インスタンスの使用準備が完了するまでに数分かかります。
PostgreSQL インスタンスを作成します。
gcloud sql instances create
INSTANCE_NAME \ --projectPROJECT_ID \ --database-version POSTGRES_16 \ --tier db-n1-standard-2 \ --region REGION
以下を置き換えます。
INSTANCE_NAME
: Cloud SQL インスタンス名PROJECT_ID
: Google Cloud プロジェクト IDREGION
: Google Cloud リージョン
インスタンスの作成と使用準備が完了するまでに数分かかります。
作成したインスタンス内に、データベースを作成します。
- インスタンス ページで、[データベース] タブに移動します。
- [データベースを作成] をクリックします。
- [データベース名] ダイアログで「
」と入力します。DATABASE_NAME - [作成] をクリックします。
最近作成したインスタンス内にデータベースを作成します。
gcloud sql databases create
DATABASE_NAME \ --instanceINSTANCE_NAME DATABASE_NAME
を、このインスタンス内のデータベースの名前に置き換えます。
データベース ユーザーを作成するには:
- インスタンス ページで、[ユーザー] タブに移動します。
- [ユーザー アカウントを追加] をクリックします。
- [認証方法を選択してください] ダイアログの [組み込み認証] で次の操作を行います。
というユーザー名を入力します。DATABASE_USERNAME
というパスワードを入力します。DATABASE_PASSWORD - [追加] をクリックします。
最近作成したインスタンス内にデータベース ユーザーを作成します。
gcloud sql users create
DATABASE_USERNAME \ --instanceINSTANCE_NAME \ --passwordDATABASE_PASSWORD PASSWORD
を安全なパスワードに置き換えます。
Secret Manager にシークレット値を保存する
バッキング サービスが構成されたので、Django はこれらのサービスに関する情報を必要とします。このチュートリアルでは、これらの値を Django のソースコードに直接入力せず、Secret Manager を使用してこの情報を安全に保存します。
Secret Manager シークレットとして Django 環境ファイルを作成する
Django の起動に必要な設定を、保護された env ファイルに保存します。サンプルアプリは、Secret Manager API を使用してシークレット値を取得し、django-environ
パッケージを使用して Django 環境に値を読み込みます。シークレットは、App Engine スタンダード環境でアクセスできるように構成されています。
.env
という名前のファイルを作成し、データベースの接続文字列、メディア バケット名、新しいSECRET_KEY
値を定義します。echo DATABASE_URL=postgres://
DATABASE_USERNAME :DATABASE_PASSWORD @//cloudsql/PROJECT_ID :REGION:INSTANCE_NAME /DATABASE_NAME > .env echo GS_BUCKET_NAME=PROJECT_ID _MEDIA_BUCKET >> .env echo SECRET_KEY=$(cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n1) >> .envシークレットを Secret Manager に保存します。
Google Cloud のコンソールで、[Secret Manager] ページに移動します。
[シークレットの作成] をクリックします。
[名前] フィールドに「
django_settings
」と入力します。[シークレットの値] ダイアログで、
.env
ファイルの内容を貼り付けます。[シークレットの作成] をクリックします。
ローカル設定のオーバーライドを防ぐため、ローカル ファイルを削除します。
新しいシークレット
django_settings
を.env
ファイルの値で作成します。gcloud secrets create django_settings --data-file .env
ローカル設定のオーバーライドを防ぐため、ローカル ファイルを削除します。
rm .env
シークレットへのアクセスを設定します。
[権限] タブをクリックします。
[アクセス権を付与] をクリックします。
[新しいメンバー] フィールドに「
PROJECT_ID@appspot.gserviceaccount.com
」と入力し、Enter
を押します。[ロール] プルダウン メニューで [Secret Manager のシークレット アクセサー] を選択します。
[保存] をクリックします。
gcloud
App Engine スタンダード サービス アカウントにシークレットへのアクセス権を付与します。
gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:
PROJECT_ID @appspot.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
出力で、bindings
に新しいサービス アカウントがリストされていることを確認します。
ローカル コンピュータでアプリを実行する
バッキング サービスを設定したら、パソコン上でアプリを実行できます。この設定により、ローカルでの開発、スーパーユーザーの作成、データベース移行の適用が可能になります。
別のターミナルで Cloud SQL Auth Proxy を起動します。
./cloud-sql-proxy
PROJECT_ID :REGION :INSTANCE_NAME cloud-sql-proxy.exe
PROJECT_ID :REGION :INSTANCE_NAME このステップで、ローカル パソコンから Cloud SQL インスタンスへのローカルテスト用接続が確立されます。ローカルでのアプリのテストが終了するまで、Cloud SQL Auth Proxy を実行したままにしてください。このプロセスを別のターミナルで実行すると、このプロセスの実行中も作業を継続できます。
元のターミナルで、プロジェクト ID をローカルに設定します(Secret Manager API で使用します)。
export GOOGLE_CLOUD_PROJECT=
PROJECT_ID set GOOGLE_CLOUD_PROJECT=
PROJECT_ID Cloud SQL Auth Proxy を使用していることを示す環境変数を設定します(この値はコードで認識できます)。
export USE_CLOUD_SQL_AUTH_PROXY=true
set USE_CLOUD_SQL_AUTH_PROXY=true
Django の移行を実行してモデルとアセットを設定します。
python manage.py makemigrations python manage.py makemigrations polls python manage.py migrate python manage.py collectstatic
Django ウェブサーバーを起動します。
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
の実行時に使用したユーザー名とパスワードで管理サイトにログインします。
App Engine スタンダード環境のアプリをデプロイする
すべてのバッキング サービスを設定し、アプリケーションをローカルでテストしたら、アプリを App Engine スタンダード環境にデプロイできます。
- 次のコマンドを実行してアプリをアップロードします。
app.yaml
で説明されているようにアプリがデプロイされ、新しくデプロイされたバージョンがデフォルト バージョンとして設定されます。これにより、すべての新しいトラフィックがこのバージョンによって処理されます。gcloud app deploy
- プロンプトが表示されたら、「yes」と入力して設定を確認します。
- 更新が完了したことを通知するメッセージが表示されるまで待ちます。
app.yaml
を開き、デプロイした URL でAPPENGINE_URL
の値を更新します。... env_variables: APPENGINE_URL: https://
PROJECT_ID .uc.r.appspot.com- 構成の変更をアップロードします。
gcloud app deploy
デプロイされたアプリを実行する
アプリがデプロイされ、アクセスできるようになりました。
デプロイされたウェブサイトを開きます。
gcloud app browse
または、URL を表示して、手動で開きます。
gcloud app describe --format "value(defaultHostname)"
リクエストは、App Engine スタンダード環境で実行されているウェブサーバーによって処理されます。
アプリケーションを更新する
アプリケーションを更新するには、コードを変更してから、gcloud app deploy
コマンドを再度実行します。
デプロイすると、アプリの新しいバージョンが作成され、それがデフォルトのバージョンに設定されます。アプリの古いバージョンはそのまま残ります。これらのアプリ バージョンはすべて課金対象のリソースとなります。コストを抑えるには、アプリのデフォルト以外のバージョンを削除します。
本番環境用の構成
これで Django のデプロイが機能するようになりましたが、アプリケーションが本番環境に対応できるよう、追加の手順を行う必要があります。
デバッグを無効にする
mysite/settings.py
の DEBUG
変数が False
に設定されていることを確認します。これにより、ユーザーに詳細なエラーページが表示されなくなり、設定に関する情報が漏洩を防ぎます。
データベース ユーザーの権限を制限する
Cloud SQLを使用して作成されたすべてのユーザーには、cloudsqlsuperuser
ロールに関連付けられた特権(CREATEROLE
、CREATEDB
、および LOGIN
)があります。
Django データベース ユーザーにこれらの権限が付与されないようにするには、PostgreSQL でユーザーを手動で作成します。psql
インタラクティブ ターミナルをインストールするか、このツールがプリインストールされている Cloud Shell を使用する必要があります。
-
In the Google Cloud console, activate Cloud Shell.
Cloud Shell で、組み込みターミナルを使用して
インスタンスに接続します。INSTANCE_NAME gcloud sql connect
INSTANCE_NAME --user postgrespostgres ユーザー パスワードを入力します。
現在、
psql
を使用しています。postgres=>
プロンプトが表示されます。ユーザーを作成します。
CREATE USER
DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD ';PASSWORD
は、ランダムな一意のパスワードに置き換えます。新しいデータベースに対する完全な権限を新しいユーザーに付与します。
GRANT ALL PRIVILEGES ON DATABASE
DATABASE_NAME TODATABASE_USERNAME ;psql
を終了します。\q
SQL インスタンスへの接続を開始します。
gcloud sql connect
INSTANCE_NAME --user postgresINSTANCE_NAME
は、作成した Cloud SQL インスタンスに置き換えます。postgres ユーザー パスワードを入力します。
現在、
psql
を使用しています。postgres=>
プロンプトが表示されます。ユーザーを作成します。
CREATE USER
DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD ';新しいデータベースに対する完全な権限を新しいユーザーに付与します。
GRANT ALL PRIVILEGES ON DATABASE
DATABASE_NAME TODATABASE_USERNAME ;psql
を終了します。\q
コードを理解する
サンプル アプリケーション
Django サンプルアプリは、Django の標準ツールを使用して作成されています。次のコマンドは、プロジェクトとアンケート アプリを作成します。
django-admin startproject mysite
python manage.py startapp polls
ベースビュー、モデル、ルート構成は、最初の Django アプリを作成する(パート 1およびパート 2)からコピーされました。
Secret Manager のシークレット
settings.py
ファイルには、Secret Manager Python API を使用して指定されたシークレットの最新バージョンを取得し、(django-environ
を使用して)その環境に pull するコードが含まれています。
シークレットは、構成する必要のあるさまざまなシークレットの数を減らすために、複数のシークレット値を格納するために使用されます。
CSRF の構成
Django には、クロスサイト リクエスト フォージェリ(CSRF)に対する保護機能が組み込まれています。Django 4.0 以降では、この機能の動作方法が変更されました。そのため、ホストされている URL を Django に指示して、データを送信するユーザーを最適に保護できるようにすることが重要です。
アプリの URL を環境変数として settings.py
ファイルで指定します。これは、Django で関連する設定に使用する値です。
ローカル シークレットのオーバーライド
ローカルのファイル システムで .env
ファイルが見つかった場合は、Secret Manager の値の代わりに使用されます。ローカルで .env
ファイルを作成すると、ローカルテスト(SQLite データベースに対するローカル開発やその他のローカル設定など)に役立ちます。
データベースへの接続
settings.py
ファイルには、SQL データベースの構成が含まれています。django-environ
の env.db()
ヘルパーを使用して、DATABASE_URL
で設定された接続文字列を DATABASES
設定に読み込みます。
アプリケーションをローカルで実行し、Cloud SQL Auth Proxy を使用してホスト型データベースにアクセスする場合、USE_CLOUD_SQL_AUTH_PROXY
フラグはプロキシを使用するようにデータベースの設定を調整します。
ホストされる静的コンテンツ
app.yaml
ファイルには、App Engine にデプロイするための構成情報が含まれています。
この app.yaml
ファイルは、App Engine が static/
ディレクトリから静的ファイルを提供することを示します。
アプリを DEBUG
を有効にしてローカルで実行すると、これらのファイルは Django によってローカルで提供されます。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトの削除
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
次のステップ
- PostgreSQL を本番環境用に構成する方法を学習する。
- Google Cloudでの Django の詳細を確認する。