測試及部署應用程式

區域 ID

REGION_ID 是 Google 根據您在建立應用程式時選取的地區所指派的縮寫代碼。此代碼不對應至國家/地區或省份,即使部分區域 ID 可能與常用的國家/地區和省份代碼相似。如果是 2020 年 2 月後建立的應用程式,App Engine 網址會包含 REGION_ID.r。如果是這段時間前建立的現有應用程式,網址可選擇是否包含地區 ID。

進一步瞭解區域 ID

瞭解如何在本機執行應用程式、進行部署,然後在 App Engine 上測試。

在本機上執行

如要在部署前先測試應用程式,請使用您常用的開發工具,在本機環境中執行應用程式。 建議您使用標準的 Python 工具,例如利用 virtualenv 來建立獨立的環境,並透過 pytest 進行單元測試和整合測試,而不要使用 Google Cloud SDK 提供的本機開發伺服器 dev_appserver

舉例來說,您通常可以在 Flask 的開發伺服器中使用下列指令來執行 Flask 應用程式:

python main.py

使用下列指令啟動 Django 應用程式:

python manage.py runserver

如要模擬 App Engine 實際工作環境,請在本機執行完整的網路伺服器閘道介面 (WSGI) 伺服器。使用 app.yaml 檔案中指定的相同指令做為進入點,例如:

gunicorn -b :$PORT main:app

部署應用程式前的準備工作

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

部署應用程式

使用 gcloud app deploy 指令,將應用程式部署到 App Engine。在部署期間,Cloud Build 服務會建構應用程式的容器映像檔,以在標準環境中執行。每個建構作業都會在與 Google Cloud 專案相同的區域中執行。詳情請參閱「管理建構的映像檔」。

如要透過程式部署應用程式,請使用 Admin API

部署服務

您可以部署應用程式服務的版本及各版本的設定檔,藉此將應用程式部署至 App Engine。

如要部署應用程式服務的版本,請從服務的 app.yaml 檔案所在的目錄執行下列指令:

gcloud app deploy

使用該指令時如未指定任何檔案,僅會部署目前目錄中的 app.yaml 檔案。根據預設,deploy 指令會為您部署的版本產生唯一 ID,並將該版本部署到您設定 Google Cloud CLI 所使用的Google Cloud 專案,再將所有流量轉送到新版本。

您可指定特定檔案,或是加入其他參數來改變指令的預設行為:

  • 如要部署服務的其他設定檔,您必須個別指定及部署每個檔案。例如:
    gcloud app deploy cron.yaml
    gcloud app deploy dispatch.yaml
    gcloud app deploy index.yaml
  • 如要指定自訂版本 ID,請使用 --version 標記。
  • 如要避免系統將流量自動轉送至新版本,請使用 --no-promote 標記。
  • 如要部署到特定 Google Cloud 專案,請使用 --project 標記。

舉例來說,如要將 app.yaml 檔案定義的服務部署至特定的Google Cloud 專案,請為該服務指派自訂版本 ID,還要避免將流量轉送至新版本:

gcloud app deploy --project PROJECT_ID --version VERSION_ID --no-promote

如要進一步瞭解這個指令,請參閱gcloud app deploy 參考資料

如果您在部署新版本時採用現有版本的名稱,App Engine 會立即將流量遷移至新版本。App Engine 將要求載入新版本時,延遲時間會遽增。新版本會覆寫舊版本,且你無法將流量遷移至舊版本。系統會立即關閉舊版本的所有執行個體,詳情請參閱「遷移流量」。

部署多項服務

您可以使用相同的部署指令來部署或更新組成應用程式的多項服務。

事前準備:

  • 您必須先將應用程式的某個版本部署到 default 服務,才能建立及部署後續服務。
  • 您必須在每項服務各自對應的 app.yaml 設定檔中指定服務 ID。如要指定服務 ID,請在每個設定檔中加入 service 元素定義。根據預設,從設定檔排除此元素定義會將版本部署至 default 服務。

如要部署多項服務,請個別部署每項服務的app.yaml檔案。您可以透過單一 gcloud app deploy 指令指定多個檔案:

gcloud app deploy service1/app.yaml service2/app.yaml

查看建構作業記錄

Cloud Build 會串流建構和部署記錄,這些記錄會顯示在 Google Cloud 控制台的 Cloud Build「建構記錄」部分。如要查看應用程式所在區域的建構作業,請使用「區域」選單依區域篩選。

管理建構的映像檔

每次部署新版本時:

  1. App Engine 會使用 Cloud Build 服務建立容器映像檔。

  2. Cloud Build 會在應用程式的區域中建構容器映像檔,並在 App Engine 標準環境中執行。

  3. App Engine 會將建構的容器映像檔儲存在 Artifact Registry 中。 您可以下載這些映像檔來加以保存或在其他地方執行。

