在 App Engine 彈性環境中執行的 Django 應用程式會根據流量動態調整規模。
本教學課程假設您已熟悉 Django 網路開發流程,如果您是 Django 開發新手,建議先完成編寫第一個 Django 應用程式,再繼續進行後續步驟。
本教學課程以 Django 為例,但您也可以將這個部署程序用於其他以 Django 為基礎的架構,例如 Wagtail 和 Django CMS。
本教學課程使用 Django 6,至少需要 Python 3.12。我們強烈建議使用這個系列的最新版本。App Engine 彈性環境支援的 Python 版本最高為 3.14。
目標
在這個教學課程中,您將執行下列操作:
- 建立並連線至 Cloud SQL 資料庫。
- 建立及使用 Secret Manager 密鑰值。
將 Django 應用程式部署至 App Engine 彈性環境。
在 Cloud Storage 上代管靜態檔案。
費用
在本文件中,您會使用下列 Google Cloud的計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
事前準備
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud SQL Admin API, Secret Manager, and Cloud Build APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud SQL Admin API, Secret Manager, and Cloud Build APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud 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/flexible/django_cloudsqlWindows
cd python-docs-samples\appengine\flexible\django_cloudsql
確認 Python 設定
本教學課程會使用 Python 在您的電腦上執行範例應用程式。範例程式碼也需要安裝依附元件
詳情請參閱 Python 開發環境指南。
確認 Python 版本至少為 3.14。
python -V你應該會看到
Python 3.14.0以上版本。建立 Python 虛擬環境並安裝依附元件:
Linux/macOS
python -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txtWindows
python -m venv venv venv\scripts\activate pip install --upgrade pip pip install -r requirements.txt
下載 Cloud SQL 驗證 Proxy,從本機連線至 Cloud SQL
部署作業完成後,應用程式會使用 App Engine 彈性環境內建的 Cloud SQL Auth Proxy 與您的 Cloud SQL 執行個體進行通訊。不過,如要在本機測試應用程式,您就必須在開發環境安裝並使用 Proxy 本機副本。詳情請參閱 Cloud SQL Auth Proxy 指南。
Cloud SQL Auth Proxy 會使用 Cloud SQL API 與 SQL 執行個體互動。為此,應用程式必須透過 gcloud CLI 進行驗證。
驗證並取得 API 的憑證:
gcloud auth application-default login在本機下載並安裝 Cloud SQL 驗證 Proxy。
Linux 64 位元
- 下載 Cloud SQL 驗證 Proxy:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.linux.amd64
- 將 Cloud SQL 驗證 Proxy 設為允許執行:
chmod +x cloud-sql-proxy
Linux 32 位元
- 下載 Cloud SQL 驗證 Proxy:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.linux.386
- 如果找不到
curl指令,請執行sudo apt install curl,然後重複下載指令。 - 將 Cloud SQL 驗證 Proxy 設為允許執行:
chmod +x cloud-sql-proxy
macOS 64 位元
- 下載 Cloud SQL 驗證 Proxy:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.darwin.amd64
- 將 Cloud SQL 驗證 Proxy 設為允許執行:
chmod +x cloud-sql-proxy
Mac M1
- 下載 Cloud SQL 驗證 Proxy:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.darwin.arm64
- 將 Cloud SQL 驗證 Proxy 設為允許執行:
chmod +x cloud-sql-proxy
Windows 64 位元
在 https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/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.21.1/cloud-sql-proxy.x86.exe 上按一下滑鼠右鍵,然後選取「另存連結為」,下載 Cloud SQL Auth Proxy。將檔案重新命名為cloud-sql-proxy.exe。Cloud SQL 驗證 Proxy Docker 映像檔
Cloud SQL 驗證 Proxy 有不同的容器映像檔,例如
distroless、alpine和buster。預設的 Cloud SQL Auth Proxy 容器映像檔使用distroless,其中不含任何殼層。如需殼層或相關工具,請根據alpine或buster下載映像檔。詳情請參閱「Cloud SQL Auth Proxy 容器映像檔」。您可以使用下列指令,透過 Docker 將最新映像檔提取至本機電腦:
docker pull gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.21.1
其他 OS
如果您的作業系統不在上述說明內,可以從原始碼編譯 Cloud SQL Auth Proxy。您可以選擇將下載內容移至常見位置,例如
PATH上的位置或主目錄。如果您選擇這麼做,請務必在稍後啟動 Cloud SQL 驗證 Proxy 時,使用cloud-sql-proxy指令參照您選擇的位置。- 下載 Cloud SQL 驗證 Proxy:
建立後端服務
本教學課程會使用幾項 Google Cloud 服務,提供支援已部署 Django 專案的資料庫、媒體儲存空間和密鑰儲存空間。這些服務部署在特定區域。為提高服務間的效率,所有服務都應部署在同一個區域。如要進一步瞭解您所在地區附近的區域,請參閱「各區域適用的產品」。
設定 PostgreSQL 適用的 Cloud SQL 執行個體
Django 官方支援多個關聯式資料庫,但對 PostgreSQL 的支援度最高。Cloud SQL 支援 PostgreSQL,因此本教學課程選擇使用這類資料庫。
以下章節說明如何為應用程式建立 PostgreSQL 執行個體、資料庫和資料庫使用者。
建立 PostgreSQL 執行個體:
控制台
前往 Google Cloud 控制台的「Cloud SQL Instances」頁面。
點選「建立執行個體」。
按一下「Choose PostgreSQL」(選擇 PostgreSQL)。
在「SQL 版本」部分,選擇「Enterprise」。
在「版本預設設定」中,選擇「沙箱」。
在「Instance ID」(執行個體 ID) 欄位中輸入
INSTANCE_NAME。輸入 postgres 使用者的密碼。
其他欄位皆使用預設值。
點選「建立執行個體」。
執行個體會在幾分鐘內準備就緒。
gcloud
建立 PostgreSQL 執行個體:
gcloud sql instances create INSTANCE_NAME \ --project PROJECT_ID \ --database-version POSTGRES_16 \ --tier db-n1-standard-2 \ --region REGION
更改下列內容:
INSTANCE_NAME:Cloud SQL 執行個體名稱PROJECT_ID: Google Cloud 專案 IDREGION:Google Cloud 區域
建立執行個體並準備就緒需要幾分鐘的時間。
在建立的執行個體中建立資料庫:
控制台
- 在執行個體頁面中,前往「資料庫」分頁。
- 按一下 [Create database] (建立資料庫)。
- 在「Database Name」(資料庫名稱) 對話方塊中輸入
DATABASE_NAME。 - 點選「建立」。
gcloud
在最近建立的執行個體中建立資料庫:
gcloud sql databases create DATABASE_NAME \ --instance INSTANCE_NAME將
DATABASE_NAME替換為執行個體內的資料庫名稱。
建立資料庫使用者:
控制台
- 在執行個體頁面中,前往「Users」(使用者) 分頁。
- 點選「新增使用者帳戶」。
- 在「內建驗證」下方的「選擇驗證方式」對話方塊中:
- 輸入使用者名稱
DATABASE_USERNAME。 - 輸入「
DATABASE_PASSWORD」的密碼 - 按一下「新增」。
gcloud
在最近建立的執行個體中建立使用者:
gcloud sql users create DATABASE_USERNAME \ --instance INSTANCE_NAME \ --password DATABASE_PASSWORD將
PASSWORD替換為安全密碼。
設定 Cloud Storage 值區
您可以使用 Cloud Storage,將 Django 內含的靜態資產和使用者上傳的媒體儲存在可用性高的物件儲存空間。django-storages[google] 套件會處理 Django 與這個儲存後端的互動。
控制台
前往 Google Cloud 控制台的「Cloud Storage」頁面。
按一下「建立值區」。
輸入下列資訊 (視需要點選「繼續」):
- 針對「Name」(名稱) 輸入「PROJECT_ID_MEDIA_BUCKET」。
- 在「Region」(區域) 中選取 REGION。
- 保留「儲存空間類別」的預設值。
- 如要禁止公開存取,請取消勾選「強制禁止公開存取」。
- 將「存取控管」設為「精細」。
其他欄位皆使用預設值。
點選「建立」。
gcloud
建立 Cloud Storage bucket:
gcloud storage buckets create gs://PROJECT_ID_MEDIA_BUCKET --location=REGION將
MEDIA_BUCKET替換為媒體值區的尾碼。與專案 ID 結合後,即可建立專屬 bucket 名稱。
將密鑰值儲存在 Secret Manager
後端服務設定完成後,Django 需要這些服務的相關資訊。本教學課程不會直接將這些值放入 Django 原始碼,而是使用 Secret Manager 安全地儲存這項資訊。
以 Secret Manager 密鑰的形式建立 Django 環境檔案
您會在安全的 env 檔案中儲存啟動 Django 所需的設定。範例應用程式會使用 Secret Manager API 擷取密鑰值,並使用 django-environ 套件將值載入 Django 環境。密鑰已設定為可供 App Engine 彈性環境存取。
建立名為
.env的檔案,定義資料庫連線字串、媒體 bucket 名稱和新的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 中:
設定密鑰存取權:
控制台
按一下「Permissions」(權限) 分頁標籤。
按一下「授予存取權」。
在「New Members」(新增成員) 欄位中輸入
PROJECT_ID@appspot.gserviceaccount.com,然後按Enter。在「角色」下拉式選單中,選取「Secret Manager 密鑰存取者」。
按一下 [儲存]。
gcloud
將 Secret 存取權授予 App Engine 彈性服務帳戶:
gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
在輸出內容中,確認 bindings 列出新的服務帳戶。
在本機電腦上執行應用程式
設定支援服務後,您現在可以在電腦上執行應用程式。這個設定可進行本機開發、建立超級使用者,以及套用資料庫遷移作業。
在另一個終端機中啟動 Cloud SQL 驗證 Proxy:
Linux/macOS
./cloud-sql-proxy PROJECT_ID:REGION:INSTANCE_NAMEWindows
cloud-sql-proxy.exe PROJECT_ID:REGION:INSTANCE_NAME這個步驟會將本機電腦連線至 Cloud SQL 執行個體,以利進行本機測試。在本機測試應用程式期間,請讓 Cloud SQL 驗證 Proxy 全程保持運作。在另一個終端機中執行這項程序,即可在程序執行期間繼續工作。
在原始終端機中,在本機設定專案 ID (Secret Manager API 使用的專案 ID):
Linux/macOS
export GOOGLE_CLOUD_PROJECT=PROJECT_IDWindows
set GOOGLE_CLOUD_PROJECT=PROJECT_ID設定環境變數,指出您使用的是 Cloud SQL Auth Proxy (程式碼會辨識這個值):
Linux/macOS
export USE_CLOUD_SQL_AUTH_PROXY=trueWindows
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. 你位於意見調查索引頁面。在您電腦上執行的 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 執行個體字串更新cloud_sql_instances的值:... beta_settings: cloud_sql_instances: PROJECT_ID:REGION:INSTANCE_NAME - 執行下列指令上傳應用程式,這項指令會部署
app.yaml中描述的應用程式,並將新部署的版本設為預設版本,將其用來處理所有新流量:gcloud app deploy - 系統提示時,輸入「yes」確認設定。
- 等候更新完成通知訊息。
執行已部署的應用程式
應用程式已部署完成,現在可以存取:
開啟已部署的網站:
gcloud app browse或者,顯示網址並手動開啟:
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。
控制台
-
在 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 擷取具名 Secret 的最新版本,並將其拉入環境 (使用 django-environ):
密鑰可用於儲存多個密鑰值,減少需要設定的不同密鑰數量。
本機密鑰覆寫
如果在本機檔案系統中找到 .env 檔案,系統會使用該檔案,而非 Secret Manager 中的值。在本機建立 .env 檔案有助於進行本機測試 (例如針對 SQLite 資料庫進行本機開發,或使用其他本機設定)。
資料庫連線
settings.py 檔案包含 SQL 資料庫設定。它會使用 django-environ 中的 env.db() 輔助程式,將 DATABASE_URL 中設定的連線字串載入 DATABASES 設定。
在本機執行應用程式並使用 Cloud SQL Auth Proxy 存取代管資料庫時,USE_CLOUD_SQL_AUTH_PROXY 旗標會調整資料庫設定,以使用 Proxy。
雲端儲存的靜態內容
settings.py 檔案也會使用 django-storages,直接將 Cloud Storage 媒體 bucket 整合到專案中:
App Engine app.yaml
app.yaml 檔案包含部署至彈性環境的設定資訊:
清除所用資源
為避免因為本教學課程所用資源,導致系統向 Google Cloud 收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
刪除專案
- 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。
後續步驟
- 瞭解如何設定 PostgreSQL 以供正式環境使用
- 進一步瞭解 Django on Google Cloud