透過 Python 開始使用 Cloud Run

1. 簡介

96d07289bb51daa7.png

Cloud Run 是代管運算平台,能夠讓您執行可透過 HTTP 要求叫用的無狀態容器。這項服務以 Knative 建構而成的開放原始碼專案,為工作負載提供不同平台的可攜性。Cloud Run 採用無伺服器技術,可為您省去所有基礎架構管理工作,讓您專心處理最重要的事物,也就是建構出色的應用程式。

本教學課程的目標是建立簡易網頁應用程式,並將其部署至 Cloud Run。

2. 設定和需求

自修環境設定

  1. 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 未使用的字元字串。你隨時可以更新。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常為 PROJECT_ID)。如果您對產生的 ID 不滿意,可以隨機產生一個 ID。或者,您也可以自行嘗試,看看是否支援。在這個步驟後,這個名稱即無法變更,而且在專案期間內仍會保持有效。
  • 資訊中的第三個值是專案編號,部分 API 會使用這個編號。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行本程式碼研究室不會產生任何費用 (如果有的話)。如要關閉資源,以免產生本教學課程結束後產生的費用,您可以刪除自己建立的資源或刪除專案。新使用者符合 $300 美元免費試用計畫的資格。

啟動 Cloud Shell

雖然 Google Cloud 可以從筆記型電腦遠端操作,但在本教學課程中,您將使用 Cloud Shell,這是在 Cloud 中執行的指令列環境。

啟用 Cloud Shell

  1. 在 Cloud 控制台中,按一下「啟用 Cloud Shell」圖示 853e55310c205094.png

3c1dabeca90e44e5.png

如果您是第一次啟動 Cloud Shell,系統會顯示中繼畫面,說明這項服務的內容。如果系統顯示中繼畫面,請按一下「繼續」

9c92662c6a846a5c.png

佈建並連線至 Cloud Shell 只需幾分鐘的時間。

9f0e51b578fecce5.png

這個虛擬機器已載入所有必要的開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。在本程式碼研究室中,您的大部分作業都可透過瀏覽器完成。

連線至 Cloud Shell 後,您應會發現自己通過驗證,且專案已設為您的專案 ID。

  1. 在 Cloud Shell 中執行下列指令,確認您已通過驗證:
gcloud auth list

指令輸出

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. 在 Cloud Shell 中執行下列指令,確認 gcloud 指令知道您的專案:
gcloud config list project

指令輸出

[core]
project = <PROJECT_ID>

如果尚未設定,請使用下列指令進行設定:

gcloud config set project <PROJECT_ID>

指令輸出

Updated property [core/project].

3. 啟用 API

在 Cloud Shell 中啟用 Artifact Registry、Cloud Build 和 Cloud Run API:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com

這會輸出與以下內容類似的成功訊息:

Operation "operations/..." finished successfully.

現在,您可以開始工作並編寫應用程式...

4. 編寫應用程式

在這個步驟中,您將建構一個以 Flask 為基礎的簡易 Python 應用程式來回應 HTTP 要求。

工作目錄

使用 Cloud Shell 建立名為 helloworld-python 的工作目錄,並切換至該目錄:

mkdir ~/helloworld-python
cd ~/helloworld-python

main.py

建立名為 main.py 的檔案:

touch main.py

使用您偏好的指令列編輯器 (nano、vim 或 emacs),或是點選「Cloud Shell 編輯器」按鈕來編輯檔案:

10af7b1a6240e9f4.gif

如要使用 Cloud Shell 編輯器直接編輯檔案,請使用下列指令:

cloudshell edit main.py

main.py

from flask import Flask, request

app = Flask(__name__)


@app.get("/")
def hello():
    """Return a friendly HTTP greeting."""
    who = request.args.get("who", default="World")
    return f"Hello {who}!\n"


if __name__ == "__main__":
    # Development only: run "python main.py" and open http://localhost:8080
    # When deploying to Cloud Run, a production-grade WSGI HTTP server,
    # such as Gunicorn, will serve the app.
    app.run(host="localhost", port=8080, debug=True)

此程式碼會建立基本的網路服務,以友善的訊息來回應 HTTP GET 要求。

requirements.txt

新增名為 requirements.txt 的檔案以定義依附元件:

touch requirements.txt

如要使用 Cloud Shell 編輯器直接編輯檔案,請使用下列指令:

cloudshell edit requirements.txt

requirements.txt

# https://pypi.org/project/flask
Flask==3.0.2

# https://pypi.org/project/gunicorn
gunicorn==21.2.0

Procfile

最後,新增一個名為 Procfile 的檔案,指定應用程式提供的方式:

touch Procfile

如要使用 Cloud Shell 編輯器直接編輯檔案,請使用下列指令:

cloudshell edit Procfile

Procfile

web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

確認所有檔案都出現在工作目錄中:

ls

畫面上應會列出下列檔案:

main.py  Procfile  requirements.txt

您的應用程式已準備好部署,但我們必須先測試...

5. 測試應用程式

如要測試應用程式,請建立虛擬環境:

virtualenv venv

啟用虛擬環境:

source venv/bin/activate

安裝依附元件:

pip install -r requirements.txt

畫面上應會顯示確認訊息,如下所示:

...
Successfully installed Flask ... gunicorn ...

啟動應用程式:

python main.py

記錄顯示您目前處於開發模式:

 * Serving Flask app 'main'
 * Debug mode: on
   WARNING: This is a development server.
   Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Running on http://localhost:8080
   Press CTRL+C to quit
...

在 Cloud Shell 視窗中點選 Web Preview 圖示,然後選取 Preview on port 8080

6c9ff9e5c692c58e.gif

畫面上應會開啟顯示 Hello World! 訊息的瀏覽器視窗。

您也可以點選 + 圖示,將網路要求傳送至在本機執行的應用程式,藉此開啟另一個 Cloud Shell 工作階段 (新的終端機分頁):

curl localhost:8080

您應該會收到下列答案:

Hello World!

完成後,請返回主要的 Cloud Shell 工作階段,並停止含有 CTRL+Cpython main.py 指令。

結束虛擬環境:

deactivate

最後,移除虛擬環境目錄:

rm -r venv/

您的應用程式會如預期般運作,讓我們開始部署...

6. 部署至 Cloud Run

Cloud Run 具有「區域性」,這表示執行 Cloud Run 服務的基礎架構位於特定區域,並由 Google 代管,可為該區域內的所有可用區提供備援功能。定義部署項目所使用的區域,例如:

REGION="europe-west9"

確認您仍在工作目錄中:

ls

畫面上應會列出下列檔案:

main.py  Procfile  requirements.txt

將應用程式部署至 Cloud Run:

gcloud run deploy helloworld-python \
  --source . \
  --platform managed \
  --region $REGION \
  --allow-unauthenticated
  • 您可以使用下列指令定義預設區域:gcloud config set run/region $REGION
  • 您也可以用下列指令將 Cloud Run 預設為代管:gcloud config set run/platform managed
  • --allow-unauthenticated 選項會公開這項服務。如要避免未經驗證的要求,請改用 --no-allow-unauthenticated

首次建立 Artifact Registry 存放區時,系統會提示您建立 Artifact Registry 存放區。輕觸 Enter 即可驗證:

Deploying from source requires an Artifact Registry Docker repository to store
built containers. A repository named [cloud-run-source-deploy] in region [REGION]
will be created.

Do you want to continue (Y/n)?

這樣做即可將原始碼上傳至 Artifact Registry 存放區,以及容器映像檔的建構作業:

Building using Buildpacks and deploying container ...
* Building and deploying new service... Building Container.           
  OK Creating Container Repository...
  OK Uploading sources...
  * Building Container... Logs are available at ...

接著,請等待部署完成。部署成功之後,指令列會顯示服務網址:

...
OK Building and deploying new service... Done.
  OK Creating Container Repository...
  OK Uploading sources...
  OK Building Container... Logs are available at ...
  OK Creating Revision... Creating Service.
  OK Routing traffic...
  OK Setting IAM Policy...
Done.
Service [SERVICE]... has been deployed and is serving 100 percent of traffic.
Service URL: https://SERVICE-PROJECTHASH-REGIONID.a.run.app

您可以使用下列指令取得服務網址:

SERVICE_URL=$( \
  gcloud run services describe helloworld-python \
  --platform managed \
  --region $REGION \
  --format "value(status.url)" \
)
echo $SERVICE_URL

如下所示:

https://helloworld-python-PROJECTHASH-REGIONID.a.run.app

您現在可以在網路瀏覽器中開啟服務網址,使用應用程式:

c836b93e5601e2cf.gif

您也可以從 Cloud Shell 呼叫應用程式:

curl $SERVICE_URL?who=me

這應該會顯示您預期的問候語:

Hello me!

恭喜!您已將應用程式部署至 Cloud Run。Cloud Run 會自動及水平擴充您的容器映像檔,以處理收到的要求,然後在需求減少時縮減規模。您只需要支付處理要求期間使用的 CPU、記憶體和網路費用。

7. 清除所用資源

不使用服務時,Cloud Run 不會收費,但您可能仍須支付將容器映像檔儲存在 Artifact Registry 中。如要避免產生費用,您可以刪除存放區或刪除 Cloud 專案。刪除 Cloud 專案後,系統就會停止對該專案使用的所有資源收取費用。

刪除容器映像檔存放區:

gcloud artifacts repositories delete cloud-run-source-deploy \
  --location $REGION

如要刪除 Cloud Run 服務,請按照下列步驟操作:

gcloud run services delete helloworld-python \
  --platform managed \
  --region $REGION

如要刪除 Google Cloud 專案,請按照下列步驟操作:

  1. 擷取目前的專案 ID:
PROJECT_ID=$(gcloud config get-value core/project)
  1. 請確認這是要刪除的專案:
echo $PROJECT_ID
  1. 刪除專案:
gcloud projects delete $PROJECT_ID

8. 恭喜!

96d07289bb51daa7.png

您已成功建立簡易型網頁應用程式,並部署至 Cloud Run!

瞭解詳情

授權

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