部署完成後,App Engine 就不再需要容器映像檔。容器映像檔不會自動刪除。 如要避免讓儲存空間配額達到上限,您可以放心刪除任何不需要的映像檔。不過,如果您日後可能需要這些圖片,或想保留圖片副本,請先匯出副本再刪除。如要進一步瞭解如何管理 Artifact Registry 中的映像檔,請參閱管理映像檔

忽略檔案

您可以使用 .gcloudignore 檔案,指定部署服務時不要上傳至 App Engine 的檔案和目錄。如要略過不必隨著部署作業一起上傳的版本構件和其他檔案,這個方法十分實用。

查看您的應用程式

將應用程式部署至 App Engine 之後,就能執行下列指令來啟動瀏覽器,並前往 https://PROJECT_ID.REGION_ID.r.appspot.com 查看:

gcloud app browse

在轉移流量之前在 App Engine 上測試

您可以先在 App Engine 上測試新版本,然後再設定該版本以接收流量。例如,如要測試 default 服務的新版本:

  1. 部署新版本,但避免系統將流量自動轉送至新版本:

    gcloud app deploy --no-promote

  2. 前往下列網址以存取新版本:

    https://VERSION_ID-dot-default-dot-PROJECT_ID.REGION_ID.r.appspot.com

    您現在可以在 App Engine 執行階段環境中測試新版本。您可以查看應用程式記錄來進行偵錯。詳情請參閱「寫入應用程式記錄」。

    App Engine 會將傳送至 https://PROJECT_ID.REGION_ID.r.appspot.com 的要求,轉送至先前設為接收流量的版本。

  3. 當您要將流量傳送至新版本時,請使用Google Cloud 控制台遷移流量:

    管理版本

    選取您剛剛部署的版本,然後按一下 [Migrate traffic] (遷移流量)

您可以將網址中的 default 換成服務名稱,即可使用相同程序來測試其他服務的新版本:

https://VERSION-dot-SERVICE-dot-PROJECT_ID.REGION_ID.r.appspot.com

如要進一步瞭解如何指定特定服務和版本,請參閱要求的轉送方式

使用建構環境變數

您可以為支援建構套件的執行階段設定建構環境變數。

建構環境變數是鍵/值組合,可用於設定部署應用程式時使用的建構包。舉例來說,您可能想指定編譯器選項。

事前準備:

  • 鍵的開頭須為大寫 ASCII 字母,且只能包含大寫 ASCII 字母、數字和底線。
  • 請避免建立任何含有 GOOGLE_* 金鑰前置字元的變數。
  • 下列鍵保留供 Google 使用:
    • GOOGLE_RUNTIME
    • GOOGLE_RUNTIME_VERSION
    • GOOGLE_ENTRYPOINT
    • GOOGLE_DEVMODE
  • 您可以使用建構套件支援的任何金鑰。

如要搭配建構包使用環境變數,請在 app.yaml 檔案中指定 build_env_variables 欄位。

進一步瞭解建構套件。

使用本機開發伺服器

Google Cloud CLI 包含名為 dev_appserver 的本機開發伺服器,您可以在本機執行此伺服器,模擬應用程式在實際工作環境 App Engine 中的運作情形。這個開發伺服器可以大致模擬應用程式的運作環境,讓您測試為任何標準環境執行階段編寫的應用程式。

執行本機開發伺服器

為應用程式建立 app.yaml 設定檔後,您可以使用 dev_appserver.py 指令啟動本機開發伺服器,在本機執行應用程式。

  1. 如要取得使用者帳戶的存取憑證,請執行:

    gcloud auth login
    
  2. 允許本機應用程式暫時使用您的使用者憑證存取 API:

    gcloud auth application-default login
    
  3. 如要啟動本機開發伺服器:

    在包含 app.yaml 設定檔的目錄中,執行 dev_appserver.py 指令,並指定專案 ID 和 app.yaml 檔案的路徑:

    python3 CLOUD_SDK_ROOT/bin/dev_appserver.py --application=PROJECT_ID app.yaml

    如要變更通訊埠,請加入 --port 選項:

    python3 CLOUD_SDK_ROOT/bin/dev_appserver.py --application=PROJECT_ID app.yaml --port=9999

    如要測試 Python 3 應用程式,請使用 Python 3 解譯器執行 dev_appserver.py,您必須在 --runtime_python_path 標記中指定 Python 3 二進位檔,例如:

    python3 CLOUD_SDK_ROOT/bin/dev_appserver.py --runtime_python_path=/usr/bin/python3 --application=PROJECT_ID app.yaml --port=9999

    如要進一步瞭解 dev_appserver.py 指令選項,請參閱本機開發伺服器選項一文。

  4. 本機開發伺服器啟動時,系統會設定開發環境,而該環境會預先安裝 requirements.txt 檔案中列出的依附元件。

  5. 本機開發伺服器現已開始執行並監聽要求。請透過網路瀏覽器前往 http://localhost:8080/ 查看運作中的應用程式。

    如果您使用了 --port 選項指定自訂通訊埠,請務必在瀏覽器中開啟該通訊埠。

  6. 如要透過指令列停止本機伺服器,請按下鍵盤中的 Control-C

