使用 Cloud Run 透過 3 個簡單步驟將開發人員部署至實際工作環境

1. 簡介

為何很難管理應用程式?

其中一個重大原因是,開發人員通常必須成為兼職系統管理員。請考慮以下部分疑慮清單,以便開發、部署及管理現代化的正式環境等級網頁應用程式:

4d018476b4a73b47.png

我不知道你,但這些都我不想太擔心!我真正想考慮的應用程式邏輯:

6dfd143d20e5548b.png

簡單來說,Cloud Run 的本質就是 Cloud Run 的重點:您可以專心處理應用程式,並將所有管理與維護作業留給他人,也就是 Google。他們投入了數百萬小時來修正和精進這個領域的技能。

除了上述的管理挑戰之外,您還必須處理:

  • 「Dependencies」:應用程式的執行環境應盡可能精確符合測試環境。其中包括作業系統、支援資料庫、語言翻譯或編譯器、硬體設定等多種因素。
  • 發布:如要從本地卸除應用程式轉移至在網際網路上大範圍分享的應用程式,通常需要變更執行階段環境、變更複雜度、學習難度。

Cloud Run 可以為您解決上述和其他許多疑慮。不過,與其說法不定,我們來一起建構應用程式,看看只要幾個簡單步驟,就能輕鬆從本機開發環境轉移至實際工作環境等級的雲端應用程式。

您將要執行的操作...

  • 您將建構簡易的網頁應用程式,並確認應用程式在開發環境中的運作方式符合預期。
  • 然後,移至同一個應用程式的容器化版本。過程中,您將探索容器化的意義,以及這項功能如此實用的原因。
  • 最後,您會將應用程式部署至雲端,瞭解如何利用指令列和 Google Cloud 控制台輕鬆管理 Cloud Run 服務。

課程內容...

  • 如何使用 Python 建立簡易的網路伺服器應用程式
  • 如何將應用程式封裝至在任何位置執行的 Docker 容器
  • 如何將應用程式部署至雲端,讓任何人都能嘗試你的新創作
  • 如何使用 Buildpacks 進一步簡化上述步驟
  • 如何使用 Google Cloud 指令列工具與 Cloud 控制台網頁版 UI

軟硬體需求

  • 網路瀏覽器
  • Google 帳戶

本研究室的適用對象為各級開發人員,包括初學者。雖然您需要使用 Python,但您不需要熟悉 Python 程式即可瞭解這一點,因為我們會說明您使用的所有程式碼。

2. 進行設定

5110b5081a1e1c49.png

本節說明開始使用這個研究室所需的一切資源。

自修環境設定

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

提醒您,專案 ID 是所有 Google Cloud 專案的專屬名稱 (已經有人使用上述名稱,很抱歉對您不符!)。稍後在本程式碼研究室中會稱為 PROJECT_ID

  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Google Cloud 資源。

執行這個程式碼研究室並不會產生任何費用,如果有的話。請務必依照「清除所用資源」一節指示本節將說明如何關閉資源,這樣您就不會產生本教學課程結束後產生的費用。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。

啟動 Cloud Shell

在本研究室中,您將會透過 Cloud Shell 工作階段執行,也就是由在 Google 雲端環境中運作的虛擬機器託管的指令解譯器。您可以和在自己的電腦本機輕鬆執行這個部分,但只要使用 Cloud Shell,就能在一致的環境中提供可重現的體驗。完成研究室後,您可以使用自己的電腦再試一次。

704a7b7491bd157.png

啟用 Cloud Shell

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

bce75f34b2c53987.png

如果您先前從未啟動 Cloud Shell,您會看見中繼畫面 (需捲動位置),說明螢幕內容。如果出現這種情況,請按一下「繼續」 (之後不會再顯示)。以下是單次畫面的外觀:

70f315d7b402b476.png

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

fbe3a0674c982259.png

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

連線至 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].

在終端機中設定一些環境變數,讓後續步驟變得更加輕鬆:

export PROJ=$GOOGLE_CLOUD_PROJECT 
export APP=hello 
export PORT=8080
export REGION="us-central1"
export TAG="gcr.io/$PROJ/$APP"

啟用 API

在後續步驟中,您將看到需要這些服務的位置和原因。目前請先執行下列指令,為專案授予 Cloud Build、Container Registry 和 Cloud Run 服務的存取權:

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

這應該會產生類似下列內容的成功訊息:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

3. 建構簡易網頁應用程式

eef530b56b8e93a3.png

首先,請點選 Cloud Shell 面板頂端的 Open Editor 按鈕。這是訂閱按鈕的圖示:

9b81c8a37a6bcdd8.png

接著,您會進入類似 Visual Studio Code 的 IDE 環境,在這個環境中可以建立專案、編輯原始碼、執行程式等。如果畫面過於壓縮,您可以拖曳兩個區域與編輯/終端機視窗之間的水平線,拉寬或縮小主控台與編輯/終端機視窗之間的分隔線,如下所示:

8dea35450851af53.png

您可以按一下 Open EditorOpen Terminal 按鈕,在編輯器和終端機之間切換。現在就嘗試在這兩種環境間切換。

接下來,請建立一個用來儲存這個研究室工作的資料夾,方法是依序選取「File」->「New Folder」,輸入 hello,然後按一下 OK。您在本研究室中建立的所有檔案,以及您在 Cloud Shell 中執行的所有工作,都會存放在這個資料夾中。

現在請建立 requirements.txt 檔案。這會告知 Python 應用程式依附哪些程式庫。針對這個簡單的網頁應用程式,您將使用熱門的 Python 模組來建構名為 Flask 的網路伺服器,以及名為 gunicorn 的網路伺服器架構。在 Cloud 編輯器視窗中,依序點選「File」(檔案) ->「New File」(新增檔案) 選單,以建立新檔案。系統提示您輸入新檔案名稱時,請輸入 requirements.txt 並按下 OK 按鈕。確認新檔案的結尾位於 hello 專案資料夾中。

在新檔案中輸入下列程式碼,指定應用程式依附於 Python Flask 套件和 gunicorn 網路伺服器。

Flask
gunicorn

Cloud 編輯器會自動為您儲存變更,因此您不必手動儲存這個檔案。

版本 1:Hello World!

使用相同的技術,建立另一個名為 main.py 的新檔案。這會是應用程式的主要 (也是唯一) Python 來源檔案。再次確認,新檔案最終位於 hello 專案資料夾中。

在這個檔案中插入下列程式碼:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from the environment.

# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
@app.route("/", methods=["GET"])
def say_hello():
    html = "<h1>Hello world!</h1>"
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

請返回終端機,並使用下列指令切換至專案資料夾:

cd hello

執行下列指令,安裝專案依附元件:

pip3 install -r requirements.txt

接著在終端機執行下列指令,以啟動應用程式:

python3 main.py

目前您的應用程式會在 Cloud Shell 工作階段專用的虛擬機器中執行。Cloud Shell 提供 Proxy 機制,可讓您從全球網際網路的任何位置,存取在虛擬機器上執行的網路伺服器 (例如您剛啟動的伺服器)。

按一下 web preview 按鈕,然後選取 Preview on Port 8080 選單項目,如下所示:

fe45e0192080efd6.png

這會開啟執行中應用程式的網路瀏覽器分頁,如下所示:

b1f06501509aefb9.png

版本 2:忽略網址路徑

返回 Cloud 編輯器 (透過 Open Editor 按鈕),然後更新 main.py 檔案,新增回應選用網址後置字串的支援功能,如下所示:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.

# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"])     # ← NEW
def say_hello(name="world"):               # ← MODIFIED
    html = f"<h1>Hello {name}!</h1>"       # ← MODIFIED
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

