프로그래매틱 방식으로 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", projectID, locationID, queueID)

	// Build the Task payload.
	// https://godoc.org/google.golang.org/genproto/googleapis/cloud/tasks/v2#CreateTaskRequest
	req := &taskspb.CreateTaskRequest{
		Parent: queuePath,
		Task: &taskspb.Task{
			// https://godoc.org/google.golang.org/genproto/googleapis/cloud/tasks/v2#AppEngineHttpRequest
			MessageType: &taskspb.Task_AppEngineHttpRequest{
				AppEngineHttpRequest: &taskspb.AppEngineHttpRequest{
					HttpMethod:  taskspb.HttpMethod_POST,
					RelativeUri: "/task_handler",