以程式輔助方式建立 App Engine 工作

本文說明如何透過程式建立 App Engine 工作,並排入 Cloud Tasks 佇列

使用這個程序時,您可以明確指定應處理工作的服務和處理常式,並選擇將工作專屬資料傳送到處理常式。Cloud Tasks 服務會將工作要求轉送至處理常式,但這個工作站位於 App Engine 中。因此,所有以 App Engine 處理常式為目標的佇列都必須有 App Engine 應用程式。處理常式必須在 App Engine 應用程式執行的區域中執行。這個區域也會做為 Cloud Tasks 要求的 LOCATION_ID 參數。詳情請參閱「以 App Engine 為目標的 Cloud Tasks 佇列」。

您可以微調工作的設定,例如安排未來的執行時間,或限制工作失敗時的重試次數。如果您選擇為工作指定名稱,Cloud Tasks 就能使用該名稱確保工作重複資料刪除,但這項處理作業可能會增加延遲時間。

您也可以使用 Google Cloud CLI 建立 App Engine 工作,或直接向 Cloud Tasks API 傳送要求。詳情請參閱「建立工作」。

App Engine 防火牆規則

在 App Engine 標準環境中,App Engine 防火牆可允許特定內部流量略過防火牆。也就是說,如果您將 default 規則設為 deny,來自特定服務且傳送至 App Engine 標準環境的要求就不會遭到封鎖。這些都是應用程式本身設定中要求或從相同應用程式傳送的流量類型。以這種方式略過防火牆規則的要求也包括 Cloud Tasks 中的 App Engine 工作 (包括 App Engine 工作佇列)。

如要允許傳入要求,請使用下列 IP 範圍,讓 Cloud Tasks 中的 App Engine 工作 (包括 App Engine Task Queues) 傳送要求:

  • 傳送至 App Engine 標準環境的要求 IP 範圍:0.1.0.2/32 (如果設為拒絕,則會略過預設防火牆規則)

  • 傳送至 App Engine 彈性環境的要求 IP 範圍:0.1.0.2/32

使用用戶端程式庫建立工作

您以 HTTP 要求的形式建立工作,並可隨意建構。不過就如同下列範例所示,使用用戶端程式庫有助您管理與伺服器之間的低階通訊詳細資料,其中也包括 Google 驗證。如要將工作新增至佇列,請參閱「將工作新增至 Cloud Tasks 佇列」一文。

C#


using Google.Cloud.Tasks.V2;
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using System;

class CreateAppEngineTask
{
    public string CreateTask(
        // TODO<developer>: call this method by passing correct values for
        // the following parameters or change the parameters' default values.
        string projectId = "YOUR-PROJECT-ID",
        string location = "us-central1",
        string queue = "my-queue",
        string payload = "Hello World!",
        int inSeconds = 0)
    {
        CloudTasksClient client = CloudTasksClient.Create();
        QueueName parent = new QueueName(projectId, location, queue);

        var response = client.CreateTask(new CreateTaskRequest
        {
            Parent = parent.ToString(),
            Task = new Task
            {
                AppEngineHttpRequest = new AppEngineHttpRequest
                {
                    HttpMethod = HttpMethod.Post,
                    RelativeUri = "/log_payload",
                    Body = ByteString.CopyFromUtf8(payload)
                },
                ScheduleTime = Timestamp.FromDateTime(
                    DateTime.UtcNow.AddSeconds(inSeconds))
            }
        });

        Console.WriteLine($"Created Task {response.Name}");
        return response.Name;
    }
}

Go


// Command create_task constructs and adds a task to an App Engine Queue.
package main

import (
	"context"
	"fmt"

	cloudtasks "cloud.google.com/go/cloudtasks/apiv2"
	taskspb "cloud.google.com/go/cloudtasks/apiv2/cloudtaskspb"
)

// createTask creates a new task in your App Engine queue.
func createTask(projectID, locationID, queueID, message string) (*taskspb.Task, error) {
	// Create a new Cloud Tasks client instance.
	// See https://godoc.org/cloud.google.com/go/cloudtasks/apiv2
	ctx := context.Background()
	client, err := cloudtasks.NewClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("NewClient: %w", err)
	}
	defer client.Close()

	// Build the Task queue path.
	queuePath