工作流程可能需要等待外部程序。您可以使用 HTTP 回呼,等待其他服務向回呼端點發出要求,該要求會繼續執行工作流程。您也可以使用輪詢等待。
本教學課程將示範如何使用 HTTP 回呼和 Eventarc 觸發條件,等待事件或 Pub/Sub 訊息,而非輪詢。雖然您可以使用事件或 Pub/Sub 訊息觸發工作流程,但您可能想暫停執行作業,等待其他事件發生後再繼續。舉例來說,某個事件觸發工作流程來啟動程序,但工作流程需要等待另一個事件,表示程序已完成。如要實作這項功能,可以讓一個工作流程回呼另一個工作流程。
目標
在本教學課程中,會發生下列情況:
需要等待事件的主要工作流程已部署並執行。 由於必須等待事件發生,因此會將回呼詳細資料儲存在 Firestore 資料庫中,以便次要工作流程擷取詳細資料。主要工作流程接著會等待 HTTP 呼叫。
事件會觸發次要工作流程,並在事件產生時從 Firestore 資料庫擷取回呼詳細資料。接著,次要工作流程會回呼主要工作流程,主要工作流程則會繼續執行。
以下是整個程序的總覽:
主要工作流程:
callback-event-sample工作流程會為兩個事件來源建立回呼端點:Pub/Sub 主題和 Cloud Storage bucket。- 這個工作流程會將回呼端點儲存在 Firestore 文件中。
- 這個工作流程會暫停執行,並等待 HTTP 要求傳送至回呼端點。
事件:
- 發生事件:訊息發布至 Pub/Sub 主題,且檔案上傳至 Cloud Storage bucket。
次要工作流程:
- Eventarc 會將事件轉送至
callback-event-listener工作流程,並觸發執行。 - 這個工作流程會從 Firestore 文件擷取適當的回呼端點網址。
- 這個工作流程會將回呼傳送至範例工作流程中的適當端點。
主要工作流程:
callback-event-sample工作流程會在回呼端點接收事件,並繼續執行。- 這個工作流程會從 Firestore 文件中刪除回呼網址,並完成執行作業。
費用
在本文件中,您將使用下列 Google Cloud計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
事前準備
您可以在 Google Cloud 控制台中執行下列指令,也可以在終端機或 Cloud Shell 中使用 Google Cloud CLI 執行指令。
貴機構定義的安全性限制,可能會導致您無法完成下列步驟。如需疑難排解資訊,請參閱「在受限的 Google Cloud 環境中開發應用程式」。
控制台
在 Google Cloud 控制台的專案選擇器頁面中,選取或建立 Google Cloud 專案。
請確認您已為 Google Cloud 專案啟用計費功能。瞭解如何檢查專案是否已啟用計費功能。
啟用 App Engine、Eventarc、Firestore、Pub/Sub 和 Workflows API。
建立服務帳戶,供工作流程用於向其他 Google Cloud 服務驗證,並授予適當角色:
前往 Google Cloud 控制台的「Service Accounts」頁面。
如要前往「建立服務帳戶」頁面,請選取專案。
在「Service account name」(服務帳戶名稱) 欄位中輸入名稱。 Google Cloud 控制台會根據這個名稱,填入「Service account ID」(服務帳戶 ID) 欄位。
在「Service account description」(服務帳戶說明) 欄位中輸入說明。例如:
Service account for tutorial。點按「Create and continue」(建立並繼續)。
在「Select a role」(選取角色) 清單中,篩選下列角色,授予您在上一個步驟中建立的使用者管理服務帳戶:
- Cloud Datastore 使用者:存取 Datastore 模式的 Firestore (Datastore) 資料。
- Eventarc 事件接收者:接收事件提供者的事件。
- 記錄寫入者:可寫入記錄。
- Workflows 叫用者:執行工作流程及管理執行作業。
如要新增其他角色,請按一下 「Add another role」(新增其他角色),然後新增其他角色。
按一下「繼續」。
按一下「完成」,即可完成帳戶建立程序。
如要建立 Eventarc 觸發條件來轉送 Cloud Storage 的事件,請將 Pub/Sub 發布者角色授予 Cloud Storage 服務代理。通常是
service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com。您可以擷取 Cloud Storage 服務代理的電子郵件地址。前往 Google Cloud 控制台的「IAM」(身分與存取權管理) 頁面。
在 Cloud Storage 服務代理的資料列中,按一下 「編輯主體」。(如果未列出服務專員,請繼續下一個步驟)。「編輯權限」窗格隨即開啟。
- 按一下「add Add another role」(新增其他角色),然後搜尋「Pub/Sub Publisher」(Pub/Sub 發布者) 角色。
- 選取角色。
- 按一下 [儲存]。
如果服務代理人未列出,請按一下「授予存取權」。 「授予存取權」窗格隨即開啟。
- 在「New principals」(新增主體) 欄位中,輸入服務代理的電子郵件地址。
- 在「Select a role」(選取角色) 清單中,搜尋「Pub/Sub Publisher」(Pub/Sub 發布者) 角色。
- 選取角色。
- 按一下 [儲存]。
gcloud
在 Google Cloud 控制台啟用 Cloud Shell。
Google Cloud 控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已設定適用於您目前專案的值。工作階段可能要幾秒鐘的時間才能初始化。
請確認您已為 Google Cloud 專案啟用計費功能。 瞭解如何確認專案是否已啟用計費功能。
啟用 App Engine、Eventarc、 Firestore、Pub/Sub 和 Workflows API。
gcloud services enable \ appengine.googleapis.com \ eventarc.googleapis.com \ firestore.googleapis.com \ pubsub.googleapis.com \ workflows.googleapis.com
建立工作流程的服務帳戶,用於向其他 Google Cloud 服務進行驗證,並授予適當角色。
建立服務帳戶:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
將
SERVICE_ACCOUNT_NAME替換為服務帳戶名稱。將角色授予您在上一步建立的使用者自行管理服務帳戶。針對下列各個 IAM 角色,執行下列指令一次:
roles/datastore.user:存取 Datastore 模式的 Firestore (Datastore) 資料。roles/eventarc.eventReceiver:接收事件供應商的事件。roles/logging.logWriter:用來寫入記錄。roles/workflows.invoker:執行工作流程及管理執行作業。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role=ROLE
更改下列內容:
PROJECT_ID:您建立服務帳戶的專案 IDROLE:要授予的角色
如要建立 Eventarc 觸發條件來轉送 Cloud Storage 的事件,請將 Pub/Sub 發布者角色授予 Cloud Storage 服務代理。通常是
service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com。使用gcloud storage service-agent先擷取 Cloud Storage 服務代理。SERVICE_ACCOUNT_STORAGE="$(gcloud storage service-agent --project=PROJECT_ID)" gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$SERVICE_ACCOUNT_STORAGE \ --role=roles/pubsub.publisher
建立 Firestore 資料庫
Firestore 會將資料儲存在文件中,這些文件包含對應至值的欄位。這些文件會儲存在集合中,集合是文件的容器,可用來整理資料及建立查詢。進一步瞭解 Firestore。
請注意,每個 Google Cloud 專案只能有一個 Firestore 資料庫。如需建立新資料庫,請完成下列步驟。
控制台
前往 Google Cloud 控制台的 Firestore「Get started」(開始使用) 頁面。
按一下「選取原生模式」。
如需選取資料庫模式的指引,以及各項功能的比較,請參閱選擇原生模式和 Datastore 模式。
在「選取位置」清單中,選取「nam5 (美國)」。
這個位置適用於專案中的 Firestore 資料庫和 App Engine 應用程式。 Google Cloud 資料庫建立後即無法變更位置。
按一下 [Create database] (建立資料庫)。
gcloud
如要建立 Firestore 資料庫,您必須先建立 App Engine 應用程式,然後執行 gcloud firestore databases create 指令:
gcloud app create --region=us-central gcloud firestore databases create --region=us-central
您可以忽略 us-central is not a valid Firestore location 警告。
App Engine 和 Firestore 支援相同的位置,但 App Engine us-central (愛荷華州) 區域會對應至 Firestore nam5 (美國) 多區域。
建立 Pub/Sub 主題
本教學課程使用 Pub/Sub 做為事件來源。建立 Pub/Sub 主題,以便將訊息發布至該主題。進一步瞭解如何建立及管理主題。
控制台
前往 Google Cloud 控制台的 Pub/Sub「主題」頁面。
按一下「Create topic」(建立主題)。
在「Topic ID」(主題 ID) 欄位中輸入
topic-callback。接受其他預設值。
按一下「建立主題」。
gcloud
如要建立主題,請執行 gcloud pubsub topics create 指令:
gcloud pubsub topics create topic-callback
建立 Cloud Storage bucket
本教學課程使用 Cloud Storage 做為事件來源。建立 Cloud Storage bucket,以便將檔案上傳至該 bucket。進一步瞭解如何建立儲存空間 bucket。
控制台
在 Google Cloud 控制台,前往「Cloud Storage bucket」頁面。
按一下「 建立」。
在 bucket 的「Name」(名稱) 部分,輸入
PROJECT_ID-bucket-callback。專案 ID 用於
callback-event-sample工作流程,識別 bucket。按一下「繼續」。
在「Location type」(位置類型) 部分,選取「Region」(區域),然後選取「us-central1 (Iowa)」(us-central1 (愛荷華州))。
接受其他預設值。
點選「建立」。
gcloud
如要建立 bucket,請執行 gcloud storage buckets create 指令:
gcloud storage buckets create gs://PROJECT_ID-bucket-callback \ --location=us-central1
專案 ID 用於 callback-event-sample 工作流程,識別 bucket。
建立事件來源後,即可部署事件接收器工作流程。
部署監聽事件的工作流程
當訊息發布至 Pub/Sub 主題,或檔案上傳至 Cloud Storage bucket 時,系統會觸發 callback-event-listener 工作流程。工作流程會接收事件、從 Firestore 資料庫擷取適當的回呼詳細資料,然後將 HTTP 要求傳送至回呼端點。
控制台
前往 Google Cloud 控制台的「Workflows」頁面:
按一下「 建立」。
輸入新工作流程的名稱:
callback-event-listener。在「Region」(區域) 清單中選取「us-central1」。
選取先前建立的服務帳戶。
點選「下一步」。
在工作流程編輯器中,輸入下列工作流程定義:
點選「Deploy」(部署)。
gcloud
為工作流程建立原始碼檔案:
touch callback-event-listener.yaml在文字編輯器中,將下列工作流程複製到原始碼檔案:
輸入下列指令來部署工作流程:
gcloud workflows deploy callback-event-listener \ --source=callback-event-listener.yaml \ --location=us-central1 \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
將
SERVICE_ACCOUNT_NAME替換為您先前建立的服務帳戶名稱。
部署等待事件的工作流程
callback-event-sample 工作流程會將回呼詳細資料儲存在 Firestore 資料庫中,暫停執行,然後等待特定事件發生。
控制台
前往 Google Cloud 控制台的「Workflows」頁面:
按一下 「建立」。
輸入新工作流程的名稱:
callback-event-sample。在「Region」(區域) 清單中選取「us-central1」。
選取先前建立的服務帳戶。
點選「下一步」。
在工作流程編輯器中,輸入下列工作流程定義:
點選「Deploy」(部署)。
gcloud
為工作流程建立原始碼檔案:
touch callback-event-sample.yaml在文字編輯器中,將下列工作流程複製到原始碼檔案:
輸入下列指令來部署工作流程:
gcloud workflows deploy callback-event-sample \ --source=callback-event-sample.yaml \ --location=us-central1 \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
將
SERVICE_ACCOUNT_NAME替換為您先前建立的服務帳戶名稱。
建立 Eventarc 觸發條件以轉送 Pub/Sub 事件
您可以為 Eventarc 觸發條件指定篩選條件 (包括事件來源和目標工作流程),藉此轉送事件。建立 Eventarc 觸發條件,在訊息發布至 Pub/Sub 主題時執行 callback-event-listener 工作流程。進一步瞭解如何觸發工作流程。
控制台
在 Google Cloud 控制台中,前往「Eventarc」頁面。
按一下「建立觸發條件」。
輸入觸發條件名稱。
例如
trigger-pubsub-events-listener。在「Event provider」(事件提供者) 清單中,選取「Cloud Pub/Sub」。
在「Event」(事件) 清單中,選取「Custom」(自訂) 下方的「google.cloud.pubsub.topic.v1.messagePublished」。
在「選取 Cloud Pub/Sub 主題」清單中,選取您先前建立的主題。
在「Region」(區域) 清單中,選取「us-central1 (Iowa)」(us-central1 (愛荷華州))。
如果系統提示,請將
iam.serviceAccountTokenCreator角色授予 Pub/Sub 服務帳戶。選取您先前建立的「服務帳戶」。
在「Event destination」(事件目的地) 清單中,選取「Workflows」(工作流程)。
在「Select a workflow」(選取工作流程) 清單中,選取「callback-event-listener」工作流程。
點選「建立」。
gcloud
如要建立觸發條件,請執行 gcloud eventarc triggers create 指令:
gcloud eventarc triggers create trigger-pubsub-events-listener \ --location=us-central1 \ --destination-workflow=callback-event-listener \ --destination-workflow-location=us-central1 \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=topic-callback \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
系統會轉換事件,並以執行階段引數的形式傳遞至工作流程執行作業。 請注意,新的觸發條件最多可能需要 2 分鐘才會生效。
建立 Eventarc 觸發條件以轉送 Cloud Storage 事件
您可以為 Eventarc 觸發條件指定篩選條件 (包括事件來源和目標工作流程),藉此轉送事件。建立 Eventarc 觸發條件,在檔案上傳至 Cloud Storage bucket 時執行 callback-event-listener 工作流程。進一步瞭解如何觸發工作流程。
控制台
在 Google Cloud 控制台中,前往「Eventarc」頁面。
按一下「建立觸發條件」。
輸入觸發條件名稱。
例如
trigger-storage-events-listener。在「Event provider」(事件提供者) 清單中,選取「Cloud Storage」。
在「Event」(事件) 清單中,選取「Direct」(直接) 下方的「google.cloud.storage.object.v1.finalized」。
在「Bucket」(值區) 清單中,瀏覽並選取您先前建立的值區。
在「Region」(區域) 清單中,根據 Cloud Storage 值區,接受「us-central1 (Iowa)」(us-central1 (愛荷華州)) 的預設值。
如果系統提示,請將
iam.serviceAccountTokenCreator角色授予 Pub/Sub 服務帳戶。選取您先前建立的「服務帳戶」。
在「Event destination」(事件目的地) 清單中,選取「Workflows」(工作流程)。
在「Select a workflow」(選取工作流程) 清單中,選取「callback-event-listener」工作流程。
點選「建立」。
gcloud
如要建立觸發條件,請執行 gcloud eventarc triggers create 指令:
gcloud eventarc triggers create trigger-storage-events-listener \ --location=us-central1 \ --destination-workflow=callback-event-listener \ --destination-workflow-location=us-central1 \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=PROJECT_ID-bucket-callback" \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
事件會經過轉換,並以執行階段引數的形式傳遞至工作流程執行作業。請注意,新的觸發條件最多可能需要 2 分鐘才會生效。
執行主要工作流程
執行工作流程時,會執行與工作流程相關聯的目前工作流程定義。執行 callback-event-sample 工作流程。這是主要工作流程,會等待特定事件發生,只有在次要工作流程發出適當的回呼要求時,才會繼續執行。
控制台
前往 Google Cloud 控制台的「Workflows」頁面。
在「Workflows」頁面中,按一下「callback-event-sample」工作流程,前往詳細資料頁面。
在「Workflow Details」(工作流程詳細資料) 頁面中,按一下 play_arrow「Execute」(執行)。
再次點選「執行」。
工作流程執行作業會開始。執行作業時,您應該會看到執行狀態為
Running,以及類似以下的記錄項目:Started waiting 1hr for an event from source topic-callback。
gcloud
如要執行工作流程,請執行 gcloud workflows run 指令:
gcloud workflows run callback-event-sample \ --location=us-central1
工作流程執行作業會開始。執行期間,您應該會看到類似下列內容的執行狀態:
Waiting for execution [a848a164-268a-449c-b2fe-396f32f2ed66] to complete...working...
產生事件並檢查執行狀態
您可以產生事件、查看記錄項目及檢查工作流程執行狀態,確認結果是否符合預期。
發布訊息
將訊息發布至先前建立的 Pub/Sub 主題。
控制台
前往 Google Cloud 控制台的 Pub/Sub「主題」頁面。
按一下「topic-callback」。
按一下「Messages」(訊息) 分頁標籤。
按一下「Publish message」(發布訊息)。
在「郵件內文」欄位中輸入
Hello World。按一下「發布」。
gcloud
如要發布訊息,請使用 gcloud pubsub topics publish 指令:
gcloud pubsub topics publish topic-callback \ --message="Hello World"
上傳物件
將檔案上傳至先前建立的 Cloud Storage bucket。
控制台
- 前往 Google Cloud 控制台的「Cloud Storage bucket」頁面。
按一下您先前建立的值區名稱。
在「物件」分頁中,執行下列任一操作:
將所需檔案從桌面或檔案管理工具拖曳到 Google Cloud 控制台的主窗格。
按一下「Upload files」(上傳檔案),選取要上傳的檔案,然後按一下「Open」(開啟)。
gcloud
如要上傳檔案,請執行 gcloud storage cp 指令:
gcloud storage cp OBJECT_LOCATION gs://PROJECT_ID-bucket-callback/
將 OBJECT_LOCATION 替換為物件的本機路徑。例如:random.txt。
查看記錄項目和執行狀態
確認 callback-event-sample 工作流程已順利完成。
控制台
前往 Google Cloud 控制台的「Workflows」頁面。
在「Workflows」頁面中,按一下「callback-event-sample」工作流程,前往詳細資料頁面。
在「Workflow Details」(工作流程詳細資料) 頁面中,如要擷取特定執行的詳細資料,請按一下適當的執行 ID。
「執行狀態」應為「成功」,且在「輸出」窗格中,您應該會看到收到的 Pub/Sub 和 Cloud Storage 事件。
gcloud
篩選記錄項目,並以 JSON 格式傳回輸出內容:
gcloud logging read "resource.type=workflows.googleapis.com/Workflow AND textPayload:calling OR textPayload:waiting" \ --format=json
尋找類似下列內容的記錄項目:
"textPayload": "Stopped waiting for an event from source..." "textPayload": "Calling back url https://workflowexecutions.googleapis.com/v1/projects/..." "textPayload": "Started waiting 1hr for an event from source..."
查看上次嘗試執行的狀態:
gcloud workflows executions wait-last
結果應如下所示:
Using cached execution name: projects/1085953646031/locations/us-central1/workflows/callback-event-sample/executions/79929e4e-82c1-4da1-b068-f828034c01b7 Waiting for execution [79929e4e-82c1-4da1-b068-f828034c01b7] to complete...done. [...] state: SUCCEEDED
清除所用資源
如果您是為了這個教學課程建立新專案,請刪除專案。如果您使用現有專案,並想保留專案,但不要本教學課程新增的變更,請刪除為本教學課程建立的資源。
刪除專案
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。
刪除專案的方法如下:
- 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。
刪除在本教學課程中建立的資源
後續步驟
- 請參閱「使用回呼建立人工介入迴路工作流程」教學課程。