接著切換回終端機 (使用 Open Terminal 按鈕),然後輸入 control-C (按住 Ctrl 鍵並同時按下 C 鍵),即可停止執行中的應用程式。輸入指令後,即可重新啟動應用程式:

python3 main.py

同樣,按一下 web preview 按鈕,然後點選 Preview on Port 8080 選單項目,即可開啟執行中應用程式的網路瀏覽器分頁。此時畫面會顯示「Hello world!」訊息,但現在請將斜線字元後的網址文字換成您選擇的任何字串 (例如 /your-name),然後確認您會看到如下內容:

93b87996f88fa370.png

版本 3:隨機顏色

現在,返回 Cloud 編輯器 (透過 Open Editor 按鈕) 並更新 main.py 檔案,以新增隨機背景顏色的支援,如下所示:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from the environment.

# This function decides whether foreground text should be
# displayed in black or white, to maximize fg/bg contrast.
def set_text_color(rgb):                      # ← NEW
    sum = round(                              # ← NEW
        (int(rgb[0]) * 0.299)                 # ← NEW
        + (int(rgb[1]) * 0.587)               # ← NEW
        + (int(rgb[2]) * 0.114)               # ← NEW
    )                                         # ← NEW
    return "black" if sum > 186 else "white"  # ← NEW


# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
# To verify each new invocation of these requests, the HTML document
# includes CSS styling to produce a randomly colored background.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"])
def say_hello(name="world"):
    bg = random.sample(range(1, 255), 3)                       # ← NEW
    hex = (int(bg[0]) * 256) + (int(bg[1]) * 16) + int(bg[2])  # ← NEW
    fg_color = set_text_color(bg)                              # ← NEW
    bg_color = f"#{hex:06x}"                                   # ← NEW
    style = f"color:{fg_color}; background-color:{bg_color}"   # ← NEW
    html = f'<h1 style="{style}">Hello {name}!</h1>'           # ← MODIFIED
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

接著切換回終端機 (使用 Open Terminal 按鈕),然後輸入 control-C (按住 Ctrl 鍵並同時按下 C 鍵),即可停止執行中的應用程式。輸入指令後,即可重新啟動應用程式:

python3 main.py

同樣,按一下 web preview 按鈕,然後點選 Preview on Port 8080 選單項目,即可開啟執行中應用程式的網路瀏覽器分頁。您應該會看到產生的文字,包含任何指定後置字串或預設「Hello World!」。字串,顯示在隨機彩色背景前,如下所示:

baf8d028f15ea7f4.png

重新載入網頁數次,即可在每次造訪應用程式時,隨機變更背景顏色。

恭喜,您的應用程式完成了,恭喜!在下一個步驟中,您將瞭解如何將應用程式封裝至容器,以及這麼做的原因。

4. 將應用程式容器化

17cc234ec3325a8a.png

什麼是容器?

容器 (尤其是 Docker) 可讓我們建立模組方塊,並在其中執行應用程式,並將所有依附元件組合在一起。我們將結果稱為容器映像檔在本節中,您將建立容器映像檔,以封裝應用程式及其所有依附元件。

說到依附元件,在先前的步驟中,您在開發人員環境中執行應用程式時必須執行 pip3 install -r requirements.txt,並確認 requirements.txt 檔案包含所有相依程式庫和對應版本。有了容器,您就能在產生容器映像檔時安裝這些需求,因此容器使用者不必費心安裝任何程式

這個容器映像檔將成為基本建構區塊,用來在 Cloud Run 部署應用程式。容器幾乎能在任何虛擬或實際伺服器上使用,因此我們能在任何位置部署應用程式,以及將應用程式從某個服務供應商轉移至另一個服務,或從地端部署環境遷移至雲端。

容器有助於應用程式:

  • 可重現 - 容器為獨立且完整
  • 可攜 - 容器是跨產業建構模塊,可讓應用程式在不同雲端服務供應商和環境之間遷移

