Django のような Cloud Run にステートフル アプリケーションをにデプロイすると、サービスが連携して統合プロジェクトを形成します。
このチュートリアルは、Django ウェブ開発の知識があることを前提としています。Django 開発を初めて使用する場合は、続行する前に最初の Django アプリを作成するを実施することをおすすめします。
このチュートリアルでは Django について具体的に説明しますが、このデプロイ プロセスは Wagtail や Django CMS などの他の Django ベースのフレームワークでも使用できます。
このチュートリアルでは Django 4 を使用します。Django 4 には Python 3.8 以降が必要です。
目標
このチュートリアルの内容は次のとおりです。
- Cloud SQL データベースを作成して接続する。
- Secret Manager のシークレット値を作成して使用する。
Django アプリを Cloud Run にデプロイする。
Cloud Storage で静的ファイルをホストする。
Cloud Build を使用してデプロイを自動化する。
料金
このドキュメントでは、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 Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine 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 Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
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/run/django
Windows
cd python-docs-samples\run\django
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 に接続する
デプロイされたアプリは、Cloud Run 環境に組み込まれた 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 Run 環境で統合された静的アセット ホスティング メカニズムを使用します。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 を使用してこの情報を安全に保存します。
Cloud Run と Cloud Build は、それぞれのサービス アカウントを使用してシークレットとやり取りします。サービス アカウントは、プロジェクト番号を含むメールアドレスで識別されます。Secret Manager シークレットとして Django 環境ファイルを作成する
Django の起動に必要な設定を、保護された env ファイルに保存します。サンプルアプリは、Secret Manager API を使用してシークレット値を取得し、django-environ
パッケージを使用して Django 環境に値を読み込みます。シークレットは、Cloud Run と Cloud Build からアクセスできるように構成されています。
.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
ファイルの内容を貼り付けます。[シークレットの作成] をクリックします。
[django_settings の詳細] で、プロジェクト番号をメモします。
projects/PROJECTNUM/secrets/django_settings
ローカル設定のオーバーライドを防ぐため、ローカル ファイルを削除します。
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
プロジェクト番号(
PROJECTNUM
)の値を取得します。export PROJECTNUM=$(gcloud projects describe PROJECT_ID --format='value(projectNumber)')
ローカル設定のオーバーライドを防ぐため、ローカル ファイルを削除します。
rm .env
シークレットへのアクセスを設定します。
Console
- [権限] タブをクリックします。
- [Add] をクリックします。
- [新しいメンバー] フィールドに「
PROJECTNUM-compute@developer.gserviceaccount.com
」と入力し、Enter
を押します。 - [新しいメンバー] フィールドに「
PROJECTNUM@cloudbuild.gserviceaccount.com
」と入力し、Enter
を押します。 - [ロール] プルダウン メニューで [Secret Manager のシークレット アクセサー] を選択します。
- [保存] をクリックします。
gcloud
Cloud Run サービス アカウントにシークレットへのアクセス権を付与します。
gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:PROJECTNUM-compute@developer.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
Cloud Build サービス アカウントにシークレットへのアクセス権を付与します。
gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
出力で、
bindings
が 2 つのサービス アカウントをメンバーとしてリストしていることを確認します。
Django の管理者パスワード用のシークレットを作成する
Django 管理ユーザーは通常、インタラクティブ管理コマンド createsuperuser
を実行して作成されます。
このチュートリアルでは、データ移行を使用して管理ユーザーを作成し、Secret Manager から管理パスワードを取得します。
Console
- Cloud Console で、[シークレット マネージャー] ページに移動します。
[シークレットの作成] をクリックします。
[名前] フィールドに「
superuser_password
」と入力します。[シークレット値] フィールドにランダムな一意のパスワードを入力します。
[シークレットの作成] をクリックします。
[
superuser_password
の詳細] で、プロジェクト番号(projects/PROJECTNUM/secrets/superuser_password
)をメモしておきます。[権限] タブをクリックします。
[Add] をクリックします。
[新しいメンバー] フィールドに「
PROJECTNUM@cloudbuild.gserviceaccount.com
」と入力し、Enter
を押します。[ロール] プルダウン メニューで [Secret Manager のシークレット アクセサー] を選択します。
[保存] をクリックします。
gcloud
ランダムに生成されたパスワードから新しい Secret
superuser_password
を作成します。echo -n "$(cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 30 | head -n1)" | gcloud secrets create superuser_password --data-file -
Cloud Build にシークレットへのアクセス権を付与します。
gcloud secrets add-iam-policy-binding superuser_password \ --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
出力で、
bindings
が Cloud Build のみをメンバーとしてリストしていることを確認します。
Cloud Build に Cloud SQL へのアクセス権を付与する
Cloud Build でデータベースの移行を適用するには、Cloud Build に Cloud SQL へのアクセス権を付与する必要があります。
Console
Cloud Console で、[Identity and Access Management] ページに移動します。
PROJECTNUM@cloudbuild.gserviceaccount.com
のエントリを編集するには、 [編集] をクリックします。[別のロールを追加] をクリックします。
[ロールを選択] ダイアログで、[Cloud SQL クライアント] を選択します。
[保存] をクリックします。
gcloud
Cloud Build に Cloud SQL へのアクセス権を付与します。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \ --role roles/cloudsql.client
ローカル コンピュータでアプリを実行する
バッキング サービスを設定したら、パソコン上でアプリを実行できます。この設定により、ローカルでの開発とデータベース移行の適用が可能になります。データベース移行は Cloud Build にも適用されますが、makemigrations
を行うには、このローカル設定が必要です。
別のターミナルで 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
キーを押して、ローカル ウェブサーバーを停止します。
Cloud Run にアプリをデプロイする
バッキング サービスを設定できたので、Cloud Run サービスをデプロイできるようになりました。
提供された
cloudmigrate.yaml
を使用して、Cloud Build を使用してイメージをビルドし、データベースの移行を実行して、静的アセットにデータを入力します。gcloud builds submit --config cloudmigrate.yaml \ --substitutions _INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION
最初のビルドが完了するまで数分かかります。
ビルドが成功したら、Cloud Run サービスを初めてデプロイし、サービス リージョン、ベースイメージ、接続された Cloud SQL インスタンスを設定します。
gcloud run deploy polls-service \ --platform managed \ --region REGION \ --image gcr.io/PROJECT_ID/polls-service \ --add-cloudsql-instances PROJECT_ID:REGION:INSTANCE_NAME \ --allow-unauthenticated
サービスの URL とともに、デプロイが成功したことを示す出力が表示されます。
Service [polls-service] revision [polls-service-00001-tug] has been deployed and is serving 100 percent of traffic at https://polls-service-<hash>-uc.a.run.app
サービス URL がわかったので、次にこの値を環境変数に設定するようにサービスを更新します。
SERVICE_URL=$(gcloud run services describe polls-service --platform managed \ --region REGION --format "value(status.url)") gcloud run services update polls-service \ --platform managed \ --region REGION \ --set-env-vars CLOUDRUN_SERVICE_URL=$SERVICE_URL
デプロイされたサービスを確認するには、サービスの URL に移動します。
Django 管理にログインするには、URL に
/admin
を加え、ユーザー名admin
と前に設定したパスワードでログインします。
アプリケーションを更新する
最初のプロビジョニングとデプロイの手順は複雑でしたが、更新はより簡単なプロセスです。
Cloud Build のビルドと移行スクリプトを実行します。
gcloud builds submit --config cloudmigrate.yaml \ --substitutions _INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION
リージョンとイメージのみを指定して、サービスをデプロイします。
gcloud run deploy polls-service \ --platform managed \ --region REGION \ --image gcr.io/PROJECT_ID/polls-service
本番環境用の構成
これで 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
最小限の権限の設定
デフォルトでは、このサービスは、デフォルトのコンピューティング サービス アカウントでデプロイされます。ただし、デフォルトのサービス アカウントを使用すると、付与される権限が多くなりすぎることがあります。制限を強める必要がある場合は、独自のサービス アカウントを作成して、サービスに必要な権限のみを割り当てる必要があります。必要な権限は、特定のサービスにより使用されるリソースに応じて、サービスごとに異なります。
このサービスに必要な最小限のプロジェクト ロールは次のとおりです。
- Cloud Run 起動元
- Cloud SQL クライアント
- メディア バケットの Storage 管理者
- Django 設定シークレットの Secret Manager Accessor。(Django 管理シークレットへのアクセスは、サービス自体には必要ありません。)
必要な権限を持つサービス アカウントを作成し、サービスに割り当てるには、次のコマンドを実行します。
gcloud CLI で、必要なロールを持つサービス アカウントを作成します。
gcloud iam service-accounts create polls-service-account SERVICE_ACCOUNT=polls-service-account@PROJECT_ID.iam.gserviceaccount.com # Cloud Run Invoker gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:${SERVICE_ACCOUNT} \ --role roles/run.invoker # Cloud SQL Client gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:${SERVICE_ACCOUNT} \ --role roles/cloudsql.client # Storage Admin, on the media bucket gsutil iam ch \ serviceAccount:${SERVICE_ACCOUNT}:roles/storage.objectAdmin \ gs://MEDIA_BUCKET # Secret Accessor, on the Django settings secret. gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:${SERVICE_ACCOUNT} \ --role roles/secretmanager.secretAccessor
サービスを新しいサービス アカウントに関連付けてデプロイします。
gcloud run services update polls-service \ --platform managed \ --region REGION \ --service-account ${SERVICE_ACCOUNT}
コードを理解する
サンプル アプリケーション
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 するコードが含まれています。
シークレットは、構成する必要のあるさまざまなシークレットの数を減らすために、複数のシークレット値を格納するために使用されます。
superuser_password
をコマンドラインから直接作成することもできますが、この方法ではなくファイルベースの方法が使用されました。コマンドラインから生成したとしたら、head -c
を使用してランダムに生成された文字列の長さを慎重に決定し、ファイルの最後に改行文字がないことを確認する必要がありました(これは、パスワードを Django 管理に入力する際の問題の原因になります)。
CSRF の構成
Django には、クロスサイト リクエスト フォージェリ(CSRF)に対する保護機能が組み込まれています。Django 4.0 以降では、この機能の動作方法が変更されました。そのため、ホストされている URL を Django に指示して、データを送信するユーザーを最適に保護できるようにすることが重要です。
アプリの URL を環境変数として settings.py
ファイルで指定します。これは、Django で関連する設定に使用する値です。
ローカル シークレットのオーバーライド
ローカルのファイル システムで .env
ファイルが見つかった場合は、Secret Manager の値の代わりに使用されます。ローカルで .env
ファイルを作成すると、ローカルテスト(SQLite データベースに対するローカル開発やその他のローカル設定など)に役立ちます。
データベースへの接続
settings.py
ファイルには、SQL データベースの構成が含まれています。USE_CLOUD_SQL_AUTH_PROXY
を設定した場合、DATABASES
設定が Cloud SQL Auth プロキシの使用を推測するように変更されます。
クラウドに保存された静的
また、settings.py
ファイルは、django-storages
を使用して Cloud Storage メディア バケットをプロジェクトに直接統合します。
Cloud Build による自動化
cloudmigrate.yaml
ファイルは、一般的なイメージのビルドステップ(コンテナ イメージを作成してコンテナ レジストリに push する)だけでなく、Django の migrate
コマンドと collectstatic
コマンドも実行します。これにはデータベースへのアクセスが必要です。これは、app-engine-exec-wrapper(Cloud SQL Auth プロキシのヘルパー)を使用して実行されます。
この構成では代入変数が使用されます。ファイルの値を直接変更すると、移行時に --substitutions
フラグを省略できます。
この構成では、既存の移行のみが適用されます。「ローカルでアプリを実行する」で定義された Cloud SQL Auth プロキシ メソッドを使用して、移行をローカルに作成する必要があります。 このテンプレートは、必要に応じて、他の manage.py
コマンドを実行するように拡張できます。
2 つのコマンドを実行せずに 1 つの構成にデプロイを含めるように Cloud Build の構成を拡張するには、Cloud Build を使用した git による継続的デプロイをご覧ください。説明されているように、これには IAM の変更が必要です。
データ移行によるスーパーユーザーの作成
Django 管理コマンド createsuperuser
はインタラクティブにのみ実行できます。つまり、ユーザーがプロンプトに従い情報を入力する場合です。このコマンドを Cloud SQL Proxy で使用し、ローカルの Docker セットアップ内でコマンドを実行できますが、別の方法は、データ移行としてスーパーユーザーを作成することです。
クリーンアップ
このチュートリアルで使用したリソースについて、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 について詳細を学習する。