擴充 App Engine 套裝組合服務的支援:第 1 部分 (單元 17)

1. 總覽

無伺服器遷移站系列的程式碼研究室系列 (自助式實作教學課程) 和相關影片,旨在引導 Google Cloud 無伺服器開發人員透過一或多種遷移作業 (主要用於遷移舊版服務) 逐步翻新應用程式。這麼一來,您的應用程式就能更具可攜性,並提供更多選擇和使用彈性,進而整合及使用更多 Cloud 產品,也更容易升級至較新的語言版本。本系列課程一開始將著重在最早的 Cloud 使用者 (主要是 App Engine (標準環境) 開發人員),但涵蓋其他無伺服器平台,包括 Cloud FunctionsCloud Run 或其他無伺服器平台 (如適用)。

開發人員先前必須從 App Engine 的舊版「套裝組合服務」進行遷移才能升級語言版本的 Datastore 和 Memcache,但從頭到尾都可能遇到種種挑戰。藉由在第 2 代 App Engine 服務中提供許多主要套裝組合服務,開發人員現在可以將應用程式轉移至最新的執行階段,同時繼續使用 (大部分的) 套裝組合服務。本程式碼研究室會逐步引導您將範例應用程式從 Python 2 升級至 3,同時維持使用 Datastore 套裝組合服務 (透過 App Engine NDB 程式庫)。使用大部分的套裝組合服務只需要稍微更新程式碼 (本教學課程將會說明) ,但還有其他需要更大量變更的需求。都會在第 2 部分介紹後續單元和程式碼研究室

在接下來的研究室中

  • 將 App Engine 範例應用程式從 Python 2 移植至 3
  • 更新應用程式設定,納入 App Engine SDK
  • 將 SDK 程式碼新增至支援 Python 3 等第 2 代執行階段中隨附的服務的應用程式

軟硬體需求

問卷調查

您會如何使用這個教學課程?

僅供閱讀 閱讀並完成練習

您對 Python 的使用體驗有何評價?

新手 中級 還算容易

針對使用 Google Cloud 服務的經驗,您會給予什麼評價?

新手 中級 還算容易

2. 背景

原先的 App Engine 服務於 2008 年推出,且隨附一組舊版 API (現稱為組合服務),可協助開發人員輕鬆在世界各地建構及部署應用程式。這些服務包括 Datastore、Memcache 和 Task Queue。雖然操作起來很便利,但使用者對於使用專屬 API 與 App Engine 建立可攜性,並希望應用程式具備更可攜性,他們會擔心應用程式的可攜性。再加上許多套裝組合服務已成熟的獨立 Cloud 產品成分,App Engine 團隊因此決定在 2018 年推出新一代平台,但完全少了這兩項產品。

現在就讓 Python 2 開發人員率先升級至 Python 3。某個使用套裝組合服務的 2.x 應用程式須先從這些服務遷移至 3.x,應用程式才能移植到 3.x,代表一對強制來回遷移,甚至可能出現挑戰。為協助團隊順利轉型,App Engine 團隊於 2021 年秋季推出「蠕蟲」允許在新一代執行階段中執行的應用程式存取許多套裝組合服務。雖然這個版本不含原始執行階段中可用的「所有」服務,但資料儲存庫、工作佇列和 Memcache 等主要玩家可以使用。

本程式碼研究室示範必要變更,協助您將應用程式升級至 Python 3,同時繼續使用套裝組合服務。我們的目標是讓應用程式在最新的執行階段上執行,讓您自行安排時間,從套裝組合服務遷移至對應的 Cloud 獨立方案或第三方替代方案,不會導致升級作業阻礙 3. 倍。雖然您不需要更換套裝服務,但這麼做能讓您在控管應用程式的代管位置上享有更大的可攜性和彈性,包括改用較可能符合工作負載需求的平台,或只是在升級至較現代化的語言版本時繼續使用 App Engine,如所述。

模組 1 Python 2 範例應用程式會透過 App Engine NDB 使用 Datastore 套裝組合服務。應用程式已將架構從 web2 遷移至 Flask (已在單元 1 程式碼研究室中完成),但其 Datastore 使用方式仍維持不變。

本教學課程包含下列步驟:

  1. 設定/事前作業
  2. 更新設定
  3. 修改應用程式程式碼

3. 設定/事前作業

本節說明如何:

  1. 設定 Cloud 專案
  2. 取得基準範例應用程式
  3. (重新) 部署及驗證基準應用程式

這些步驟可確保您一開始就使用有效的程式碼。

1. 設定專案

如果您已完成單元 1 程式碼研究室,建議您重複使用相同的專案和程式碼。您也可以建立新的 Cloud 專案,或是重複使用其他現有專案。請確認專案具備有效的帳單帳戶,而且該帳戶已啟用 App Engine 服務。

2. 取得基準範例應用程式