簡單來說,容器提供「編寫一次且可在任何地方執行」的功能。有一個例外情況是,產生的容器只能在您建立容器的處理器類型上執行,但也可以為其他硬體設定產生容器版本。

講得好,接著我們來打造容器吧!您將使用特定技術建立名為 Docker 的容器。

在 Cloud 編輯器中,建立名為 Dockerfile 的新檔案。這個檔案是建構映像檔的藍圖。這項工具會告知 Docker 您的作業環境和原始碼、如何安裝依附元件、建構應用程式,以及執行程式碼。

# Use an official lightweight Python image.
FROM python:3.9-slim

# Copy local code to the container image.
WORKDIR /app
COPY main.py .
COPY requirements.txt .

# Install dependencies into this container so there's no need to 
# install anything at container run time.
RUN pip install -r requirements.txt

# Service must listen to $PORT environment variable.
# This default value facilitates local development.
ENV PORT 8080

# Run the web service on container startup. Here you use the gunicorn
# server, with one worker process and 8 threads. For environments 
# with multiple CPU cores, increase the number of workers to match 
# the number of cores available.
CMD exec gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 main:app

在 Cloud Terminal 中執行下列指令,使用 Cloud Build 建構容器映像檔:

gcloud builds submit --tag $TAG

推送至登錄檔後,您會看到 SUCCESS 訊息,其中包含映像檔名稱,如下所示:gcr.io/<project-id>/hello。映像檔現已儲存在 Google Container Registry 中,方便您隨時隨地重複使用。

您可以使用下列指令,列出與目前專案相關聯的所有容器映像檔:

gcloud container images list

接著使用以下 docker 指令,透過 Cloud Shell 在本機執行並測試應用程式:

docker run -p $PORT:$PORT -e PORT=$PORT $TAG

-p $PORT:$PORT 選項會指示 Docker 將主機環境中的外部通訊埠 $PORT (設為上述 8080) 對應至執行中容器內的相同通訊埠編號。這樣的做法更加簡單,因為您撰寫的伺服器程式碼和測試應用程式時所連結的外部通訊埠號碼相同 (8080),但只要使用 -p 選項,即可將主機上的任意外部通訊埠對應至容器內任何所需的內部通訊埠。

-e PORT=$PORT 選項會指示 Docker 將 $PORT 環境變數 (設為 8080 以上) 提供給在容器中執行的應用程式使用。

現在,您現在可以將網路瀏覽器指向在容器中執行的 Python 程式碼,藉此測試應用程式。在 Cloud Shell 視窗中,按一下「網頁預覽」圖示,然後選取「透過以下通訊埠預覽:8080」,方法與上一個步驟相同。

結果看起來應該很類似。這些文字會顯示在隨機顏色的背景前面,就像直接在 Cloud Shell 終端機中執行應用程式時一樣。重新載入網頁數次,即可在每次造訪應用程式時,隨機變更背景顏色。

恭喜!您現在可以執行應用程式的容器化版本。在下一節中,您無須輕觸任何程式碼,就能將容器映像檔轉換為正式版網頁應用程式

5. 遷移至雲端...

1b0665d94750ded6.gif

將應用程式容器化後,您會想與全球其他使用者分享這個好消息,現在就可以部署至雲端了。不過,您想做的不只是分享,您必須確認:

  • 穩定執行:如果電腦執行應用程式當機,你就會收到自動具備容錯能力
  • 應用程式能自動調度龐大流量,即使無人使用,應用程式也會自動減少佔用空間
  • 可將成本降至最低,也就是不針對未使用的資源收費 - 您只有在回應流量時,才為所耗用的資源付費
  • 可透過自訂網域名稱存取 - 您可透過一鍵解決方案,將自訂網域名稱指派給您的服務
  • 提供絕佳的回應時間 - 冷啟動可以合理回應,但您可以指定執行個體下限設定來微調
  • 支援使用標準 SSL/TLS 網路安全性的端對端加密技術:部署服務時,免費並自動取得標準網路加密功能,以及對應的必要憑證

