App Engine フレキシブル環境で実行される Django アプリは、トラフィックに応じて動的に拡張されます。
このチュートリアルは、Django ウェブ開発の知識があることを前提としています。Django 開発を初めて使用する場合は、続行する前に最初の Django アプリを作成するを実施することをおすすめします。
このチュートリアルでは Django について具体的に説明しますが、このデプロイ プロセスは Wagtail や Django CMS などの他の Django ベースのフレームワークでも使用できます。
このチュートリアルでは Django 3 を使用します。Django 3 には Python 3.7 以降が必要です。App Engine フレキシブル環境は Python 3.7 をサポートしています。
目標
このチュートリアルの内容は次のとおりです。
- Cloud SQL データベースを作成して接続する。
- Secret Manager のシークレット値を作成して使用する。
Django アプリを App Engine フレキシブル環境にデプロイします。
Cloud Storage で静的ファイルをホストする。
料金
このドキュメントでは、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/flexible/django_cloudsql
Windows
cd python-docs-samples\appengine\flexible\django_cloudsql
Python の設定を確認する
このチュートリアルでは、Python を使用してサンプル アプリケーションをマシン上で実行します。サンプルコードでは依存関係もインストールする必要があります。
詳細については、Python 開発環境ガイドをご覧ください。
Python のバージョンが 3.7 以降であることを確認します。
python -V
Python 3.7.3
以上が表示される必要があります。Python 仮想環境を作成し、依存関係をインストールします。
Linux / macOS
python -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt
Windows
python -m venv env venv\scripts\activate pip install --upgrade pip pip install -r requirements.txt
ローカルマシンから Cloud SQL Auth プロキシをダウンロードして Cloud SQL に接続する
デプロイされたアプリは、App Engine フレキシブル環境に組み込まれた Cloud SQL Auth プロキシを使用して Cloud SQL インスタンスと通信します。ただし、アプリをローカルでテストするには、プロキシのローカルコピーを開発環境にインストールして使用する必要があります。詳しくは、Cloud SQL Auth プロキシガイドをご覧ください。
Cloud SQL Auth プロキシは、Cloud SQL API を使用して SQL インスタンスとやり取りします。これを行うには、gcloud でアプリケーションの認証を行う必要があります。
API の認証情報を取得して認証します。
gcloud auth application-default login
Cloud SQL Auth プロキシをダウンロードしてローカルマシンにインストールします。
Linux 64 ビット
- Cloud SQL Auth Proxy をダウンロードします。
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
- Cloud SQL Auth Proxy を動作可能にします。
chmod +x cloud_sql_proxy
Linux 32 ビット
- Cloud SQL Auth Proxy をダウンロードします。
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
wget
コマンドが見つからない場合は、sudo apt-get install wget
を実行してダウンロード コマンドを繰り返します。- Cloud SQL Auth Proxy を動作可能にします。
chmod +x cloud_sql_proxy
macOS 64 ビット
- Cloud SQL Auth Proxy をダウンロードします。
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
- Cloud SQL Auth Proxy を動作可能にします。
chmod +x cloud_sql_proxy
macOS 32 ビット
- Cloud SQL Auth Proxy をダウンロードします。
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
- Cloud SQL Auth Proxy を動作可能にします。
chmod +x cloud_sql_proxy
Mac M1
- Cloud SQL Auth Proxy をダウンロードします。
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.arm64
- Cloud SQL Auth Proxy を動作可能にします。
chmod +x cloud_sql_proxy
Windows 64 ビット
https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe を右クリックして [名前を付けてリンク先を保存] を選択し、Cloud SQL Auth Proxy をダウンロードします。ファイル名をcloud_sql_proxy.exe
に変更します。Windows 32 ビット
https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe を右クリックして [名前を付けてリンク先を保存] を選択し、Cloud SQL Auth Proxy をダウンロードします。ファイル名をcloud_sql_proxy.exe
に変更します。Cloud SQL Auth Proxy Docker イメージ
便宜上、Cloud SQL Auth プロキシを含む複数のコンテナ イメージは、GitHub で Cloud SQL Auth プロキシ リポジトリから入手できます。次のコマンドを使用して、最新のイメージをローカルマシンに Docker で pull できます。docker pull gcr.io/cloudsql-docker/gce-proxy:1.30.1
その他の OS
ここに記載されていないその他のオペレーティング システムの場合は、ソースから Cloud SQL Auth Proxy をコンパイルできます。ダウンロード先は、
PATH
の場所やホーム ディレクトリなど、一般的な場所に移動できます。これを行う場合は、チュートリアルの後半で Cloud SQL Auth プロキシを起動する際のcloud_sql_proxy
コマンド使用時に、選択したロケーションを必ず参照してください。- Cloud SQL Auth Proxy をダウンロードします。
バッキング サービスを作成する
このチュートリアルでは、さまざまな Google Cloud サービスを使用して、デプロイ済みの Django プロジェクトをサポートするデータベース、メディア ストレージ、シークレット ストレージを準備します。これらのサービスは、特定のリージョンにデプロイされます。サービス間の効率を高めるために、すべてのサービスを同じリージョンにデプロイすることをおすすめします。最も近いリージョンの詳細については、リージョン別に提供されるプロダクトをご覧ください。
Cloud SQL for PostgreSQL インスタンスを設定する
Django は正式に複数のリレーショナル データベースに対応していますが、PostgreSQL に最も対応しています。PostgreSQL は Cloud SQL でサポートされているため、このチュートリアルではそのようなタイプのデータベースを使用します。
次のセクションでは、アプリ用の PostgreSQL インスタンス、データベース、データベース ユーザーの作成について説明します。
PostgreSQL インスタンスを作成します。
Console
Cloud Console で、[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
を安全なパスワードに置き換えます。
Cloud Storage バケットを設定する
Django に含まれている静的アセットやユーザーがアップロードしたメディアを、Cloud Storage を使用する可用性の高いオブジェクト ストレージに保存できます。django-storages[google]
パッケージは、Django とこのストレージ バックエンドとのインタラクションを処理します。
Console
- In the Google Cloud console, go to the Cloud Storage Buckets page.
- Click Create bucket.
- On the Create a bucket page, enter your bucket information. To go to the next
step, click Continue.
- For Name your bucket, enter a name that meets the bucket naming requirements.
- For Location, select the following: MEDIA_BUCKET
- For Choose a default storage class for your data, select the following: Standard.
- For Choose how to control access to objects, select an Access control option.
- For Advanced settings (optional), specify an encryption method, a retention policy, or bucket labels.
- Click Create.
gcloud
gsutil
コマンドライン ツールは、gcloud CLI のインストールの一部としてインストールされます。
Cloud Storage バケットを作成します。
gsutil mb -l REGION gs://PROJECT_ID_MEDIA_BUCKET
MEDIA_BUCKET
は、メディア バケットの接尾辞に置き換えます。プロジェクト ID と組み合わされることで、一意のバケット名になります。
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
Cloud Console で、[シークレット マネージャー] ページに移動します。
[シークレットの作成] をクリックします。
[名前] フィールドに「
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 フレキシブル サービス アカウントに Secret へのアクセス権を付与します。
gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
ローカル コンピュータでアプリを実行する
バッキング サービスを設定したら、パソコン上でアプリを実行できます。この設定により、ローカルでの開発、スーパーユーザーの作成、データベース移行の適用が可能になります。
別のターミナルで Cloud SQL Auth プロキシを起動します。
Linux / macOS
./cloud_sql_proxy -instances="PROJECT_ID:REGION:INSTANCE_NAME"=tcp:5432
Windows
cloud_sql_proxy.exe -instances="PROJECT_ID:REGION:INSTANCE_NAME"=tcp:5432
このステップで、ローカル パソコンから Cloud SQL インスタンスへのローカルテスト用接続が確立されます。ローカルでのアプリのテストが終了するまで、Cloud SQL Auth プロキシ を実行したままにしてください。このプロセスを別のターミナルで実行すると、このプロセスの実行中も作業を継続できます。
新しいターミナルで、プロジェクト ID をローカルに設定します(Secret Manager API で使用します)。
Linux / macOS
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Windows
set GOOGLE_CLOUD_PROJECT=PROJECT_ID
Cloud SQL Auth プロキシを使用していることを示す環境変数を設定します(この値はコードで認識できます)。
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
ブラウザで、http://localhost:8000 にアクセスします。
「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
を開き、cloud_sql_instances
の値を Cloud SQL インスタンス文字列で更新します。... beta_settings: cloud_sql_instances: PROJECT_ID:REGION:INSTANCE_NAME
- 次のコマンドを実行してアプリをアップロードします。
app.yaml
で説明されているようにアプリがデプロイされ、新しくデプロイされたバージョンがデフォルト バージョンとして設定されます。これにより、すべての新しいトラフィックがこのバージョンによって処理されます。gcloud app deploy
- プロンプトが表示されたら、「yes」と入力して設定を確認します。
- 更新が完了したことを通知するメッセージが表示されるまで待ちます。
デプロイされたアプリを実行する
アプリがデプロイされ、アクセスできるようになりました。
デプロイされたウェブサイトを開きます。
gcloud app browse
または、URL を表示して、手動で開きます。
gcloud app describe --format "value(defaultHostname)"
リクエストは、App Engine フレキシブル環境で実行されているウェブサーバーによって処理されます。
アプリケーションを更新する
アプリケーションを更新するには、コードを変更してから、gcloud app deploy
コマンドを再度実行します。
デプロイすると、アプリの新しいバージョンが作成され、それがデフォルトのバージョンに設定されます。アプリの古いバージョンはそのまま残ります。それらに関連付けられた仮想マシン(VM)インスタンスも同様です。すべてのアプリ バージョンと VM インスタンスが課金対象のリソースとなります。コストを抑えるには、アプリのデフォルト以外のバージョンを削除します。
本番環境用の構成
これで 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 するコードが含まれています。
シークレットは、構成する必要のあるさまざまなシークレットの数を減らすために、複数のシークレット値を格納するために使用されます。
ローカル シークレットのオーバーライド
ローカルのファイル システムで .env
ファイルが見つかった場合は、Secret Manager の値の代わりに使用されます。ローカルで .env
ファイルを作成すると、ローカルテスト(SQLite データベースに対するローカル開発やその他のローカル設定など)に役立ちます。
データベースへの接続
settings.py
ファイルには、SQL データベースの構成が含まれています。USE_CLOUD_SQL_AUTH_PROXY
を設定した場合、DATABASES
設定が Cloud SQL Auth プロキシの使用を推測するように変更されます。
クラウドに保存された静的
また、settings.py
ファイルは、django-storages
を使用して Cloud Storage メディア バケットをプロジェクトに直接統合します。
App Engine app.yaml
app.yaml
ファイルには、フレキシブル環境へのデプロイに必要な構成情報が含まれています。
クリーンアップ
このチュートリアルで使用したリソースについて、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 について詳細を学習する。