您可以使用 Workflows 執行 Cloud Run 工作,以便在工作流程中進行更複雜的資料處理作業,或以系統化的方式自動調度管理現有工作。
本教學課程說明如何使用 Workflows 執行 Cloud Run 工作,處理儲存在 Cloud Storage bucket 中的事件資料。將事件酬載儲存在 Cloud Storage 值區中,可讓您使用客戶管理的加密金鑰加密資料,但如果將事件資料做為環境變數傳遞至 Cloud Run 作業,則無法加密資料。
下圖提供概要總覽:
建立 Cloud Run 工作
本教學課程使用 GitHub 上的範例程式碼。部署指令碼會建構容器映像檔,以建立 Cloud Run 工作。這個指令碼也會建立 Cloud Storage bucket。Cloud Run 工作會讀取儲存在 Cloud Storage bucket 中的任何事件資料,然後列印事件資料。
如果您在 Cloud Shell 中執行部署指令碼,且Compute Engine 預設服務帳戶沒有編輯者角色,請將下列專案角色授予 Compute Engine 預設服務帳戶。(否則,您可以略過這個步驟,並在下一個步驟中繼續複製範例應用程式存放區)。
授予Artifact Registry 寫入者角色 (
roles/artifactregistry.writer
):gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@ \ --role=roles/artifactregistry.writer
將
PROJECT_NUMBER
替換為專案編號。 Google Cloud您可以在 Google Cloud 控制台的「歡迎」頁面中找到專案編號,也可以執行下列指令:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
授予 Storage 物件使用者角色 (
roles/storage.objectUser
):gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@ \ --role=roles/storage.objectUser
授予記錄記錄寫入者角色 (
roles/logging.logWriter
):gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@ \ --role=roles/logging.logWriter
將範例應用程式存放區複製到本機電腦,即可取得程式碼範例:
git clone https://github.com/GoogleCloudPlatform/workflows-demos.git
或者,您也可以下載 ZIP 格式的範例檔案,
變更為包含範例程式碼的目錄:
cd workflows-demos/cloud-run-jobs-payload-gcs/message-payload-job
執行部署指令碼,建立 Cloud Run 工作:
./deploy-job.sh
這個指令碼會建立名為 message-payload-PROJECT_ID
的 Cloud Storage bucket,其中 PROJECT_ID
是 Google Cloud 專案的 ID。系統也會建立名為 message-payload-job
的 Cloud Run 工作。
部署執行 Cloud Run 工作的工作流程
定義及部署工作流程,執行您剛建立的 Cloud Run 工作。工作流程定義是由一系列步驟組成,這些步驟會使用 Workflows 語法描述。
這項工作流程會接收事件、將事件資料儲存至 Cloud Storage 值區,然後執行 Cloud Run 工作來處理事件資料。
控制台
前往 Google Cloud 控制台的「Workflows」頁面:
按一下「建立」。
輸入新工作流程的名稱,例如
message-payload-workflow
。選擇適當的區域,例如
us-central1
。在「Service account」(服務帳戶) 欄位中,選取您先前建立的服務帳戶。
服務帳戶是工作流程的身分。您應該已將下列角色授予服務帳戶:
- Cloud Run 管理員:執行 Cloud Run 工作
- 記錄寫入者:寫入記錄項目
- Storage 物件建立者:在 Cloud Storage 中建立物件
點選「下一步」。
在工作流程編輯器中,輸入下列工作流程定義:
按一下 [Deploy] (部署)。
gcloud
為工作流程建立原始碼檔案:
touch message-payload-workflow.yaml
將下列工作流程定義複製到
message-payload-workflow.yaml
:輸入下列指令來部署工作流程:
gcloud workflows deploy message-payload-workflow \ --location=us-central1 \ --source=message-payload-workflow.yaml \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.
更改下列內容:
SERVICE_ACCOUNT_NAME
:您先前建立的服務帳戶名稱PROJECT_ID
:您的Google Cloud 專案 ID
服務帳戶是工作流程的身分。您應該已將下列角色授予服務帳戶:
roles/logging.logWriter
:用於寫入記錄項目roles/run.admin
:執行 Cloud Run 工作roles/storage.objectCreator
:在 Cloud Storage 中建立物件
工作流程會執行下列作業:
init
步驟:接受事件做為引數,並設定必要變數。log_event
步驟:使用函式 sys.log 在 Cloud Logging 中建立記錄項目。write_payload_to_gcs
步驟:發出 HTTPPOST
要求,並將事件酬載資料寫入 Cloud Storage bucket 檔案。run_job_to_process_payload
步驟:使用 Cloud Run Admin API 連接器方法googleapis.run.v1.namespaces.jobs.run
執行作業。Cloud Storage bucket 和資料檔案名稱會從工作流程以覆寫變數的形式傳遞至工作。finish
步驟:傳回工作執行資訊,做為工作流程的結果。
建立 Pub/Sub 主題
建立 Pub/Sub 主題,以便將訊息發布至該主題。本範例使用 Pub/Sub 事件,說明如何使用 Workflows 轉送事件,並將事件儲存至 Cloud Storage,以便 Cloud Run 工作處理事件資料。
控制台
前往 Google Cloud 控制台的「主題」頁面。
按一下
「建立主題」。在「Topic ID」(主題 ID) 欄位中,輸入主題的 ID,例如
message-payload-topic
。保留「新增預設訂閱項目」選項。
請勿選取其他選項。
點選「建立」。
gcloud
如要使用 ID message-payload-topic
建立主題,請執行 gcloud pubsub topics create
指令:
gcloud pubsub topics create message-payload-topic
建立 Eventarc 觸發條件,將事件轉送至工作流程
如要自動執行工作流程,進而執行 Cloud Run 工作,請建立 Eventarc 觸發條件,回應 Pub/Sub 事件,並將事件傳送至工作流程。每當訊息寫入 Pub/Sub 主題,事件就會觸發工作流程的執行作業。
控制台
前往 Google Cloud 控制台的「Workflows」頁面:
按一下工作流程名稱,例如
message-payload-workflow
。在「工作流程詳細資料」頁面中,按一下「編輯」。
在「Edit workflow」(編輯工作流程) 頁面的「Triggers」(觸發條件) 區段中,按一下「Add new trigger」(新增觸發條件) >「Eventarc」。
「Eventarc trigger」(Eventarc 觸發條件) 窗格隨即開啟。
在「觸發條件名稱」欄位中,輸入觸發條件的名稱,例如
message-payload-trigger
。在「Event provider」(事件提供者) 清單中,選取「Cloud Pub/Sub」。
在「Event」(事件) 清單中,選取「google.cloud.pubsub.topic.v1.messagePublished」。
從「Select a Cloud Pub/Sub topic」(選取 Cloud Pub/Sub 主題) 清單中,選取您先前建立的 Pub/Sub 主題。
在「Service account」(服務帳戶) 欄位中,選取您先前建立的服務帳戶。
服務帳戶會做為觸發程序的 ID。您應該已將下列角色授予服務帳戶:
- Eventarc 事件接收者:接收事件
- 工作流程叫用者:執行工作流程
按一下「儲存觸發條件」。
現在「編輯工作流程」頁面的「觸發條件」部分會顯示 Eventarc 觸發條件。
點選「下一步」。
按一下 [Deploy] (部署)。
gcloud
執行下列指令,建立 Eventarc 觸發條件:
gcloud eventarc triggers create message-payload-trigger \ --location=us-central1 \ --destination-workflow=message-payload-workflow \ --destination-workflow-location=us-central1 \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=projects/PROJECT_ID/topics/message-payload-topic \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.
更改下列內容:
PROJECT_ID
:您的 Google Cloud 專案 IDSERVICE_ACCOUNT_NAME
:先前建立的服務帳戶名稱。
服務帳戶會做為觸發程序的 ID。您應該已將下列角色授予服務帳戶:
roles/eventarc.eventReceiver
:接收事件roles/workflows.invoker
:執行工作流程
觸發工作流程
將訊息發布至 Pub/Sub 主題並產生事件,測試端對端系統。詳情請參閱使用事件或 Pub/Sub 訊息觸發工作流程。
將訊息發布至 Pub/Sub 主題,產生事件:
gcloud pubsub topics publish message-payload-topic --message="Hello World"
系統會將事件傳送至工作流程,該工作流程會記錄事件訊息、將事件資料儲存至 Cloud Storage bucket,並執行 Cloud Run 工作來處理儲存在 Cloud Storage 中的資料。這可能需要一分鐘的時間。
查看工作執行作業,確認 Cloud Run 工作是否如預期執行:
gcloud run jobs executions list --job=message-payload-job
輸出內容中應會顯示新的工作執行作業。
如要查看觸發工作流程所建立的事件相關記錄項目,請執行下列指令:
gcloud logging read "resource.type=cloud_run_job AND textPayload:Payload"
尋找類似下列內容的記錄項目:
textPayload: "Payload: {'message': {'data': 'SGVsbG8gV29ybGQ=', 'messageId': '8834108235224238',\ \ 'publishTime': '2023-09-20T17:07:52.921Z'}, 'subscription': 'projects/MY_PROJECT/subscriptions/eventarc-us-central1-message-payload-trigger-sub-741'}" ... resource: labels: job_name: message-payload-job location: us-central1 project_id: MY_PROJECT type: cloud_run_job textPayload: Processing message payload gs://message-payload-MY_PROJECT/8254002311197919.data.json
您可以查看 Cloud Storage bucket 物件中的事件資料,確認結果是否符合預期。
擷取 bucket 名稱:
gcloud storage ls
輸出結果會與下列內容相似:
gs://message-payload-PROJECT_ID/
列出值區中的物件:
gcloud storage ls gs://message-payload-PROJECT_ID/** --recursive
畫面會顯示如下的輸出內容:
gs://message-payload-PROJECT_ID/OBJECT_ID.data.json
記下
OBJECT_ID
,以便在下一個步驟中使用。將 bucket 中的物件下載為檔案:
gcloud storage cp gs://message-payload-PROJECT_ID/OBJECT_ID.data.json message-event.txt
將
OBJECT_ID
替換為上一個步驟中傳回的 ID。在文字編輯器中開啟
message-event.txt
檔案,寫入檔案的事件主體應類似下列內容:{ "message": { "data": "SGVsbG8gV29ybGQ=", "messageId": "8254002311197919", "publishTime": "2023-09-20T16:54:29.312Z" }, "subscription": "projects/MY_PROJECT/subscriptions/eventarc-us-central1-message-payload-trigger-sub-741" }
請注意,如果從 Base64 格式解碼
SGVsbG8gV29ybGQ=
的資料值,系統會傳回「Hello World」。