將應用程式部署至 Google Cloud Run,即可享有上述所有功能和更多福利。

將應用程式部署至 Cloud Run

首先,讓我們請修改應用程式,以便從舊的修訂版本中得知新版本。方法是修改 main.py 檔案,讓預設訊息從「Hello world!」變更變更為「Hello from Cloud Run!」。換句話說,將 main.py 中的這一行從以下內容變更為:

def say_hello(name="world"):

改為:

def say_hello(name="from Cloud Run"):

Cloud Run 具有「區域性」,這表示執行 Cloud Run 服務的基礎架構位於特定區域,並由 Google 代管,可為該區域內的所有可用區提供備援功能。在「開始設定」您已透過 REGION 環境變數定義預設區域。

使用下列指令重新建構容器映像檔,並將容器化應用程式部署至 Cloud Run:

gcloud builds submit --tag $TAG
gcloud run deploy "$APP"   \
  --image "$TAG"           \
  --platform "managed"     \
  --region "$REGION"       \
  --allow-unauthenticated
  • 您也可以使用 gcloud config set run/region $REGION 定義預設區域。
  • --allow-unauthenticated 選項會公開這項服務。如要避免未經驗證的要求,請改用 --no-allow-unauthenticated

這裡指定的映像檔是您在上一個步驟中建立的 Docker 映像檔。有了 Cloud Build 服務,將產生的映像檔儲存在 Google Container Registry 中,Cloud Run 服務就能為您尋找及部署映像檔。

稍候片刻,等待部署作業完成。部署成功之後,指令列會顯示服務網址:

Deploying container to Cloud Run service [hello] in project [PROJECT_ID...
✓ Deploying new service... Done.                                   
  ✓ Creating Revision... Revision deployment finished. Waiting for health check...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [hello] revision [hello-...] has been deployed and is serving 100 percent of traffic.
Service URL: https://hello-....a.run.app

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

gcloud run services describe hello  \
  --platform managed                \
  --region $REGION                  \
  --format "value(status.url)"

如下所示:

https://hello-....a.run.app

這個連結是具有傳輸層安全標準 (TLS) 安全性的專屬網址,適用於 Cloud Run 服務。這個連結永久有效 (只要未停用服務),即可在網際網路中的任何地方使用。並未使用前述的 Cloud Shell Proxy 機制,這類機制需仰賴暫時性的虛擬機器。

按一下醒目顯示的 Service URL,即可開啟執行中的應用程式的網路瀏覽器分頁。結果應會顯示「Hello from Cloud Run!」。顯示在隨機顏色的背景前

恭喜!您的應用程式正在 Google Cloud 中執行。您的應用程式可供公開存取,並採用 TLS (HTTPS) 加密機制,並自動調整資源配置,能因應瞬息萬變的流量。

但我覺得這個過程可以再簡單不過...

6. 自動建立容器

這功能非常實用,但如果我不想使用 Dockerfile 和容器,該怎麼辦?和大多數開發人員一樣,我只想專心編寫應用程式的程式碼,讓其他人會擔心容器化。好消息是,Cloud Run 支援名為 Buildpacks 的開放原始碼標準,因此之所以推出這類標準,是為了自動化處理透過一組來源檔案建立容器的程序。

請注意,在某些情況下,開發人員可能偏好使用明確的 Dockerfile,例如希望大幅自訂容器的建構方式。但針對這類練習的常見情況,建構包可正常運作,不必手動製作 Dockerfile。讓我們修改程式碼以使用 Buildpack。

首先,讓我們請修改應用程式,以便從舊的修訂版本中得知新版本。方法是修改 main.py 檔案,讓預設訊息從「Hello from Cloud Run!」中變更。變更為「Hello from Cloud Run with Buildpacks!」。換句話說,將 main.py 中的這一行從以下內容變更為:

def say_hello(name="from Cloud Run"):

改為:

def say_hello(name="from Cloud Run with Buildpacks"):

現在我們要建立名為 Procfile 的新檔案,藉此利用 buildpack。請直接在 Cloud 編輯器中建立該檔案,然後插入以下一行文字:

web: python3 main.py

這會告知建構系統如何在自動產生的容器中執行應用程式。有了這麼少量的指令,您甚至不需要再使用 Dockerfile。如要確認這一點,請刪除 Dockerfile 並在 Cloud Shell 終端機中執行下列指令:

gcloud beta run deploy "$APP"  \
    --source .                 \
    --platform "managed"       \
    --region "$REGION"         \
    --allow-unauthenticated

這類似於您在上個步驟中執行應用程式的指令,但這次您已將 --image 選項替換為 --source . 選項。這會指示 gcloud 指令使用 buildpacks,以根據在目前目錄中找到的來源檔案建立容器映像檔 (--source . 中的 dot 是目前目錄的簡寫)。這項服務會以隱含方式處理容器映像檔,因此您不必針對這個 gcloud 指令指定映像檔。

再次確認部署作業是否正常運作,請點選醒目顯示的 Service URL,開啟網路瀏覽器分頁並前往執行中的應用程式,並確認服務顯示「Hello from Cloud Run with Buildpacks!」。顯示在隨機顏色的背景前

請注意,使用 Buildpack 來製造 Dockerfile,基本上將三個簡單的步驟縮減為兩個:

  1. 在開發環境中建立應用程式。
  2. 透過一個指令將完全相同的程式碼部署至雲端。

7. 一定要使用指令列嗎?

不!與幾乎所有 Google Cloud 服務一樣,您可以透過三種方式與 Cloud Run 互動:

  • 剛才看過的 gcloud 指令列工具。
  • Cloud 控制台提供功能豐富的網頁使用者介面,支援直觀的點選互動樣式。
  • 透過程式輔助方式,使用許多熱門程式語言 (包括 Java、C#、Python、Go、JavaScript、Ruby、C/C++ 等) 的 Google 用戶端程式庫,透過程式輔助方式刊登廣告。

讓我們透過控制台 UI 部署 Cloud Run 應用程式的其他執行個體。透過左上方的選單,前往 Cloud Run 服務到達網頁:

e2b4983b38c81796.png

畫面應該會顯示 Cloud Run 服務的摘要,如下所示:

b335e7bf0a3af845.png

按一下 [建立服務]開始部署程序的連結:

51f61a8ddc7a4c0b.png

輸入「hello-again」使用預設的部署平台和區域,然後點選「下一步」。

8a17baa45336c4c9.png

輸入容器映像檔的網址:gcr.io/cloudrun/hello。這是 Google 建立測試用的容器,然後按一下「進階設定」下拉式選單中,即可查看一些您可使用的配置設定。請注意,你可以自訂其中幾個項目:

  • 通訊埠編號及容器進入點 (會覆寫建構容器時指定的進入點)
  • 硬體:記憶體和 CPU 數量
  • 資源調度:執行個體數量下限與上限
  • 環境變數
  • 其他:要求逾時設定、每個容器的要求數量上限、HTTP/2

點選「下一步」這個按鈕可前往對話方塊下一個對話方塊可讓您指定觸發服務的方式。在「Ingress」部分,選取「允許所有流量」,然後在「驗證」部分選取「允許未經驗證的流量」。

e78281d1cff3418.png

這是最嚴格的設定,能讓任何人在公開網際網路上的任何位置存取您的 Cloud Run 應用程式,而不必指定驗證憑證。您可能會希望應用程式的設定更加嚴格,但在這個練習中,我們還是盡量簡單。

現在按一下 Create 按鈕即可建立 Cloud Run 服務。幾秒後,您應該會在 Cloud Run 服務的摘要清單中看到新服務。摘要行提供最新部署項目 (日期/時間和操作者),同時提供幾項重要配置設定。按一下服務名稱連結,即可細查新服務的詳細資料。

如要驗證服務,請按一下摘要頁面頂端附近顯示的網址,如以下範例所示:

6c35cf0636dddc51.png

畫面應如下所示:

3ba6ab4fe0da1f84.png

您已部署新的 Cloud Run 服務,現在請選取「REVISIONS」分頁標籤,瞭解管理多項部署作業的方法。

2351ee7ec4a356f0.png

如要直接從控制台部署新的修訂版本,請按一下 EDIT & DEPLOY NEW REVISION 按鈕,如下方螢幕截圖所示:

a599fa88d00d6776.png

現在請點選該按鈕,建立新的修訂版本。在容器網址附近按一下 SELECT 按鈕,如下所示:

5fd1b1f8e1f11d40.png

在彈出的對話方塊中,找出您之前使用 Buildpacks 從 Cloud Build 部署的簡易網頁應用程式,然後按一下「選取」。請務必選擇

gcr.io/<project>/cloud-run-source-deploy

folder

8a756c6157face3a.png

選取完畢後,請捲動至底部,然後按一下 DEPLOY 按鈕。您現已部署應用程式的新版本。如要進行驗證,請再次前往服務網址,確認畫面顯示彩色的「Hello from Cloud Run with Buildpacks!」。網頁應用程式。

如您所見,修訂版本分頁會提供您部署的每個修訂版本的摘要,現在應該會顯示這項服務的兩個修訂版本。如要選取特定修訂版本,請按一下修訂版本名稱左側的圓形按鈕,即可在畫面右側顯示修訂版本詳細資料摘要。選取這些按鈕,即可看到兩個修訂版本來自兩個不同的容器映像檔。

MANAGE TRAFFIC 按鈕可讓您修改傳入要求傳送至特定修訂版本的分配方式。您可以透過這項功能來微調傳送至特定修訂版本的流量,這樣就能達成下列幾項有價值的用途:

  • 利用一小部分傳入流量,對新版應用程式進行初期測試
  • 將流量從有問題的版本還原成先前版本
  • A/B 測試

您可以在這裡找到 MANAGE TRAFFIC 按鈕:

519d3c22ae028287.png

如要在兩個修訂版本之間設定 50/50 的流量分配,請指定如下的 50/50 流量分配,如下所示:

8c37d4f115d9ded4.png

現在請點選「儲存」按鈕,並重複造訪服務的網址,驗證 50/50 的分割比例,確認目前修訂版本中平均有一半的要求是由目前的修訂版本 (「Hello from Cloud Run with Buildpacks!」) 處理,而且有一半的要求是由先前的修訂版本 (「運作中!」) 處理。

「服務詳細資料」頁面中的其他分頁可讓您監控效能、流量和記錄檔,方便您深入瞭解服務的運作程度和運作情況。您也可以在「權限」部分調整服務存取權分頁。請花點時間瀏覽這個頁面的各個分頁,瞭解這個頁面提供的功能。

程式輔助介面

如先前所述,您也可以選擇透過程式輔助方式建立、部署及管理 Cloud Run 服務。對於手動工作,這個選項比指令列或網路控制台更進階,但絕對是實現 Cloud Run 服務自動化的方式。您可以選擇在幾種常用的程式設計語言中使用 Google 用戶端程式庫

8. 測試應用程式

198ada162d1f0bf1.png

在最後一個步驟中,您將執行人工負載測試,對應用程式進行壓力測試,並觀察應用程式如何隨著傳入需求調度資源。您將使用已預先安裝在 Cloud Shell 中的 hey 工具,讓我們可以執行負載測試及呈現結果。

執行測試

在 Cloud Shell 終端機中執行下列指令,執行負載測試:

hey -q 1000 -c 200 -z 30s https://hello-...run.app

指令引數的解譯如下:

  • -q 1000:嘗試將負載量提升至每秒約 1,000 個要求
  • -c 200 - 分配 200 個平行工作站
  • -z 30s:執行 30 秒的負載測試
  • 請務必在此指令列中,使用您的服務網址做為最後一個引數

測試結果應如下所示:

 Summary:
 Total:        30.2767 secs
 Slowest:      3.3633 secs
 Fastest:      0.1071 secs
 Average:      0.1828 secs
 Requests/sec: 1087.2387
 Total data:   3028456 bytes
 Size/request: 92 bytes

Response time histogram:
 0.107 [1]     |
 0.433 [31346] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
 0.758 [1472]  |■■
 1.084 [82]    |
 1.410 [4]     |
...

Latency distribution:
...
 50% in 0.1528 secs
 75% in 0.1949 secs
 90% in 0.2442 secs
 95% in 0.4052 secs
 99% in 0.7062 secs

Details (average, fastest, slowest):
...
 req write:    0.0000 secs, 0.0000 secs, 0.0232 secs
 resp wait:    0.1824 secs, 0.1070 secs, 3.2953 secs
 resp read:    0.0000 secs, 0.0000 secs, 0.0010 secs
Status code distribution:
 [200] 32918 responses

這份摘要提供了幾個感興趣的項目:

  • 已有 30 秒,每秒傳送 32,918 個要求約為每秒 1,000 個要求。
  • 沒有任何錯誤 (只有 200 HTTP 回應)。
  • 平均延遲時間為 180 毫秒。
  • 最低延遲時間為 107 毫秒,最差的情況為 3.3 秒
  • 第 90 個百分位數的延遲時間為 244 毫秒

如果您查看 Cloud Run 控制台的「METRICS」分頁,可以看見效能故事的伺服器端端:

e635c6831c468dd3.png

9. 清除所用資源

不使用服務時,Cloud Run 不會收費,但您可能仍須支付儲存所建構之容器映像檔的費用。

如要避免產生費用,您可以刪除 GCP 專案,讓專案中使用的所有資源不再產生費用;您也可以執行下列指令,直接刪除容器映像檔:

gcloud container images delete $TAG

如要刪除 Cloud Run 服務,請使用下列指令:

gcloud run services delete hello --platform managed --region $REGION --quiet
gcloud run services delete hello-again --platform managed --region $REGION --quiet

10. 操作成功!

9a31f4fdbbf1ddcb.png

恭喜!您已成功建構及部署實際工作環境的 Cloud Run 應用程式。過程中,您已瞭解容器以及如何建構自己的容器。您已瞭解如何輕鬆使用 gcloud 指令列工具和 Cloud 控制台,透過 Cloud Run 部署應用程式。現在您已經知道如何與全世界分享您的精彩作品!

在此提供一個重要問題:

當應用程式開始在開發人員環境中運作後,您需要修改幾行程式碼,才能將應用程式部署至雲端,並取得 Cloud Run 提供的所有實際工作環境等級屬性。

當然,答案是 0。:)。

程式碼研究室

其他值得探索的酷炫功能...

參考說明文件...

11. 行動號召

Google Cloud 標誌

如果您喜歡本程式碼研究室,且有可能會投入更多時間進行 Google Cloud 實作,建議您立即加入 Google Cloud Innovators 計畫

創新者一般會員徽章標誌

Google Cloud Innovators 可以免費體驗,內容涵蓋:

  • 透過即時討論、AMA 和藍圖講座,直接向 Google 員工學習最新消息
  • 直接透過收件匣接收 Google Cloud 最新消息
  • 數位徽章和視訊會議背景
  • 提供 500 點數:包含研究室和 Skills Boost 學習資源

按一下這裡報名參加!