部署 Python 應用程式

部署您的應用程式以上傳到 App Engine 上執行。部署應用程式時,您必須在 App Engine 中建立應用程式的版本及對應的服務。您可以部署完整的應用程式 (包括所有原始碼和設定檔),也可以部署及更新個別版本或設定檔

若要以程式輔助方式來部署應用程式,請使用 Admin API

事前準備

在您部署應用程式之前,請先完成下列事項:

安裝 gcloud CLI

如要使用 gcloud CLI 部署應用程式,您必須下載、安裝並初始化 gcloud CLI

下載 SDK

如果您已安裝 gcloud CLI,並想將其設為使用某個 Google Cloud 專案 ID,而非使用初始化時設定的 ID,請參閱「管理 gcloud CLI 設定」。

使用 Proxy

如果您是從使用 HTTP 或 HTTPS Proxy 的系統執行部署指令,則必須設定工具,讓它能夠透過 Proxy 通訊。

執行下列指令來設定 gcloud CLI:

gcloud config set proxy/type [PROXY_TYPE]
gcloud config set proxy/address [PROXY_ADDRESS]
gcloud config set proxy/port [PROXY_PORT]

您也可以為 Proxy 設定 usernamepassword。詳情請參閱 gcloud config

部署應用程式

如要將應用程式部署至 App Engine,請在設定檔所在的位置 (例如 app.yaml) 使用 gcloud app deploy 指令。

選擇不重複的版本 ID

對於手動調整規模的執行個體,版本 ID 開頭應為字母,以便與數字執行個體 ID 有所區別。這可確保要求會轉送至正確的目的地,避免與 123-dot-my-service.[REGION_ID].r.appspot.com 之類的網址模式混淆不清,這類模式可以有兩種解讀方式:

  • 如果 123 版本存在,要求會轉送至 my-service 服務的 123 版本。
  • 如果 123 版本不存在,要求會改為轉送至執行 my-service 服務版本的執行個體 ID 123

對於設定成自動調整或基本資源調度的執行個體,您可以任意為版本命名,因為系統不支援將這些執行個體指定為目標

gcloud app deploy [CONFIGURATION_FILES]

根據預設,這項指令會從目前目錄部署 app.yaml 設定檔。如果您從不含應用程式 app.yaml 的目錄執行指令,或是想要部署多個應用程式,請將 [CONFIGURATION_FILES] 替換為一或多個設定檔的路徑。請使用單一空格分隔路徑名稱。

選用標記:

  • --version:指定自訂版本 ID。根據預設,App Engine 會產生版本 ID。
  • --no-promote:部署應用程式,但不將所有流量自動轉送至該版本。根據預設,您部署的每個版本都會自動設為接收 100% 的流量。
  • --project:指定替代 Google Cloud 專案 ID,而不使用您在 gcloud CLI 中初始化為預設值的 ID。

詳情請參閱 gcloud app deploy 參考資料,或是透過指令列執行 gcloud help

範例:

gcloud app deploy
gcloud app deploy app.yaml dos.yaml index.yaml
gcloud app deploy --version [YOUR_VERSION_ID] --no-promote --project [YOUR_PROJECT_ID]

如果您部署版本的版本 ID 與目前已在 App Engine 的版本相同,則您部署的檔案會覆寫現有版本。如果現有版本目前正在提供流量,可能會因傳送至應用程式的流量遭到中斷而產生問題。您可以針對待部署的新版本使用不同的版本 ID,接著再將流量移至新版本,即可避免流量中斷的情形發生。

部署多服務應用程式

當應用程式納入多個服務時,您可以個別部署和更新指定的服務,或同時部署和更新所有服務。部署服務更新可能包括更新個別設定檔,或更新相應版本的原始碼。

舉例來說,您可以在 App Engine 中部署及建立兩個版本,這兩個版本分別在各自的服務中執行。第一個版本可做為前端服務,另一個版本則可做為應用程式的後端。接著,您可以部署個別設定檔,只更新服務的設定。您也可以選擇將新版本部署至服務,以便同時更新前端和後端的原始碼。

部署多個服務的需求

您可以使用相同的部署指令來部署和更新應用程式的多個服務,但必須符合下列需求:

  • 您必須先將應用程式的一個版本部署到 default 服務,才能建立及部署後續服務。

  • 您必須在對應版本的 app.yaml 設定檔中指定服務 ID。如要指定服務 ID,請在每個設定檔中加入 service: [YOUR_SERVICE_ID] 元素定義。根據預設,從設定檔排除此元素定義會將版本部署至 default 服務。

  • 您必須在部署指令中指定所有對應的 app.yaml 設定檔,才能同時部署多項服務。

