本教學課程說明如何使用 Workflows 連結一系列服務。您可以連結兩個公開 HTTP 服務 (使用 Cloud Run 函式)、外部 REST API 和私有 Cloud Run 服務,藉此建立彈性的無伺服器應用程式。
部署第一個 Cloud Run functions 服務
收到 HTTP 要求後,這個 HTTP 函式會產生介於 1 到 100 之間的隨機數字,然後以 JSON 格式傳回該數字。
建立名為
randomgen
的目錄,然後切換至該目錄:mkdir ~/randomgen cd ~/randomgen
建立名為
main.py
的文字檔,其中包含下列 Python 程式碼:如要支援 Flask 的 HTTP 處理依附元件,請為 pip 套件管理員建立文字檔。將檔案命名為
requirements.txt
,並加入下列內容:使用 HTTP 觸發條件部署函式,並允許未經驗證的存取權:
gcloud functions deploy randomgen \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
部署函式可能需要幾分鐘的時間。或者,您也可以在 Google Cloud 控制台使用 Cloud Run 函式介面部署函式。
部署函式後,您可以確認
httpsTrigger.url
屬性:gcloud functions describe randomgen
您可以使用下列 curl 指令試用函式:
curl $(gcloud functions describe randomgen --format='value(httpsTrigger.url)')
系統會隨機產生並傳回一個數字。
部署第二個 Cloud Run 函式服務
收到 HTTP 要求後,這項 HTTP 函式會從 JSON 主體中擷取 input
,然後將其乘以 2,並以 JSON 格式傳回結果。
建立名為
multiply
的目錄,然後切換至該目錄:mkdir ~/multiply cd ~/multiply
建立名為
main.py
的文字檔,其中包含下列 Python 程式碼:如要支援 Flask 的 HTTP 處理依附元件,請為 pip 套件管理員建立文字檔。將檔案命名為
requirements.txt
,並加入下列內容:使用 HTTP 觸發條件部署函式,並允許未經驗證的存取權:
gcloud functions deploy multiply \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
部署函式可能需要幾分鐘的時間。或者,您也可以使用 Google Cloud 控制台中的 Cloud Run 函式介面部署函式。
部署函式後,您可以確認
httpsTrigger.url
屬性:gcloud functions describe multiply
您可以使用下列 curl 指令試用函式:
curl $(gcloud functions describe multiply --format='value(httpsTrigger.url)') \ -X POST \ -H "content-type: application/json" \ -d '{"input": 5}'
系統應會傳回數字 10。
在工作流程中連結這兩項 Cloud Run 函式服務
工作流程是由一系列步驟組成,這些步驟使用 Workflows 語法描述,且可採用 YAML 或 JSON 格式編寫。這是工作流程的定義。如需詳細說明,請參閱「語法參考資料」頁面。
返回主目錄:
cd ~
建立名為
workflow.yaml
的文字檔,並在當中加入下列內容:- randomgen_function: call: http.get args: url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen result: randomgen_result - multiply_function: call: http.post args: url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply body: input: ${randomgen_result.body.random} result: multiply_result - return_result: return: ${multiply_result}
這會將兩個 HTTP 函式連結在一起,並傳回最終結果。
建立工作流程後,您可以部署工作流程,讓工作流程準備好執行。
gcloud workflows deploy WORKFLOW_NAME --source=workflow.yaml
將
WORKFLOW_NAME
替換為工作流程的名稱。執行工作流程:
gcloud workflows run WORKFLOW_NAME
執行作業是指單次執行工作流程定義中包含的邏輯。 所有工作流程執行作業都是獨立的,而且工作流程可快速調度資源,因此能同時執行大量作業。
工作流程執行完畢後,輸出內容應如下所示:
result: '{"body":{"multiplied":120},"code":200,"headers":{"Alt-Svc":"h3-29=\":443\"; ... startTime: '2021-05-05T14:17:39.135251700Z' state: SUCCEEDED ...
在工作流程中連結公開 REST 服務
更新現有工作流程,並連結可評估數學運算的公開 REST API (math.js)。例如:curl https://api.mathjs.org/v4/?'expr=log(56)'
。
請注意,由於您已部署工作流程,因此也可以透過 Google Cloud 控制台的「Workflows」頁面編輯工作流程。
編輯工作流程的來源檔案,並將其替換為下列內容:
- randomgen_function: call: http.get args: url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen result: randomgen_result - multiply_function: call: http.post args: url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply body: input: ${randomgen_result.body.random} result: multiply_result - log_function: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiply_result.body.multiplied) + ")"} result: log_result - return_result: return: ${log_result}
這會將外部 REST 服務連結至 Cloud Run 函式服務,並傳回最終結果。
部署修改後的工作流程:
gcloud workflows deploy WORKFLOW_NAME --source=workflow.yaml
部署 Cloud Run 服務
部署 Cloud Run 服務,在收到 HTTP 要求後,從 JSON 內文擷取 input
,計算其 math.floor
,然後傳回結果。
建立名為
floor
的目錄,然後切換至該目錄:mkdir ~/floor cd ~/floor
建立名為
app.py
的文字檔,並在其中加入下列 Python 程式碼:在同一個目錄中建立
Dockerfile
,並加入以下內容:建立 Artifact Registry 標準存放區,用於儲存 Docker 容器映像檔:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=${REGION}
將
REPOSITORY
替換成存放區的專屬名稱。建構容器映像檔:
export SERVICE_NAME=floor gcloud builds submit --tag ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}
將容器映像檔部署至 Cloud Run,確保只接受已驗證的呼叫:
gcloud run deploy ${SERVICE_NAME} \ --image ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}:latest \ --platform managed \ --no-allow-unauthenticated
看到服務網址時,表示部署作業已完成。更新工作流程定義時,您需要指定該網址。
在工作流程中連結 Cloud Run 服務
更新現有工作流程,並指定 Cloud Run 服務的網址。
編輯工作流程的來源檔案,並將其替換為下列內容:
- randomgen_function: call: http.get args: url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen result: randomgen_result - multiply_function: call: http.post args: url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply body: input: ${randomgen_result.body.random} result: multiply_result - log_function: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiply_result.body.multiplied) + ")"} result: log_result - floor_function: call: http.post args: url: CLOUD_RUN_SERVICE_URL auth: type: OIDC body: input: ${log_result.body} result: floor_result - create_output_map: assign: - outputMap: randomResult: ${randomgen_result} multiplyResult: ${multiply_result} logResult: ${log_result} floorResult: ${floor_result} - return_output: return: ${outputMap}
將
CLOUD_RUN_SERVICE_URL
替換為 Cloud Run 服務網址。這會連結工作流程中的 Cloud Run 服務。請注意,
auth
金鑰可確保驗證符記會傳遞至 Cloud Run 服務的呼叫。詳情請參閱「從工作流程提出經過驗證的要求」。部署修改後的工作流程:
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml
執行最終工作流程:
gcloud workflows run WORKFLOW_NAME
輸出應會如下所示:
result: '{"Floor":{"body":"4","code":200 ... "Log":{"body":"4.02535169073515","code":200 ... "Multiply":{"body":{"multiplied":56},"code":200 ... "Random":{"body":{"random":28},"code":200 ... startTime: '2023-11-13T21:22:56.782669001Z' state: SUCCEEDED
恭喜!您已部署並執行工作流程,將一系列服務連結在一起。
如要使用運算式、條件式跳轉、Base64 編碼或解碼、子工作流程等功能建立更複雜的工作流程,請參閱工作流程語法參考資料和標準程式庫總覽。