Go 런타임

개요

Cloud Run 함수는 운영체제 버전과 부가기능 패키지, 언어 지원, 함수를 지원하고 호출하는 함수 프레임워크 라이브러리로 구성된 환경에서 실행됩니다. 이 환경은 언어 버전으로 식별되며, 런타임이라고 합니다.

일반적인 런타임과 각 Go 런타임이 사용하는 Ubuntu 버전에 대한 자세한 내용은 Cloud Run Functions 실행 환경을 참조하세요.

런타임 선택

Cloud Run Functions는 런타임 지원 페이지에 나열된 여러 버전의 Go를 지원합니다. 배포 중에 함수에 대해 선호하는 Go 런타임을 선택할 수 있습니다.

gcloud

Google Cloud CLI를 사용하는 경우 원하는 Go 런타임과 함께 --runtime 매개변수를 사용하여 런타임을 지정합니다. 예를 들면 다음과 같습니다.

gcloud functions deploy FUNCTION_NAME --no-gen2 --runtime go122 FLAGS...

FLAGS...는 함수를 처음 배포하는 동안 전달되는 인수를 나타냅니다. 필수 인수 및 선택적 인수에 대한 자세한 내용은 Cloud Run 함수 배포를 참조하세요.

콘솔

Google Cloud 콘솔을 사용하는 경우 자세한 안내는 Google Cloud 콘솔 빠른 시작을 참조하세요.

함수 준비

Google Cloud 콘솔에서 직접 함수를 준비하거나 로컬 머신에서 작성 후 업로드할 수 있습니다. Go 개발용 로컬 머신을 준비하려면 Go 개발 환경 설정을 참조하세요.

Cloud Run Functions에서 신속하게 Go를 시작하려면 빠른 시작을 참조하세요.

소스 코드 구조

Cloud Run Functions에서 함수 정의를 찾으려면 소스 코드가 특정 구조를 따라야 합니다. 자세한 내용은 Cloud Run 함수 작성을 참고하세요.

종속 항목 지정

Go로 작성한 Cloud Run Functions는 Go 모듈과 go.mod 파일 또는 vendor 디렉터리로 모든 종속 항목을 제공해야 합니다. 자세한 내용은 Go에서 종속 항목 지정을 참조하세요.

환경 변수

Go 런타임은 필요에 따라 사용할 함수의 특정 환경 변수를 자동으로 설정합니다. 자세한 내용은 환경 변수 사용을 참조하세요.

Context 유형

Go의 context 패키지가 정의하는 Context 유형은 API 경계를 넘어 프로세스 간에 기한, 취소 신호, 기타 요청 범위 값을 전달합니다.

다음 Cloud Run Functions 코드는 Pub/Sub 클라이언트의 컨텍스트 액세스 예시를 보여줍니다.


// Package helloworld provides a set of Cloud Functions samples.
package helloworld

import (
	"context"
	"fmt"
	"log"

	"github.com/GoogleCloudPlatform/functions-framework-go/functions"
	"github.com/cloudevents/sdk-go/v2/event"
)

func init() {
	functions.CloudEvent("HelloPubSub", helloPubSub)
}

// MessagePublishedData contains the full Pub/Sub message
// See the documentation for more details:
// https://cloud.google.com/eventarc/docs/cloudevents#pubsub
type MessagePublishedData struct {
	Message PubSubMessage
}

// PubSubMessage is the payload of a Pub/Sub event.
// See the documentation for more details:
// https://cloud.google.com/pubsub/docs/reference/rest/v1/PubsubMessage
type PubSubMessage struct {
	Data []byte `json:"data"`
}

// helloPubSub consumes a CloudEvent message and extracts the Pub/Sub message.
func helloPubSub(ctx context.Context, e event.Event) error {
	var msg MessagePublishedData
	if err := e.DataAs(&msg); err != nil {
		return fmt.Errorf("event.DataAs: %w", err)
	}

	name := string(msg.Message.Data) // Automatically decoded from base64.
	if name == "" {
		name = "World"
	}
	log.Printf("Hello, %s!", name)
	return nil
}