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

1. 總覽

無伺服器遷移工作站系列程式碼研究室 (自學式實作教學課程) 和相關影片,旨在協助 Google Cloud 無伺服器開發人員完成一或多項遷移作業 (主要是從舊版服務遷移),進而翻新應用程式。這樣做可提高應用程式的可攜性,並提供更多選項和彈性,讓您整合及存取更多 Cloud 產品,並更輕鬆地升級至新版語言。雖然一開始的重點是早期 Cloud 使用者,主要是 App Engine (標準環境) 開發人員,但本系列涵蓋範圍廣泛,也包括其他無伺服器平台,例如 Cloud FunctionsCloud Run,或適用於其他平台。

先前,開發人員必須先從 App Engine 的舊版「套裝服務」(例如 Datastore 和 Memcache) 遷移,才能升級語言版本,這兩項作業可能接連帶來挑戰。第二代 App Engine 服務提供許多重要的隨附服務,因此開發人員現在可以將應用程式移植到最新執行階段,同時繼續使用 (大部分) 隨附服務。本程式碼研究室會逐步說明如何將範例應用程式從 Python 2 升級至 3,同時繼續使用 Datastore 組合式服務 (透過 App Engine NDB 程式庫)。如本教學課程所述,使用大多數的套裝服務時,只需要稍微更新程式碼,但有些服務需要進行更大幅度的變更;這些服務將在「第 2 部分」中說明,也就是後續的模組和程式碼研究室。

在接下來的研究室中

  • 將範例 App Engine 應用程式從 Python 2 移植到 Python 3
  • 更新應用程式設定,加入 App Engine SDK
  • 在支援套裝組合服務的應用程式中新增 SDK 程式碼,例如 Python 3 等第 2 代執行階段

軟硬體需求

問卷調查

您會如何使用本教學課程?

僅閱讀 閱讀並完成練習

你對 Python 的使用體驗如何?

新手 中級 熟練

您對使用 Google Cloud 服務的體驗滿意嗎?

新手 中級 熟練

2. 背景

原始的 App Engine 服務於 2008 年推出,並隨附一組舊版 API (現稱為隨附服務),方便開發人員在全球各地建構及部署應用程式。包括 Datastore、Memcache 和工作佇列。雖然很方便,但使用者擔心專有 API 會將他們綁定至 App Engine,因此希望應用程式更具可攜性。此外,許多這類組合服務日趨成熟,成為獨立的 Cloud 產品,因此 App Engine 團隊在 2018 年推出新一代平台時,並未納入這些服務。

時至今日,Python 2 開發人員都想升級至 Python 3。使用套裝服務的 2.x 應用程式必須先從這些服務遷移,才能將應用程式移植到 3.x,這表示必須連續進行兩次強制遷移,而且可能相當困難。為協助您完成這項轉換,App Engine 團隊已於 2021 年秋季推出「蟲洞」,讓在次世代執行階段執行的應用程式存取許多這些隨附服務。雖然這個版本並未包含原始執行階段的所有服務,但 Datastore、工作佇列和 Memcache 等主要服務已推出。

本程式碼研究室會說明升級應用程式至 Python 3 時的必要變更,同時保留已套裝服務的使用權。目標是讓您的應用程式在最新執行階段上執行,然後您就能自行決定何時從套裝組合服務遷移至 Cloud 獨立服務或第三方替代方案,而不是因為無法遷移而無法升級至 3.x 版。雖然不再需要遷移離開套裝服務,但這麼做可讓您在應用程式的代管位置方面,享有更高的可攜性和彈性,包括改用更適合工作負載的平台,或只是留在 App Engine,同時升級至如上所述的較新語言版本。

第 1 模組的 Python 2 範例應用程式會透過 App Engine NDB 使用 Datastore 隨附服務。應用程式已將架構從 webapp2 遷移至 Flask (已在第 1 堂程式碼研究室中完成),但 Datastore 的使用方式不變。

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

  1. 設定/準備工作
  2. 更新設定
  3. 修改應用程式程式碼

3. 設定/準備工作

本節將說明如何:

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

這些步驟可確保您一開始使用的是可運作的程式碼。

1. 設定專案

如果您已完成第 1 模組的程式碼研究室,建議重複使用該專案 (和程式碼)。或者,您也可以建立全新的 Cloud 專案,或是重複使用其他現有專案。確認專案具備已啟用 App Engine 服務的有效帳單帳戶。

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

