プログラムで 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 を使用するか、Cloud Tasks API に直接リクエストを送信して、App Engine タスクを作成することもできます。詳細については、 タスクを作成するをご覧ください。

App Engine ファイアウォール ルール

App Engine スタンダード環境では、App Engine ファイアウォールを使用して、特定の内部トラフィックがファイアウォールをバイパスするように設定できます。つまり、default ルールを deny に設定した場合、App Engine スタンダード環境向けの特定のサービスからのリクエストはブロックされなくなります。これらは、アプリ独自の構成でリクエストされるか、同じアプリから送信される、すべてのタイプのトラフィックです。このようにファイアウォール ルールをバイパスするリクエストには、Cloud Tasks の App Engine タスク(App Engine タスクキューを含む)も含まれます。

受信リクエストを許可する Cloud Tasks の App Engine タスク(App Engine タスクキューを含む)の IP 範囲は、次のとおりです。

  • 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 := fmt.Sprintf("projects/%s/locations/%s/queues/%s",