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
-
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
サンプルコードのあるディレクトリに移動します。
Linux / macOS
cd python-docs-samples/appengine/standard_python3/django
Windows
cd python-docs-samples\appengine\standard_python3\django
Python の設定を確認する
このチュートリアルでは、Python を使用してサンプル アプリケーションをマシン上で実行します。サンプルコードでは依存関係もインストールする必要があります。
詳細については、Python 開発環境ガイドをご覧ください。
Python のバージョンが 3.8 以降であることを確認します。
python -V
Python 3.8.0
以上が表示される必要があります。Python 仮想環境を作成し、依存関係をインストールします。
Linux / macOS
python -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt
Windows
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 をダウンロードしてローカルマシンにインストールします。
Linux 64 ビット
- Cloud SQL Auth Proxy をダウンロードします。
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.13.0/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.13.0/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.13.0/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.13.0/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.13.0/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.13.0/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.13.0
その他の OS
ここに記載されていないその他のオペレーティング システムの場合は、ソースから 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 インスタンスを作成します。
Console
Google Cloud コンソールで、Cloud SQL の [インスタンス] ページに移動します。
[インスタンスを作成] をクリックします。
[PostgreSQL] をクリックします。
[インスタンス ID] フィールドに「
INSTANCE_NAME
」と入力します。postgres ユーザーのパスワードを入力します。
他のフィールドはデフォルト値を使用します。
[作成] をクリックします。
インスタンスの作成と使用準備が完了するまでに数分かかります。
gcloud
PostgreSQL インスタンスを作成します。
gcloud sql instances create INSTANCE_NAME \ --project PROJECT_ID \ --database-version POSTGRES_13 \ --tier db-f1-micro \ --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_NAME
DATABASE_NAME
を、このインスタンス内のデータベースの名前に置き換えます。
データベース ユーザーを作成するには:
Console
- インスタンス ページで、[ユーザー] タブに移動します。
- [ユーザー アカウントを追加] をクリックします。
- [ユーザー アカウントをインスタンスに追加] ダイアログの「組み込み認証」で次の操作を行います。
DATABASE_USERNAME
というユーザー名を入力します。DATABASE_PASSWORD
というパスワードを入力します。- [追加] をクリックします。
gcloud
最近作成したインスタンス内にデータベース ユーザーを作成します。
gcloud sql users create DATABASE_USERNAME \ --instance INSTANCE_NAME \ --password DATABASE_PASSWORD
PASSWORD
を安全なパスワードに置き換えます。
Secret Manager にシークレット値を保存する
バッキング サービスが構成されたので、Django はこれらのサービスに関する情報を必要とします。このチュートリアルでは、これらの値を Django のソースコードに直接入力せず、Secret Manager を使用してこの情報を安全に保存します。
App Engine スタンダードでは、サービス アカウントを使用して シークレット を操作します。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 に保存します。
Console
Google Cloud コンソールで、[Secret Manager] ページに移動します。
[シークレットの作成] をクリックします。
[名前] フィールドに「
django_settings
」と入力します。[シークレットの値] ダイアログで、
.env
ファイルの内容を貼り付けます。[シークレットの作成] をクリックします。
ローカル設定のオーバーライドを防ぐため、ローカル ファイルを削除します。
gcloud
新しいシークレット
django_settings
を.env
ファイルの値で作成します。gcloud secrets create django_settings --data-file .env
シークレットの作成を確認するには、次のことを確認します。
gcloud secrets describe django_settings gcloud secrets versions access latest --secret django_settings
ローカル設定のオーバーライドを防ぐため、ローカル ファイルを削除します。
rm .env
シークレットへのアクセスを設定します。
Console
- [権限] タブをクリックします。
- [追加] をクリックします。
- [新しいメンバー] フィールドに「
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
ローカル コンピュータでアプリを実行する
バッキング サービスを設定したら、パソコン上でアプリを実行できます。この設定により、ローカルでの開発、スーパーユーザーの作成、データベース移行の適用が可能になります。
別のターミナルで Cloud SQL Auth Proxy を起動します。
Linux / macOS
./cloud-sql-proxy PROJECT_ID:REGION:INSTANCE_NAME
Windows
cloud-sql-proxy.exe PROJECT_ID:REGION:INSTANCE_NAME
このステップで、ローカル パソコンから Cloud SQL インスタンスへのローカルテスト用接続が確立されます。ローカルでのアプリのテストが終了するまで、Cloud SQL Auth Proxy を実行したままにしてください。このプロセスを別のターミナルで実行すると、このプロセスの実行中も作業を継続できます。
元のターミナルで、プロジェクト ID をローカルに設定します(Secret Manager API で使用します)。
Linux / macOS
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Windows
set GOOGLE_CLOUD_PROJECT=PROJECT_ID
Cloud SQL Auth Proxy を使用していることを示す環境変数を設定します(この値はコードで認識できます)。
Linux / macOS
export USE_CLOUD_SQL_AUTH_PROXY=true
Windows
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 を使用する必要があります。
Console
-
In the Google Cloud console, activate Cloud Shell.
Cloud Shell で、組み込みターミナルを使用して
INSTANCE_NAME
インスタンスに接続します。gcloud sql connect INSTANCE_NAME --user postgres
postgres ユーザー パスワードを入力します。
現在、
psql
を使用しています。postgres=>
プロンプトが表示されます。ユーザーを作成します。
CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
PASSWORD
は、ランダムな一意のパスワードに置き換えます。新しいデータベースに対する完全な権限を新しいユーザーに付与します。
GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
psql
を終了します。\q
gcloud
SQL インスタンスへの接続を開始します。
gcloud sql connect INSTANCE_NAME --user postgres
INSTANCE_NAME
は、作成した Cloud SQL インスタンスに置き換えます。postgres ユーザー パスワードを入力します。
現在、
psql
を使用しています。postgres=>
プロンプトが表示されます。ユーザーを作成します。
CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
新しいデータベースに対する完全な権限を新しいユーザーに付与します。
GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_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 について詳細を学習する。