本教學課程將說明如何使用工作流程連結一系列服務。您可以使用 Cloud Run 函式、外部 REST API 和私人 Cloud Run 服務,連結兩個公開 HTTP 服務,藉此建立彈性的無伺服器應用程式。
目標
在本教學課程中,您將使用 Google Cloud CLI 建立單一工作流程,一次連結一個服務:
- 部署兩個 Cloud Run 函式:第一個函式會產生隨機數,然後將該數字傳遞至第二個函式,並將其相乘。
- 使用工作流程將兩個 HTTP 函式連結在一起。 執行工作流程並傳回結果,然後將結果傳遞至外部 API。
- 使用 Workflows 連結外部 HTTP API,以便針對指定數字傳回
log
。執行工作流程並傳回結果,然後將結果傳遞至 Cloud Run 服務。 - 部署只允許經過驗證的存取權的 Cloud Run 服務。服務會傳回指定數字的
math.floor
。 - 使用工作流程,連結 Cloud Run 服務、執行整個工作流程,並傳回最終結果。
下圖顯示程序總覽,以及最終工作流程的視覺化效果:
費用
在本文件中,您會使用 Google Cloud的下列計費元件:
您可以使用 Pricing Calculator 根據預測用量產生預估費用。
事前準備
貴機構定義的安全性限制,可能會導致您無法完成下列步驟。如需疑難排解資訊,請參閱「在受限的 Google Cloud 環境中開發應用程式」。
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
- 更新 Google Cloud CLI 元件:
gcloud components update
- 如果您在 Cloud Shell 中執行指令,系統就會使用 gcloud CLI 驗證您的身分;如果不是,請使用您的帳戶登入:
gcloud auth login
- 設定本教學課程中使用的預設位置:
gcloud config set project PROJECT_ID export REGION=REGION gcloud config set functions/region ${REGION} gcloud config set run/region ${REGION} gcloud config set workflows/location ${REGION}
將
REGION
替換為您選擇的支援 Workflows 位置。 -
如果您是專案建立者,系統會授予您基本擁有者角色 (
roles/owner
)。根據預設,這個身分與存取權管理 (IAM) 角色會包含完整存取大多數 Google Cloud資源所需的權限,因此您可以略過這個步驟。如果您不是專案建立者,則必須將必要權限授予專案中的適當實體。舉例來說,主體可以是 Google 帳戶 (適用於使用者),也可以是服務帳戶 (適用於應用程式和運算工作負載)。詳情請參閱活動目的地的角色和權限頁面。
所需權限
如要取得完成本教學課程所需的權限,請要求管理員為您授予專案的下列 IAM 角色:
-
Cloud Build 編輯器 (
roles/cloudbuild.builds.editor
) -
Cloud Functions 開發人員 (
roles/cloudfunctions.developer
) -
Cloud Run 管理員 (
roles/run.admin
) -
建立服務帳戶 (
roles/iam.serviceAccountCreator
) -
專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin
) -
服務帳戶使用者 (
roles/iam.serviceAccountUser
) -
服務用量消費者 (
roles/serviceusage.serviceUsageConsumer
) -
儲存空間管理員 (
roles/storage.admin
) -
Workflows 編輯器 (
roles/workflows.editor
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
-
Cloud Build 編輯器 (
- 部署工作流程時,您會將工作流程與指定的服務帳戶建立關聯。建立工作流程可使用的服務帳戶:
export SERVICE_ACCOUNT=workflows-sa gcloud iam service-accounts create ${SERVICE_ACCOUNT}
- 根據預設,所有 Cloud Run 服務都會以私人方式部署,且只有專案擁有者、專案編輯者、Cloud Run 管理員和 Cloud Run 叫用者可以呼叫。如要允許服務帳戶呼叫已驗證的 Cloud Run 服務,請將
run.invoker
角色授予 Workflows 服務帳戶:gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/run.invoker"
部署第一個 Cloud Run 函式
收到 HTTP 要求後,這個 HTTP 函式會產生 1 到 100 之間的隨機數字,然後以 JSON 格式傳回該數字。
建立名為
randomgen
的目錄,然後切換至該目錄:mkdir ~/randomgen cd ~/randomgen
建立名為
main.py
的文字檔案,其中包含下列 Python 程式碼:如要支援 HTTP 處理作業的 Flask 依附元件,請為 pip 套件管理工具建立文字檔。請為檔案命名為
requirements.txt
,然後新增以下內容:使用 HTTP 觸發條件部署函式,並允許未經驗證的存取權:
gcloud functions deploy randomgen-function \ --gen2 \ --runtime python310 \ --entry-point=randomgen \ --trigger-http \ --allow-unauthenticated
函式部署作業可能需要幾分鐘的時間才能完成。或者,您也可以在 Google Cloud 控制台使用 Cloud Run 函式介面來部署函式。
部署
randomgen
函式後,您可以確認httpsTrigger.url
屬性:gcloud functions describe randomgen-function \ --gen2 \ --format="value(serviceConfig.uri)"
儲存網址。您必須在後續練習中將其新增至工作流程來源檔案。
您可以使用下列 curl 指令試用這個函式:
curl $(gcloud functions describe randomgen-function \ --gen2 \ --format="value(serviceConfig.uri)")
系統會隨機產生並傳回數字。
部署第二個 Cloud Run 函式
收到 HTTP 要求後,這個 HTTP 函式會從 JSON 主體中擷取 input
,並將其乘以 2,然後以 JSON 格式傳回結果。
返回主目錄:
cd ~
建立名為
multiply
的目錄,然後切換至該目錄:mkdir ~/multiply cd ~/multiply
建立名為
main.py
的文字檔案,其中包含下列 Python 程式碼:如要支援 HTTP 處理作業的 Flask 依附元件,請為 pip 套件管理工具建立文字檔。請為檔案命名為
requirements.txt
,然後新增以下內容:使用 HTTP 觸發條件部署函式,並允許未經驗證的存取權:
gcloud functions deploy multiply-function \ --gen2 \ --runtime python310 \ --entry-point=multiply \ --trigger-http \ --allow-unauthenticated
函式部署作業可能需要幾分鐘的時間才能完成。或者,您也可以在 Google Cloud 控制台使用 Cloud Run 函式介面來部署函式。
部署
multiply
函式後,您可以確認httpsTrigger.url
屬性:gcloud functions describe multiply-function \ --gen2\ --format="value(serviceConfig.uri)"
儲存網址。您必須在後續練習中將其新增至工作流程來源檔案。
您可以使用下列 curl 指令試用這個函式:
curl -X POST MULTIPLY_FUNCTION_URL \ -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ -H "Content-Type: application/json" \ -d '{"input": 5}'
系統應傳回 10。
在工作流程中連結兩個 Cloud Run 函式
工作流程由一系列步驟組成,這些步驟可使用 Workflows 語法描述,並以 YAML 或 JSON 格式編寫。這是工作流程的定義。如需詳細說明,請參閱「語法參考資料」頁面。
返回主目錄:
cd ~
建立名為
workflow.yaml
的文字檔案,並在其中加入下列內容:- randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL body: input: ${randomgen_result.body.random} result: multiply_result - return_result: return: ${multiply_result}
- 將
RANDOMGEN_FUNCTION_URL
替換為randomgen
函式的網址。 - 將
MULTIPLY_FUNCTION_URL
替換為multiply
函式的網址。
這個來源檔案會將兩個 HTTP 函式連結在一起,並傳回最終結果。
- 將
建立工作流程後,您可以部署工作流程,讓系統準備執行。
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com
將
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)'
。
請注意,由於您已部署工作流程,因此也可以透過 控制台的「Workflows」頁面編輯工作流程。 Google Cloud
編輯工作流程的來源檔案,並將其替換為以下內容:
- randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL 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}
- 將
RANDOMGEN_FUNCTION_URL
替換為randomgen
函式的網址。 - 將
MULTIPLY_FUNCTION_URL
替換為multiply
函式的網址。
這會將外部 REST 服務連結至 Cloud Run 函式,並傳回最終結果。
- 將
部署修改後的工作流程:
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com
部署 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 \ --no-allow-unauthenticated
當您看到服務網址時,表示部署作業已完成。更新工作流程定義時,您需要指定該網址。
在工作流程中連結 Cloud Run 服務
更新現有的工作流程,並指定 Cloud Run 服務的網址。
返回主目錄:
cd ~
編輯工作流程的來源檔案,並將其替換為以下內容:
- randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL 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}
- 將
RANDOMGEN_FUNCTION_URL
替換為randomgen
函式的網址。 - 將
MULTIPLY_FUNCTION_URL
替換為multiply
函式的網址。 - 將
CLOUD_RUN_SERVICE_URL
替換為 Cloud Run 服務網址。
這會連結工作流程中的 Cloud Run 服務。請注意,
auth
鍵可確保在呼叫 Cloud Run 服務時傳遞驗證權杖。詳情請參閱「透過工作流程提出經過驗證的要求」。- 將
部署修改後的工作流程:
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com
執行最終工作流程:
gcloud workflows run WORKFLOW_NAME
輸出應會如下所示:
result: '{"floorResult":{"body":"4","code":200 ... "logResult":{"body":"4.02535169073515","code":200 ... "multiplyResult":{"body":{"multiplied":56},"code":200 ... "randomResult":{"body":{"random":28},"code":200 ... startTime: '2023-11-13T21:22:56.782669001Z' state: SUCCEEDED
恭喜!您已部署並執行連結一系列服務的工作流程。
如要使用運算式、條件跳躍、Base64 編碼或解碼、子工作流程等建立更複雜的工作流程,請參閱工作流程語法參考資料和標準程式庫總覽。
清除所用資源
如果您是為了這個教學課程建立新專案,請刪除專案。如果您使用現有的專案,且想保留該專案而不採用本教學課程中新增的變更,請刪除為教學課程建立的資源。
刪除專案
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。
如要刪除專案:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
刪除教學課程資源
從 Artifact Registry 刪除容器映像檔。
移除您在教學課程設定期間新增的 Google Cloud CLI 預設設定:
gcloud config unset functions/region gcloud config unset run/region gcloud config unset workflows/location gcloud config unset project