本程式碼研究室的必要條件之一,是擁有正常運作的單元 1 應用程式:完成單元 1 程式碼研究室 (建議) 或從存放區複製模組 1 應用程式。無論您使用您自己的或我們的模組,我們都會在單元 1 程式碼下「開始」。本程式碼研究室會逐步引導您完成每個步驟,最後程式碼會與單元 7 存放區資料夾「FINISH」中顯示的程式碼類似。

無論使用哪個模組 1 應用程式,資料夾應如下所示,可能也有 lib 資料夾:

$ ls
README.md               appengine_config.py     requirements.txt
app.yaml                main.py                 templates

3. (重新) 部署基準應用程式

執行下列指令,重新部署模組 1 應用程式:

  1. 如有 lib 資料夾,請刪除該資料夾,然後執行 pip install -t lib -r requirements.txt 來重新填入 lib。如果您同時安裝 Python 2 與 3,可能就需要使用 pip2 指令。
  2. 確認您已安裝初始化 gcloud 指令列工具,並檢查其使用情況。
  3. 如果您不想在發出每個 gcloud 指令後輸入 PROJECT_ID,請使用 gcloud config set project PROJECT_ID 設定 Cloud 專案。
  4. 使用 gcloud app deploy 部署範例應用程式
  5. 確認模組 1 應用程式可正常運作,而不會顯示最近的造訪情形 (如下圖所示)

a7a9d2b80d706a2b.png

4. 更新設定

成功執行上述步驟並查看網頁應用程式正常運作後,即可從設定開始,將應用程式移植到 Python 3。

將 SDK 新增至 requirements.txt

App Engine Python 3 執行階段可大幅降低使用第三方程式庫的負擔。你只需在 requirements.txt 中列出這些項目即可。如要在 Python 3 中使用套裝組合服務,請在該套件中加入 App Engine SDK 套件 appengine-python-standard。SDK 套件會加入單元 1 的 Flask:

flask
appengine-python-standard

更新 app.yaml

請按照下列步驟將設定變更套用至 app.yaml 檔案:

  1. 請將 runtime 指令替換為支援的 Python 3 版本;例如,將 Python 3.10 指定為 python310
  2. 同時刪除 threadsafeapi_version 指令,因為這兩個指令在 Python 3 中都不使用。
  3. 此應用程式只有指令碼處理常式,因此完全刪除 handlers 區段。如果應用程式有靜態檔案處理常式,請將其保留在 handlers 中。
  4. Python 3 執行階段不支援內建第三方程式庫與 Python 2 執行階段一樣。如果應用程式的 app.yaml 中有 libraries 部分,請刪除整個區段。(必要套件只須列在 requirements.txt 中,例如非內建程式庫)。範例應用程式沒有 libraries 區段,請繼續進行下一步。
  5. 建立設為 trueapp_engine_apis 指令,該指令相當於在上述的 requirements.txt 中新增 App Engine SDK 套件。

app.yaml 所需變更的摘要:

變更前:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

變更後:

runtime: python310
app_engine_apis: true

其他設定檔

由於所有第三方套件只需要列在 requirements.txt 中,除非您在 appengine_config.py 中有特別項目,否則不需要,請將其刪除。同樣地,由於所有第三方程式庫會在建構程序中自動安裝,因此您不需要複製或供應商程式庫,因此不再需要將其 pip install 指令和 lib 資料夾刪除。總結:

  • 刪除 appengine_config.py 檔案
  • 刪除 lib 個資料夾

即可完成所有必要的設定變更。

5. 修改應用程式程式碼

如要存取 Python 3 執行階段環境中的大多數可用套裝組合服務,您需要使用一小段程式碼包裝 main.py 中的網路伺服器閘道介面 (WSGI) 應用程式物件。包裝函式函式為 google.appengine.api.wrap_wsgi_app(),您可以匯入這個函式,並將 WSGI 物件與這個函式包裝在一起。根據 main.py 中 Flask 需要的更新,進行下列變更:

變更前:

from flask import Flask, render_template, request
from google.appengine.ext import ndb

app = Flask(__name__)

變更後:

from flask import Flask, render_template, request
from google.appengine.api import wrap_wsgi_app
from google.appengine.ext import ndb

app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)

如要查看其他 Python 架構適用的 WSGI 包裝範例,請參閱說明文件

儘管這個範例的用途是讓應用程式存取 Python 3 中大部分的隨附服務,但 Blob 和 Mail 等其他服務需要額外的程式碼。我們會在其他遷移單元中介紹這些範例。

您已完成所有必要變更,包括將 App Engine 套裝組合服務新增至模組 1 範例應用程式中。應用程式已經與 Python 2 和 3 相容,因此除了您先前的設定,應用程式對移植到 Python 3 沒有其他變更。最後一個步驟:將這個修改過的應用程式部署至下一代 App Engine Python 3 執行階段,並確認更新是否成功。

6. 摘要/清除

本節總結此程式碼研究室的內容,做法是部署應用程式,確認應用程式是否正常運作,以及任何反映的輸出內容。驗證應用程式後,請執行所有清理作業,並考慮後續步驟。

