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 コンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Cloud SQL Admin API, Secret Manager, and Cloud Build API を有効にします。
- Google Cloud CLI をインストールします。
-
gcloud CLI を初期化するには:
gcloud init
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Cloud SQL Admin API, Secret Manager, and Cloud Build API を有効にします。
- Google Cloud CLI をインストールします。
-
gcloud CLI を初期化するには:
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.7.2/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.7.2/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.7.2/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.7.2/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.7.2/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.7.2/cloud-sql-proxy.x86.exe を右クリックして [名前を付けてリンク先を保存] を選択して、Cloud SQL Auth Proxy をダウンロードします。ファイル名をcloud-sql-proxy.exe
に変更します。Cloud SQL Auth Proxy Docker イメージ
便宜上、Cloud SQL Auth Proxy を含む複数のコンテナ イメージは、GitHub で Cloud SQL Auth Proxy リポジトリから入手できます。次のコマンドを使用して、最新のイメージをローカルマシンに Docker で pull できます。docker pull gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.7.2
その他の 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
- [権限] タブをクリックします。
- [Add] をクリックします。
- [新しいメンバー] フィールドに「
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
-
Google Cloud コンソールで、「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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトの削除
- Google Cloud コンソールで、[リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
次のステップ
- PostgreSQL を本番環境用に構成する方法を学習する。
- Google Cloud での Django について詳細を学習する。