工作流程可能需要等待外部程序。您可以使用 HTTP 回呼,等待其他服務向回呼端點發出要求,該要求會繼續執行工作流程。您也可以使用輪詢等待。
本教學課程會示範如何使用 HTTP 回呼和 Eventarc 觸發條件,等待事件或 Pub/Sub 訊息,而不使用輪詢。雖然可以使用事件或 Pub/Sub 訊息觸發工作流程,但您可能想暫停執行作業,等待其他事件發生後再繼續。舉例來說,某個事件會觸發工作流程來啟動程序,但工作流程必須等待另一個事件,才能得知程序是否完成。您可以讓一個工作流程回呼另一個工作流程,藉此實作這項功能。
目標
在本教學課程中,您將:
需要等待事件的主要工作流程已部署並執行。 由於必須等待事件發生,因此會將回呼詳細資料儲存在 Firestore 資料庫中,以便次要工作流程擷取詳細資料。主要工作流程接著會等待 HTTP 呼叫。
事件會觸發次要工作流程,並在產生事件時從 Firestore 資料庫擷取回呼詳細資料。次要工作流程接著會回呼主要工作流程,後者會繼續執行。
以下是整個程序的概要:
主要工作流程:
callback-event-sample
工作流程會為兩個事件來源建立回呼端點:Pub/Sub 主題和 Cloud Storage bucket。- 這個工作流程會將兩個回呼端點儲存在 Firestore 文件中。
- 這個工作流程會暫停執行,並等待 HTTP 要求送達回呼端點。
事件:
- 事件發生:訊息發布至 Pub/Sub 主題,且檔案上傳至 Cloud Storage 值區。
次要工作流程:
- Eventarc 會將事件轉送至
callback-event-listener
工作流程,並觸發執行作業。 - 這個工作流程會從 Firestore 文件擷取適當的回呼端點網址。
- 這個工作流程會在範例工作流程中,對適當的端點執行回呼。
主要工作流程:
callback-event-sample
工作流程會在回呼端點接收事件,並繼續執行。- 這個工作流程會從 Firestore 文件中刪除回呼 URL,並完成執行作業。
費用
在本文件中,您會使用 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 控制台會根據這個名稱填入「服務帳戶 ID」欄位。
在「服務帳戶說明」欄位中輸入說明。例如:
Service account for tutorial
。按一下「建立並繼續」。
在「Select a role」(選取角色) 清單中,篩選下列角色,並授予您在上一個步驟中建立的使用者管理服務帳戶:
- Cloud Datastore 使用者:存取 Datastore 模式 (Datastore) 的 Firestore 資料。
- Eventarc 事件接收者:接收來自事件提供者的事件。
- 記錄寫入者:寫入記錄。
- 工作流程叫用者:執行工作流程及管理執行項目。
如要新增其他角色,請按一下「新增其他角色」
,然後新增每個其他角色。按一下「繼續」。
按一下「完成」,即可完成帳戶建立程序。
如要建立 Eventarc 觸發條件來轉送 Cloud Storage 的事件,請將 Pub/Sub 發布者角色授予 Cloud Storage 服務代理。通常是
service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com
。您可以擷取 Cloud Storage 服務代理程式的電子郵件地址。前往 Google Cloud 控制台的「IAM」頁面。
在 Cloud Storage 服務代理的列中,按一下「編輯主體」
。(如果未列出服務代理程式,請繼續下一個步驟)。「編輯存取權」窗格隨即開啟。- 按一下「新增其他角色」add,然後搜尋「Pub/Sub 發布者」角色。
- 選取角色。
- 按一下 [儲存]。
如果服務代理人未列出,請按一下「授予存取權」
。「授予存取權」窗格隨即開啟。- 在「New principals」(新增主體) 欄位中,輸入服務代理人的電子郵件地址。
- 在「Select a role」(選取角色) 清單中,搜尋「Pub/Sub Publisher」(Pub/Sub 發布者) 角色。
- 選取角色。
- 按一下 [儲存]。
gcloud
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
請確認您已為 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「開始使用」頁面。
按一下「選取原生模式」。
如需選擇資料庫模式和逐項比較各項功能的說明,請參閱選擇原生模式和 Datastore 模式一文。
在「Select a location」(選取位置) 清單中,選取「nam5 (United States)」(nam5 (美國))。
位置會同時套用到您 Google Cloud 專案中的 Firestore 資料庫和 App Engine 應用程式。資料庫建立後,就無法變更位置。
按一下 [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「主題」頁面。
按一下
「建立主題」。在「Topic ID」(主題 ID) 欄位中輸入
topic-callback
。接受其他預設值。
按一下「建立主題」。
gcloud
如要建立主題,請執行
gcloud pubsub topics create
指令:
gcloud pubsub topics create topic-callback
建立 Cloud Storage 值區
本教學課程會使用 Cloud Storage 做為事件來源。建立 Cloud Storage bucket,以便將檔案上傳至該 bucket。進一步瞭解如何建立儲存空間值區。
主控台
在 Google Cloud 控制台,前往 Cloud Storage「Buckets」(值區) 頁面。
按一下「建立」
。在 bucket 的「Name」(名稱) 中輸入
PROJECT_ID-bucket-callback
。專案 ID 用於
callback-event-sample
工作流程,識別值區。按一下「繼續」。
在「位置類型」下方選取「區域」,然後選取「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
工作流程,識別值區。
建立事件來源後,即可部署事件接收器工作流程。
部署監聽事件的工作流程
當訊息發布至 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」。
在「Select a Cloud Pub/Sub topic」(選取 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」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」(訊息) 分頁標籤。
按一下「發布訊息」。
在「Message body」(訊息內文) 欄位中輸入
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 控制台的主要窗格。
按一下「上傳檔案」,選取要上傳的檔案,然後按一下「開啟」。
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
清除所用資源
如果您是為了這個教學課程建立新專案,請刪除專案。如果您使用現有專案,並想保留專案,但不要在本教學課程中新增的變更,請刪除為本教學課程建立的資源。
刪除專案
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。
如要刪除專案:
- 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.
刪除在本教學課程中建立的資源
後續步驟
- 請嘗試「使用回呼建立人機迴圈工作流程」教學課程。