部署及驗證應用程式

使用 gcloud app deploy 部署 Python 3 應用程式,並確認應用程式的運作方式與 Python 2 相同。功能沒有任何異動,因此輸出內容應與模組 1 應用程式相同:

a7a9d2b80d706a2b.png

最後注意事項

恭喜您踏出第一步,將 Python 2 App Engine 應用程式移植至 Python 3,同時仍保留其套裝組合服務使用。

清除所用資源

一般

如果您現階段已完成設定,建議您停用 App Engine 應用程式,以免產生帳單費用。不過,如果您想測試或進行其他測試,App Engine 平台提供免費配額,而且只要不超出用量限制,就不需支付任何費用。這適用於運算,但相關 App Engine 服務可能也會產生費用,詳情請參閱定價頁面。如果這項遷移作業涉及其他 Cloud 服務,我們會另外計費。無論採用哪種情況,請參閱「本程式碼研究室的專屬」以下章節。

如要完整揭露,部署至 Google Cloud 無伺服器運算平台 (如 App Engine) 會產生少許建構和儲存空間費用Cloud Build 提供的免費配額與 Cloud Storage 相同。該映像檔的儲存空間會佔用部分配額。不過,您可能居住的區域沒有這類免費方案,因此請留意儲存空間用量,盡可能降低潛在費用。特定 Cloud Storage「資料夾」請務必查看:

  • console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
  • console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
  • 上方的儲存空間連結取決於您的 PROJECT_ID 和 *LOC*,例如「us」如果應用程式是由美國代管

另一方面,如果您不打算繼續使用這個應用程式或其他相關的遷移程式碼研究室,且想要徹底刪除所有項目,請關閉專案

本程式碼研究室的專屬功能

下列服務專屬於本程式碼研究室。詳情請參閱每項產品的說明文件:

後續步驟

從這裡開始有數種路線:

  1. 請使用需要變更更多程式碼的套裝組合服務更新程式碼
  2. 從套裝組合服務遷移至 Cloud 獨立產品
  3. 從 App Engine 遷移至其他 Cloud 無伺服器平台

存取 BlobstoreMailDeferred 等其他套裝組合服務,需要進行更多程式碼變更。遷移模組著重於淘汰 App Engine 舊版套裝組合服務,可考慮使用:

  • 模組 2:從 App Engine NDB 遷移至 Cloud NDB
  • 模組 7-9:將 App Engine TaskQueue (推送工作) 傳送至 Cloud Tasks
  • 單元 12-13:從 App Engine Memcache 遷移至 Cloud Memorystore
  • 模組 15-16:將 App Engine Blob 體至 Cloud Storage
  • 模組 18-19:App Engine TaskQueue (提取工作) 至 Cloud Pub/Sub

App Engine 不再是 Google Cloud 中唯一的無伺服器平台。如果您有小型 App Engine 應用程式,或功能有限,但想將其轉換為獨立微服務,或想將單體式應用程式拆解成多個可重複使用的元件,請考慮改用 Cloud Functions。如果容器化已成為應用程式開發工作流程的一部分,特別是在含有 CI/CD (持續整合/持續推送軟體更新或部署) 管道的情況下,請考慮遷移至 Cloud Run。以下單元將介紹這些情境:

  • 從 App Engine 遷移至 Cloud Functions:請參閱單元 11
  • 從 App Engine 遷移至 Cloud Run:請參閱模組 4,使用 Docker 將應用程式容器化;或參閱模組 5,在沒有容器、Docker 或 Dockerfile 的情況下執行應用程式

您可以選擇是否要改用其他無伺服器平台,在進行任何變更前,建議您考量應用程式和用途的最佳選擇。

無論接下來選擇使用哪個遷移模組,所有無伺服器遷移站內容 (程式碼研究室、影片、原始碼 [如有]) 都可以透過其開放原始碼存放區存取。存放區的 README 還針對應考慮遷移的項目和任何相關的「訂單」提供指引接下來介紹遷移模組

7. 其他資源

以下列出開發人員可進一步探索這個或相關的遷移模組和相關產品。包括提供這項內容意見回饋的地方、程式碼連結,以及各種實用的說明文件。

程式碼研究室問題/意見回饋

如果您在本程式碼研究室中發現任何問題,請先搜尋您的問題再提出申請。搜尋及建立新問題的連結:

遷移資源

下表提供模組 1 (START) 和模組 1b (FINISH) 的存放區資料夾連結。您也可以透過所有 App Engine 程式碼研究室遷移作業的存放區存取。

Codelab

Python 2

Python 3

Module 1

程式碼

不適用

單元 17 (本程式碼研究室)

不適用

code (mod1b-flask)

線上資源

以下為可能與本教學課程相關的線上資源:

App Engine 套裝組合服務

App Engine 一般文件

其他 Cloud 資訊

影片

授權

這項內容採用的是創用 CC 姓名標示 2.0 通用授權。