Cloud Tasks 處理常式可以在任何具備外部 IP 位址的 HTTP 端點上執行,例如 GKE、Compute Engine,甚至是內部部署的網路伺服器。您的工作可以在上述任一服務中以可靠且可供設定的方式執行。
本頁面說明如何透過程式建立基本 HTTP 目標工作,並排入 Cloud Tasks 佇列。快速入門導覽課程說明如何使用 Google Cloud CLI 執行這項操作。
對於具有 HTTP 目標的工作 (相較於較不常見的明確 App Engine 目標),建立工作的方式有兩種:
CreateTask方法:您必須明確建立工作物件。如果佇列中的工作有不同的路徑設定,請使用這個方法。在這種情況下,您可以在工作層級指定路徑,但無法使用佇列層級路徑。這種做法會使用CreateTask方法。BufferTask方法:如果佇列設定為在服務前緩衝處理工作,請使用這個方法。佇列必須具備佇列層級的路由。 這種做法會使用BufferTask方法。
使用 CreateTask 方法建立工作
本節將說明如何建構工作物件來建立工作。使用 CreateTask 方法。
使用 CreateTask 方法建立工作時,您會明確建立及定義工作物件。您必須指定用於處理工作的服務和處理常式。
您也可以選擇將工作專屬資料傳送到處理常式。也可以微調工作的設定,例如安排未來的執行時間,或限制工作失敗時的重試次數 (請參閱「進階設定」)。
下列範例會呼叫 CreateTask 方法,使用 Cloud Tasks 用戶端程式庫建立工作。
C#
Go
Java
請注意 pom.xml 檔案:
Node.js
請注意 package.json 檔案:
PHP
請注意 composer.json 檔案:
Python
請注意 requirements.txt 檔案:
Ruby
使用 BufferTask 方法建立工作
本節將說明如何透過傳送 HTTP 要求建立工作。您使用的方法稱為 BufferTask。
限制
BufferTask 方法有下列限制:
用戶端程式庫:用戶端程式庫不支援
BufferTask方法。RPC API:RPC API 不支援
BufferTask方法。工作層級的路由:這個方法不支援工作層級的路由。由於以這種方式建立工作時,無法新增轉送資訊,因此您必須使用佇列層級轉送 (否則工作不會有轉送資訊)。如果佇列尚未使用佇列層級的路由,請參閱「為 HTTP 工作設定佇列層級的路由」。
呼叫 BufferTask 方法
以下範例說明如何將 HTTP POST 要求傳送至 Cloud Tasks API buffer 端點,藉此建立工作。
curl
下列程式碼片段範例說明如何使用 curl,透過 BufferTask 方法建立工作:
curl -X HTTP_METHOD\ "https://cloudtasks.googleapis.com/v2/projects/PROJECT_ID/locations/LOCATION/queues/QUEUE_ID/tasks:buffer" \
更改下列內容:
HTTP_METHOD:要求的 HTTP 方法,例如GET或POST。PROJECT_ID:您的 Google Cloud 專案 ID。 如要取得這項資訊,請在終端機中執行下列指令:gcloud config get-value project
LOCATION:佇列的位置。QUEUE_ID:佇列的 ID。
Python
設定服務帳戶以驗證 HTTP 目標處理常式
如果您有具備適當憑證的服務帳戶可存取處理常式,Cloud Tasks 即可呼叫需要驗證的 HTTP 目標處理常式。
只要授予適當角色,您就能使用目前的服務帳戶。這些操作說明涵蓋專為這項功能建立新服務帳戶的步驟。用於 Cloud Tasks 驗證的現有或新服務帳戶必須與 Cloud Tasks 佇列位於同一個專案。
前往 Google Cloud 控制台的「Service Accounts」(服務帳戶) 頁面。
如有必要,請選取適當的專案。
按一下 「建立服務帳戶」。
為服務帳戶命名。請記下控制台中產生的相關電子郵件地址。您會在後續步驟中搜尋這封電子郵件。 如要複製電子郵件地址,請按一下「複製到剪貼簿」 。 你也可以新增帳戶用途的說明。
按一下「建立並繼續」。
在「Select a role」(選取角色) 清單中,搜尋並選取「Cloud Tasks Enqueuer (Beta)」(Cloud Tasks 工作排入佇列者 (Beta 版))。這個角色可授予服務帳戶將工作新增至佇列的權限。
如果您使用 Google Cloud 處理常式,請按一下「+ Add another role」(新增其他角色),將與存取處理常式執行所在服務相關聯的角色授予服務帳戶。 Google Cloud中的每項服務都需要不同的角色。舉例來說,如要存取 Cloud Run 上的處理常式,請授予 Cloud Run Invoker 角色。
如要完成建立服務帳戶,請按一下「完成」。
如要允許 Cloud Tasks 使用您剛建立的服務帳戶建立驗證權杖,請將「服務帳戶使用者」(
roles/iam.serviceAccountUser) 角色授予您剛建立的服務帳戶,對象為 Cloud Tasks 主要服務代理程式。前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面。
在剛建立的服務帳戶列中選取核取方塊,然後按一下 「管理存取權」。
在「管理存取權」窗格中,按一下 「新增主體」。
在「新增主體」清單中,搜尋並選取 Cloud Tasks 服務代理程式,該代理程式的電子郵件地址格式為
service-PROJECT_NUMBER@gcp-sa-cloudtasks.iam.gserviceaccount.com。在「Select a role」(選取角色) 清單中,搜尋並選取「Service Account User」(服務帳戶使用者) 角色。
按一下 [儲存]。
使用具備驗證憑證的 HTTP 目標工作
如要在 Cloud Tasks 和需要驗證的 HTTP 目標處理常式之間進行驗證,Cloud Tasks 會建立標頭憑證。這個權杖是以Cloud Tasks Enqueuer服務帳戶中的憑證為依據,並以電子郵件地址識別。用於驗證的服務帳戶必須與 Cloud Tasks 佇列位於同一專案。佇列會透過 HTTPS 將要求連同標頭權杖傳送至處理常式。您可以使用ID 權杖或存取權杖。
一般來說,在 Google Cloud上執行的任何處理常式都應使用 ID 權杖,例如在 Cloud Run 函式或 Cloud Run 上。主要例外狀況是 *.googleapis.com 上託管的 Google API,這些 API 預期會使用存取權杖。
您可以在佇列層級或工作層級設定驗證。如要在佇列層級設定驗證,請參閱「限制單一佇列的存取權」。如果在佇列層級設定驗證,這項設定會覆寫工作層級的設定。如要在工作層級設定驗證,請在工作本身指定 ID (OIDC) 權杖或存取 (OAuth) 權杖。
CreateTask 方法
下列範例會使用 Cloud Tasks 用戶端程式庫的 CreateTask 方法建立工作,其中包含標頭權杖的建立。這些範例會使用 ID 權杖。如要使用存取權杖,請在建構要求時,將 OIDC 參數替換為適當的 OAuth 參數語言。
Go
Java
請注意 pom.xml 檔案:
Node.js
請注意 package.json 檔案:
Python
請注意 requirements.txt 檔案:
BufferTask 方法
下列範例使用應用程式預設憑證進行驗證,並使用 BufferTask 方法建立工作。
curl
curl -X HTTP_METHOD\ "https://cloudtasks.googleapis.com/v2/projects/PROJECT_ID/locations/LOCATION/queues/QUEUE_ID/tasks:buffer" \ -H "Authorization: Bearer ACCESS_TOKEN"
更改下列內容:
HTTP_METHOD:要求的 HTTP 方法,例如GET或POST。PROJECT_ID:您的 Google Cloud 專案 ID。 如要取得這項資訊,請在終端機中執行下列指令:gcloud config get-value project
LOCATION:佇列的位置。QUEUE_ID:佇列的 ID。ACCESS_TOKEN:您的存取權杖。如要取得這項資訊,請在終端機中執行下列指令:gcloud auth application-default login
gcloud auth application-default print-access-token
Python
在下列程式碼範例中,提供您的驗證權杖值。
自行提供 HTTP 目標工作處理常式
HTTP 目標工作處理常式與 App Engine 工作處理常式非常類似,除了:
- 逾時:針對所有 HTTP 目標工作處理常式,預設逾時為 10 分鐘,最多為 30 分鐘。
- 驗證邏輯:如要透過在目標服務中寫入自有的程式碼來驗證憑證,您應使用 ID 憑證。如要進一步瞭解相關必要內容,請參閱 OpenID Connect,尤其是驗證 ID 權杖一節。
標頭:HTTP 目標要求會設定佇列標頭,其中包含處理常式可使用的工作專屬資訊。這些標頭與App Engine 工作要求中設定的標頭類似,但並不相同。這些標頭僅提供資訊,請勿將這些 ID 做為身分來源。
如果外部使用者對您應用程式發出的要求中出現這些標頭,則系統會更換為內部標頭。但如果要求來自於已登入應用程式的系統管理員,則屬唯一例外情況,系統允許管理員設定標頭以進行測試。
HTTP 目標要求一律包含下列標頭:
標頭 說明 X-CloudTasks-QueueName佇列名稱。 X-CloudTasks-TaskName工作的「簡短」名稱;如果在建立工作時沒有指定名稱,則是由系統產生的唯一 ID 來代替。這是完整工作名稱中的 my-task-id值,也就是 task_name =projects/my-project-id/locations/my-location/queues/my-queue-id/tasks/my-task-id。X-CloudTasks-TaskRetryCount這個工作的已重試次數。若為第一次嘗試,此值為 0。這個數字會將工作因 5XX 錯誤代碼,所以從未達到執行階段而失敗的次數計算在內。X-CloudTasks-TaskExecutionCount工作收到處理常式回應的總次數。由於 Cloud Tasks 在收到成功回應後會刪除工作,所以先前的所有處理常式回應都是失敗。這個數字不包括因 5XX 錯誤碼而失敗的次數。 X-CloudTasks-TaskETA工作的排程時間,從 1970 年 1 月 1 日算起並以秒數表示。 此外,Cloud Tasks 發出的要求還可能包含下列標頭:
標頭 說明 X-CloudTasks-TaskPreviousResponse來自上次重試的 HTTP 回應碼。 X-CloudTasks-TaskRetryReason重試工作的原因。
手動新增 Cloud Tasks 服務代理人角色
您可以手動將 Cloud Tasks 服務代理人 (roles/cloudtasks.serviceAgent) 角色新增至 Cloud Tasks 服務帳戶,該帳戶是 Cloud Tasks 的主要服務代理人。
如果您是在 2019 年 3 月 19 日「之前」啟用 Cloud Tasks API,才需要執行此操作。
主控台
- 在控制台的「歡迎」 Google Cloud 頁面中,找出並複製專案的專案編號。 Google Cloud
前往 Google Cloud 控制台的「IAM」(身分與存取權管理) 頁面。
按一下「Grant access」(授予存取權)。「授予存取權」窗格隨即開啟。
在「新增主體」部分,新增格式如下的電子郵件地址:
service-PROJECT_NUMBER@gcp-sa-cloudtasks.iam.gserviceaccount.com
將
PROJECT_NUMBER替換為您的 Google Cloud 專案編號。在「指派角色」部分,搜尋並選取「Cloud Tasks Service Agent」。
按一下 [儲存]。
gcloud
找出專案編號:
gcloud projects describe PROJECT_ID --format='table(projectNumber)'
將 PROJECT_ID 替換為您的專案 ID。
複製編號。
使用您複製的專案編號,授予 Cloud Tasks 服務帳戶
Cloud Tasks Service Agent角色:gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudtasks.iam.gserviceaccount.com \ --role roles/cloudtasks.serviceAgent
更改下列內容:
PROJECT_ID:您的 Google Cloud 專案 ID。PROJECT_NUMBER:您的 Google Cloud專案編號。
其他設定
您可以設定多項工作屬性。如需完整清單,請參閱工作資源定義。舉例來說,您可以自訂下列屬性:
- 命名:如果您選擇指定工作名稱,Cloud Tasks 就能使用該名稱確保工作不會重複,但這項處理作業可能會增加延遲時間。
- 排程:你可以排定在未來時間執行工作。這項功能僅支援
CreateTask,不支援BufferTask。
您也可以設定佇列屬性,例如路由覆寫、速率限制和重試參數。這些設定會套用至佇列中的所有工作。 詳情請參閱「設定 Cloud Tasks 佇列」。
後續步驟
- 參閱 RPC API 參考資料,進一步瞭解 HTTP 目標工作。
- 參閱 REST API 參考資料,進一步瞭解 HTTP 目標工作。