本程式碼研究室的先決條件之一,是必須有可運作的第 1 模組 App Engine 應用程式:完成第 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 版本,例如指定 python310 代表 Python 3.10。
  2. 刪除 threadsafeapi_version 指令,因為 Python 3 不會使用這兩者。
  3. 由於這個應用程式只有指令碼處理常式,請完全刪除 handlers 區段。如果應用程式有靜態檔案處理常式,請在 handlers 中保留這些常式。
  4. Python 3 執行階段不支援內建第三方程式庫,Python 2 執行階段則支援。如果應用程式在 app.yaml 中有 libraries 專區,請刪除整個專區。(必要套件只需列在 requirements.txt 中,就像非內建程式庫一樣)。我們的範例應用程式沒有 libraries 區段,因此請前往下一個步驟。
  5. app_engine_apis 指令集設為 true 即可使用,這相當於在上述 requirements.txt 中新增 App Engine SDK 套件。

app.yaml的必要變更摘要:

BEFORE:

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 執行階段環境中存取大多數可用的套裝組合服務,需要一小段程式碼,將 網路伺服器閘道介面 (WSGI) 應用程式物件包裝在 main.py 中。包裝函式為 google.appengine.api.wrap_wsgi_app(),您只要匯入並使用這個函式包裝 WSGI 物件即可。在 main.py 中進行下列變更,以反映 Flask 的必要更新:

BEFORE:

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 中的大多數服務,但 Blobstore 和 Mail 等服務需要額外程式碼。我們會在另一個遷移單元中介紹這些範例。

至此,您已完成所有必要變更,可將 App Engine 綁定服務新增至第 1 課的範例應用程式。這個應用程式已與 Python 2 和 3 相容,因此除了您已在設定中完成的作業外,不必再進行其他變更,即可將應用程式移植到 Python 3。最後一個步驟:將修改後的應用程式部署至新一代 App Engine Python 3 執行階段,並確認更新成功。

6. 摘要/清除

本節將部署應用程式,並驗證應用程式是否正常運作,以及是否反映在輸出內容中,為本程式碼研究室畫下句點。應用程式驗證完成後,請執行任何清理作業,並考慮後續步驟。

部署及驗證應用程式

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

a7a9d2b80d706a2b.png

結語

  • 比較您擁有的內容與「Module 1b」資料夾 (FINISH) 中的內容。如果您在過程中出錯,請視需要進行調整。
  • 如果您的應用程式仍使用 webapp2,請在這個頁面上並排比較「模組 0」main.py和「模組 1b」main.py,然後完成模組 1 Codelab,瞭解如何從 webapp2 遷移至 Flask。

恭喜您踏出第一步,將 Python 2 App Engine 應用程式遷移至 Python 3,同時保留目前使用的套裝服務。

清除所用資源

一般

如果暫時不需要使用,建議停用 App Engine 應用程式,以免產生費用。不過,如果您想進一步測試或實驗,App Engine 平台提供免付費配額,只要不超出該用量層級,就不會產生費用。這是指運算費用,但您可能也需要支付相關 App Engine 服務的費用,因此請參閱其定價頁面瞭解詳情。如果這項遷移作業涉及其他雲端服務,則這些服務會另外計費。無論是哪種情況,請視需要參閱下方的「本程式碼研究室專用」一節。

為求完整揭露,部署至 App Engine 等 Google Cloud 無伺服器運算平台時,會產生少量建構和儲存空間費用Cloud BuildCloud 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*ation,例如,如果您的應用程式託管於美國,則為「us」。

另一方面,如果您不打算繼續使用這個應用程式或其他相關的遷移 Codelab,並想完全刪除所有內容,請關閉專案

本程式碼研究室專用

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

後續步驟

接下來可以採取幾種做法:

  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 Blobstore 遷移至 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 知識或 Dockerfiles 的情況下完成這項作業。

您可以選擇改用其他無伺服器平台,但建議先考量應用程式和用途的最佳選項,再進行任何變更。

無論您接下來要考慮哪個遷移模組,都可以在 開放原始碼存放區存取所有 Serverless Migration Station 內容 (程式碼研究室、影片、原始碼 [如有])。此外,該存放區的 README 也提供指引,說明要考慮哪些遷移作業,以及遷移模組的相關「順序」。

7. 其他資源

以下列出其他資源,供開發人員進一步瞭解這個或相關的遷移模組,以及相關產品。包括提供內容意見回饋的位置、程式碼連結,以及您可能會覺得實用的各種文件。

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

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

遷移資源

您可以在下表中找到模組 1 (START) 和模組 1b (FINISH) 的存放區資料夾連結。您也可以從所有 App Engine 程式碼研究室遷移作業的存放區存取這些範例。

Codelab

Python 2

Python 3

Module 1

code

不適用

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

不適用

程式碼 (mod1b-flask)

線上資源

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

App Engine 套裝組合服務

App Engine 一般文件

其他雲端資訊

影片

授權

這項內容採用的授權為 Creative Commons 姓名標示 2.0 通用授權。