部署多服務的方式

從設定檔所在的應用程式根目錄執行部署指令,並針對每個服務的 app.yaml 檔案指定相對路徑和檔名:

gcloud app deploy [CONFIGURATION_FILES]

其中 [CONFIGURATION_FILES] 是一或多個設定檔的路徑和名稱,並以一個空格分隔。

範例
gcloud app deploy main/app.yaml service1/app.yaml service2/app.yaml

成功部署每個服務後,您會透過指令列收到驗證訊息。

查看建構作業記錄

Cloud Build 會串流傳輸建構和部署記錄,您可以在 控制台的 Cloud Build 記錄部分中查看這些記錄。Google Cloud 如要查看應用程式所在區域的版本,請使用頁面頂端的「Region」下拉式選單,選擇要篩選的區域。

更新索引

如要建立或更新應用程式使用的索引,請將 index.yaml 設定檔上傳至 Datastore。上傳設定檔後,系統就會建立尚未存在的索引。

Datastore 可能需要一段時間才能建立所有索引,因此這些索引不會立即提供給 App Engine。如果您的應用程式已設定為接收流量,當查詢所需的索引還在建置時,便會發生例外情況。

為了避免例外發生,請讓系統有充裕的時間來建置所有索引。

  • 先將 index.yaml 設定檔上傳至 Datastore,然後再部署版本:

    1. index.yaml 檔案上傳至 Datastore:

      gcloud datastore indexes create index.yaml

      詳情請參閱 gcloud datastore 參考資料

    2. 使用 Google Cloud 主控台監控所有索引的狀態:

      前往 Datastore 頁面

    3. 在所有索引建構完成後,將新版本部署至 App Engine

  • 先建構索引,再將流量遷移或拆分至您的版本:

    1. 部署新版本,但不將流量轉送至該版本: 必須同時指定 app.yamlindex.yaml 檔案,並加入 --no-promote 標記,這樣流量才不會轉送至該版本:
      gcloud app deploy app.yaml index.yaml --no-promote
    2. 使用 Google Cloud 控制台監控所有索引的狀態:

      前往 Datastore 頁面

    3. 所有索引建構完成後,再使用 Google Cloud 控制台將流量遷移或拆分至該版本:

      前往「Versions」(版本) 頁面

如要進一步瞭解索引,請參閱設定 Datastore 索引一文。

疑難排解

以下是您可能會看到的常見錯誤訊息:

PERMISSION_DENIED: Operation not allowed
The "appengine.applications.create" permission is required.
如果 Google Cloud 專案缺少必要的 App Engine 應用程式gcloud app deploy 指令嘗試執行 gcloud app create 指令時可能會失敗。只有具備「擁有者」角色的帳戶才具有建立 App Engine 應用程式的必要權限。
Command not found
如要瞭解如何設定本機開發伺服器工具,請參閱「使用本機開發伺服器」一文。
Import Error
如果您安裝了 gcloud CLI 和原始 App Engine SDK,則 PATH 的不同項目之間可能會發生衝突,造成匯入錯誤。如果在執行 gcloud CLI 指令時收到錯誤訊息,請按照指示執行本機開發伺服器
[400] The first service (module) you upload to a new application must be the 'default' service (module)
您必須先部署並建立 default 服務,才能部署及建立應用程式的多項服務。如要進一步瞭解如何將版本部署至 default 服務,請參閱「部署多服務應用程式」一節。
Too Many Versions (403)
App Engine 對應用程式部署版本數量設有限制。免費應用程式和已部署的應用程式會有所不同。您可以使用 Google Cloud 主控台刪除舊版,然後上傳最新的程式碼。
[13] An internal error occurred while creating a Cloud Storage bucket.

App Engine 會代表您在建立應用程式的地區建立預設 Cloud Storage 多地區值區。您必須使用這個值區來儲存應用程式的內容。在下列情況下,如果無法建立這個儲存體,系統就會傳回此錯誤:

[13] An internal error occurred

如果 App Engine 的 app.yaml 設定檔在 vpc_access_connector 鍵下含有無效的資源 name,就可能發生這項錯誤。確認 name 欄位包含建立無伺服器虛擬私有雲存取連接器的正確專案和地區。

如果確認 app.yaml 設定有效後問題仍未解決,請使用 Google Cloud SDK 重新部署服務,並新增 --verbosity=debug 標記,然後提供指令的輸出內容,與 Cloud 支援團隊聯絡。

其他部署錯誤

如果部署作業失敗,請確認 Cloud Build API 已在專案中啟用。App Engine 會在您首次部署應用程式時自動啟用這個 API,但如果有人在之後停用 API,部署作業就會失敗。

後續步驟