偵測應用程式執行階段環境

如要判定程式碼是在實際工作環境還是本機開發伺服器中執行,請檢查 GAE_ENV 環境變數:

if os.getenv('GAE_ENV', '').startswith('standard'):
  # Production in the standard environment
else:
  # Local execution.

搭配 Google Cloud 服務使用本機開發伺服器

您可以將 dev_appserver 與其他 Google Cloud 元件整合。

Cloud 用戶端程式庫

許多 Google Cloud 用戶端程式庫都必須使用 GOOGLE_CLOUD_PROJECT 環境變數,也就是您的Google Cloud 專案 ID。您可以執行 gcloud config list project 指令,或在Google Cloud console中查看專案頁面,找出該值。

dev_appserver。dev_appserver--application=PROJECT_ID

Cloud 模擬器

您可以使用適用於 Cloud DatastoreCloud BigtableCloud Pub/Sub 的模擬器來測試應用程式。

自動重新載入 requirements.txtapp.yaml 變更

本機開發伺服器會自動安裝 requirements.txt 檔案中列出的依附元件。您也可以透過 dev_appserver 測試透過 app.yaml 設定的功能。舉例來說,您可以測試應用程式提供靜態檔案的功能。dev_appserver 執行時,對 requirements.txtapp.yaml 的任何變更都會自動重新啟動您的應用程式,以反映這些變更。系統會下載及安裝所需依附元件,因此可能會引發暫時性延遲。

開發伺服器中的執行個體管理與轉送

探索執行個體位址

本機開發伺服器會在啟動時建立所有手動調整資源配置的執行個體,並對自動調整和基本資源配置服務的執行個體採取動態管理。伺服器會為各項服務指派通訊埠,用戶端則能使用伺服器自動平衡負載及選取執行個體。為各項服務定址的通訊埠指派工作會顯示在伺服器記錄檔訊息串中。

以下是定義三項服務的應用程式使用的通訊埠:

INFO Starting module "default" running at: http://localhost:8084
INFO Starting module "service1" running at: http://localhost:8082
INFO Starting module "service2" running at: http://localhost:8083

您使用服務的位址 (例如 http://localhost:8082/) 之後,該伺服器會建立或選取服務的執行個體,並將要求傳送至該執行個體。

伺服器會為服務的各個執行個體指派專屬的通訊埠,您可以使用管理伺服器來探索這些通訊埠。管理伺服器具備一個專屬的通訊埠,這個通訊埠會顯示在訊息記錄檔中:

INFO Starting admin server at: http://localhost:8000

這個位址會將您帶往管理伺服器主控台。按一下 [Instances] (執行個體),查看應用程式執行個體的動態狀態。

每個手動和基本執行個體會以不同的項目顯示。執行個體編號是一種連結,可連至每個執行個體的不重複通訊埠位址。請按一下連結,將要求直接傳送給這個執行個體。

分派檔案

如果您的應用程式含有 dispatch.yaml 檔案,記錄檔訊息串中就會顯示分派器通訊埠:

INFO Starting dispatcher running at: http://localhost:8080

系統會依據分派檔案中的規則,轉送傳送至這個通訊埠的要求。 伺服器支援含有主機名稱的 dispatch.yaml 檔案規則,例如 url: "customer1.myapp.com/*"。含有相對路徑模式 (url: "*/fun") 的規則正常運作,因此您可以使用 http://localhost/fun/mobile 等網址來存取執行個體。如果您嘗試使用含有主機規則的 dispatch.yaml 檔案啟動應用程式,伺服器會在記錄檔串流中顯示錯誤訊息。

使用 Cloud Trace

Cloud Trace 可協助您瞭解要求在應用程式中傳播的情形。您可以查看單項要求的詳細延遲資訊,或是瀏覽整個應用程式的匯總延遲資料。

如要在 Cloud Trace 中查看追蹤記錄詳細資料,請按照「尋找及探索追蹤記錄」一文中的步驟操作。在「追蹤記錄探索工具」中,您可以使用篩選器,依特定 App Engine 服務和版本進行篩選。