透過 Cloud Storage 的直接事件觸發 Workflows (gcloud CLI)
本快速入門導覽課程說明如何使用 Eventarc 觸發條件執行工作流程,並接收來自 Cloud Storage 的事件。
觸發條件會監聽 Cloud Storage bucket 中的物件建立事件,並將事件以執行階段引數的形式傳遞至目的地工作流程,藉此執行工作流程。
在本快速入門導覽課程中,您將:
建立 Cloud Storage bucket 做為事件來源。
使用 Workflows 建立及部署工作流程,以擷取及傳回儲存空間 bucket 的名稱和上傳檔案的名稱。
建立 Eventarc 觸發條件,將 Cloud Storage bucket 連結至 Workflows 事件接收器。
將文字檔案上傳至 Cloud Storage 值區,以便產生事件。這個事件會以執行階段引數的形式傳遞至目的地工作流程。
在工作流程執行後,查看相應 bucket 和文字檔案的名稱。
如要直接在 Google Cloud 控制台按照逐步指南操作,請按一下「Guide me」(逐步引導):
事前準備
貴機構定義的安全性限制,可能會導致您無法完成下列步驟。如需疑難排解資訊,請參閱「在受限的 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.
啟用 Compute Engine、Eventarc、Pub/Sub 和 Workflows API。
gcloud services enable \ compute.googleapis.com \ eventarc.googleapis.com \ pubsub.googleapis.com \ workflows.googleapis.com \ workflowexecutions.googleapis.com
- 更新
gcloud
元件:gcloud components update
- 登入帳戶:
gcloud auth login
設定環境變數
設定本快速入門導覽課程中使用的環境變數。
export PROJECT_ID=PROJECT_ID
export WORKFLOW_LOCATION=us-central1
export TRIGGER_LOCATION=us-central1
gcloud config set project ${PROJECT_ID}
gcloud config set workflows/location ${WORKFLOW_LOCATION}
gcloud config set eventarc/location ${TRIGGER_LOCATION}
您可以在 Google Cloud 控制台的「歡迎」頁面找到專案 ID。
設定服務帳戶
將必要權限授予本快速入門導覽中使用的服務帳戶。
-
如果您是專案建立者,系統會授予基本「擁有者」角色 (
roles/owner
)。根據預設,這個身分與存取權管理 (IAM) 角色包含完全存取大多數 Google Cloud資源所需的權限,因此您可以略過這個步驟。如果您不是專案建立者,必須在專案中將必要權限授予適當的主體。舉例來說,主體可以是 Google 帳戶 (適用於使用者) 或服務帳戶 (適用於應用程式和運算工作負載)。詳情請參閱活動目的地的「角色和權限」頁面。
所需權限
如要取得完成本快速入門所需的權限,請要求管理員為您授予專案的下列 IAM 角色:
-
Eventarc 管理員 (
roles/eventarc.admin
) -
記錄檔檢視存取者 (
roles/logging.viewAccessor
) -
專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin
) -
服務帳戶管理員 (
roles/iam.serviceAccountAdmin
) -
服務帳戶使用者 (
roles/iam.serviceAccountUser
) -
服務使用情形管理員 (
roles/serviceusage.serviceUsageAdmin
) -
儲存空間管理員 (
roles/storage.admin
) -
工作流程管理員 (
roles/workflows.admin
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
-
Eventarc 管理員 (
記下 Compute Engine 預設服務帳戶,因為您會將其附加至 Eventarc 觸發程序,代表觸發程序的身分,以利進行測試。啟用或使用採用 Compute Engine 的服務後,系統會自動建立這個服務帳戶,電子郵件地址格式如下: Google Cloud
PROJECT_NUMBER-compute@developer.gserviceaccount.com
將
PROJECT_NUMBER
替換為專案編號。 Google Cloud您可以在 Google Cloud 控制台的「歡迎」頁面找到專案編號,也可以執行下列指令:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
- 將專案的 Eventarc 事件接收者角色 (
roles/eventarc.eventReceiver
) 授予 Compute Engine 預設服務帳戶,讓 Eventarc 觸發條件可以接收事件供應商的事件。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/eventarc.eventReceiver
- 將專案的工作流程叫用者角色 (
roles/workflows.invoker
) 授予 Compute Engine 預設服務帳戶,讓該帳戶有權觸發工作流程執行作業。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/workflows.invoker
- 將專案的記錄檔寫入者角色 (
roles/logging.logWriter
) 授予 Compute Engine 預設服務帳戶,讓工作流程可以將記錄傳送至 Cloud Logging。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/logging.logWriter
- 建立 Cloud Storage 直接事件的觸發條件前,請將 Pub/Sub 發布者角色 (
roles/pubsub.publisher
) 授予 Cloud Storage 服務代理:SERVICE_ACCOUNT="$(gcloud storage service-agent --project=PROJECT_ID)" gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role='roles/pubsub.publisher'
- 如果您是在 2021 年 4 月 8 日當天或之前啟用 Cloud Pub/Sub 服務代理,請將服務帳戶權杖建立者角色 (
roles/iam.serviceAccountTokenCreator
) 授予服務代理,以支援已驗證的 Pub/Sub 推送要求。否則,系統會預設授予這個角色:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
建立 Cloud Storage 值區
建立要用做事件來源的 Cloud Storage bucket:
gcloud storage buckets create gs://${PROJECT_ID}-bucket --location=us-central1
建立及部署工作流程
建立及部署工作流程,當 Cloud Storage bucket 中建立的物件透過 HTTP 要求觸發工作流程時,系統就會執行該工作流程。
在主目錄中,建立名為
myEventWorkflow.yaml
或myEventWorkflow.json
的新檔案。複製以下內容並貼到新檔案中,然後儲存檔案:
YAML
main: params: [event] steps: - log_event: call: sys.log args: text: ${event} severity: INFO - extract_bucket_object: assign: - bucket: ${event.data.bucket} - object: ${event.data.name} - return_bucket_object: return: bucket: ${bucket} object: ${object}
JSON
{ "main": { "params": [ "event" ], "steps": [ { "log_event": { "call": "sys.log", "args": { "text": "${event}", "severity": "INFO" } } }, { "extract_bucket_object": { "assign": [ { "bucket": "${event.data.bucket}" }, { "object": "${event.data.name}" } ] } }, { "return_bucket_object": { "return": { "bucket": "${bucket}", "object": "${object}" } } } ] } }
部署工作流程:
export MY_WORKFLOW=myEventWorkflow gcloud workflows deploy ${MY_WORKFLOW} --source=myEventWorkflow.yaml
如果您複製了範例工作流程的 JSON 版本,請將
.yaml
替換為.json
。
建立 Eventarc 觸發條件
Eventarc 觸發條件會將 Cloud Storage bucket 中的事件傳送至 Workflows 目的地。
建立用來篩選 Cloud Storage 事件的觸發條件:
gcloud eventarc triggers create storage-events-trigger \ --destination-workflow=${MY_WORKFLOW} \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=${PROJECT_ID}-bucket" \ --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com"
這項操作會建立名為
storage-events-trigger
的觸發條件。請注意,在 Google Cloud 專案中首次建立 Eventarc 觸發條件時,Eventarc 服務代理程式的佈建作業可能會延遲。這個問題通常可以透過再次建立觸發條件來解決。詳情請參閱「權限遭拒錯誤」。
如要確認
storage-events-trigger
是否已建立妥當,請執行:gcloud eventarc triggers describe storage-events-trigger --location=${TRIGGER_LOCATION}
畫面會顯示類似以下的輸出內容,列出建立時間和觸發位置:
createTime: '2021-10-14T15:15:43.872360951Z' [...] name: projects/PROJECT_ID/locations/us-central1/triggers/storage-events-trigger
產生及查看活動
如要產生事件,請將文字檔案上傳到 Cloud Storage:
echo "Hello World" > random.txt gcloud storage cp random.txt gs://${PROJECT_ID}-bucket/random.txt
上傳作業會產生事件,並以執行階段引數的形式傳遞至工作流程,該工作流程會傳回儲存空間 bucket 和上傳檔案的名稱。
如要確認是否已觸發工作流程執行作業,請列出最近五次的執行作業:
gcloud workflows executions list ${MY_WORKFLOW} --limit=5
畫面會顯示類似以下的輸出內容,針對每個工作流程執行作業列出 NAME 和相當於
SUCCEEDED
的 STATE:NAME: projects/606789101455/locations/us-central1/workflows/myFirstWorkflow/executions/8c02b8f1-8836-4a6d-99d9-fc321eb9668f STATE: SUCCEEDED START_TIME: 2021-10-13T03:38:03.019148617Z END_TIME: 2021-10-13T03:38:03.249705805Z NAME: projects/606789101455/locations/us-central1/workflows/myFirstWorkflow/executions/a6319d9d-36a6-4117-904e-3d1118bdc90a STATE: SUCCEEDED START_TIME: 2021-10-13T17:28:51.492864252Z END_TIME: 2021-10-13T17:28:52.227212414Z
請注意,在上述範例的
NAME
欄位中,a6319d9d-36a6-4117-904e-3d1118bdc90a
是工作流程執行作業的 ID。複製執行 ID,這會在下一個步驟中用到。如要查看執行狀態,請執行下列指令:
gcloud workflows executions describe WORKFLOW_EXECUTION_ID --workflow=${MY_WORKFLOW}
將
WORKFLOW_EXECUTION_ID
替換為與檔案上傳至值區的時間相符的工作流程執行作業 ID。輸出結果會與下列內容相似:
argument: [...] name: projects/218898424763/locations/us-central1/workflows/myEventWorkflow/executions/86d2567b-0f1e-49b3-8b10-cdac5d0f6239 result: '{"bucket":"PROJECT_ID-bucket","object":"random.txt"}' startTime: '2021-10-13T03:38:03.019148617Z' state: SUCCEEDED
確認 Cloud Storage 值區的更新時間
"timeCreated": "2021-10-13T03:38"
與工作流程執行的startTime
相符。
恭喜!您已成功產生 Cloud Storage 事件,該事件使用 Eventarc 觸發了 Workflows 事件接收器。
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本頁面所用資源的費用,請刪除含有這些資源的 Google Cloud 專案。
刪除您建立的工作流程:
gcloud workflows delete ${MY_WORKFLOW}
系統詢問您是否要繼續時,請輸入
y
。刪除儲存空間 bucket:
gcloud storage rm gs://${PROJECT_ID}-bucket/ --recursive
刪除在本教學課程中建立的觸發條件:
gcloud eventarc triggers delete storage-events-trigger
或者,您也可以刪除 Google Cloud 專案,以免產生費用。刪除專案後,系統就會停止對專案使用的所有資源收取費用。 Google Cloud
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID