이벤트 기반 함수 작성
Cloud Functions에서는 클라우드 환경에서 발생하는 이벤트에 대한 응답으로 함수가 자동으로 호출되기를 원할 때 이벤트 기반 함수를 사용합니다.
이벤트 기반 함수를 구현하는 방법에는 두 가지가 있습니다. 어떤 방법을 사용해야 할지는 선택한 언어 런타임과 Cloud Functions(1세대) 또는 Cloud Functions(2세대) 중 무엇을 사용하는지에 따라 다릅니다.
- Cloud Functions (2세대)에서는 모든 런타임에 CloudEvent 함수를 사용합니다.
- Cloud Functions(1세대):\
- Node.js, Python, Go, Java 런타임의 경우 백그라운드 함수를 사용합니다.
- .NET, Ruby, PHP 런타임의 경우 CloudEvent 함수를 사용합니다.
CloudEvent 함수
CloudEvent 함수는 이벤트 데이터를 일반적인 방식으로 설명하는 업계 표준 사양인 CloudEvents를 기반으로 합니다. CloudEvents GitHub 저장소에서 CloudEvents 사양에 대해 자세히 알아보세요. 또한 CloudEvents 프로젝트는 코드에서 CloudEvents 객체로 작업하는 데 도움이 되는 CloudEvents SDK 집합도 제공합니다.
다음 예시에서는 각 런타임의 기본 CloudEvent 함수 소스 파일을 보여줍니다. 소스 코드를 찾을 위치에 대한 자세한 내용은 소스 디렉터리 구조를 참조하세요.
Node.js
const functions = require('@google-cloud/functions-framework');
// Register a CloudEvent function with the Functions Framework
functions.cloudEvent('myCloudEventFunction', cloudEvent => {
// Your code here
// Access the CloudEvent data payload via cloudEvent.data
});
Node.js에서 Node.js용 함수 프레임워크에 CloudEvent 핸들러 함수를 등록합니다.
핸들러 함수는 CloudEvent
객체를 인수로 수락해야 합니다.
함수 진입점은 함수 프레임워크에 핸들러가 등록된 이름입니다.
이 예시에서 진입점은 myCloudEventFunction
입니다.
Python
import functions_framework
# Register a CloudEvent function with the Functions Framework
@functions_framework.cloud_event
def my_cloudevent_function(cloud_event):
# Your code here
# Access the CloudEvent data payload via cloud_event.data
Python에서는 Python용 함수 프레임워크에 CloudEvent 핸들러 함수를 등록합니다.
핸들러 함수는 CloudEvent
객체를 인수로 수락해야 합니다.
함수 진입점은 함수 프레임워크에 등록된 핸들러 함수 이름입니다.
이 예시에서 진입점은 my_cloudevent_function
입니다.
Go
package mycloudeventfunction
import (
"context"
"github.com/GoogleCloudPlatform/functions-framework-go/functions"
"github.com/cloudevents/sdk-go/v2/event"
)
func init() {
// Register a CloudEvent function with the Functions Framework
functions.CloudEvent("MyCloudEventFunction", myCloudEventFunction)
}
// Function myCloudEventFunction accepts and handles a CloudEvent object
func myCloudEventFunction(ctx context.Context, e event.Event) error {
// Your code here
// Access the CloudEvent data payload via e.Data() or e.DataAs(...)
// Return nil if no error occurred
return nil
}
Go에서는 Go용 함수 프레임워크에 CloudEvent 핸들러 함수를 등록합니다. 핸들러 함수는 CloudEvents event.Event
객체를 인수로 허용해야 합니다.
함수 진입점은 함수 프레임워크에 핸들러가 등록된 이름입니다.
이 예시에서 진입점은 MyCloudEventFunction
입니다.
자바
package mycloudeventfunction;
import com.google.cloud.functions.CloudEventsFunction;
import io.cloudevents.CloudEvent;
// Define a class that implements the CloudEventsFunction interface
public class MyCloudEventFunction implements CloudEventsFunction {
// Implement the accept() method to handle CloudEvents
@Override
public void accept(CloudEvent event) {
// Your code here
// Access the CloudEvent data payload via event.getData()
// To get the data payload as a JSON string, use:
// new String(event.getData().toBytes())
}
}
Java에서는 Java API용 함수 프레임워크를 사용하여 CloudEventsFunction
인터페이스로 CloudEvent 핸들러 클래스를 구현합니다. accept()
메서드는 CloudEvent
객체를 인수로 수락하고 이벤트에서 모든 처리를 수행해야 합니다.
함수 진입점은 패키지 이름을 포함한 CloudEvent 핸들러 클래스의 정규화된 이름입니다. 이 예시에서 진입점은 mycloudeventfunction.MyCloudEventFunction
입니다.
C#
using CloudNative.CloudEvents; using Google.Cloud.Functions.Framework; using System.Threading; using System.Threading.Tasks; namespace MyProject { // Define a class that implements the ICloudEventFunction<T> interface public class MyCloudEventFunction : ICloudEventFunction<CloudEventDataType> { // Implement the HandleAsync() method to handle CloudEvents public Task HandleAsync(CloudEvent cloudEvent, CloudEventDataType data, CancellationToken cancellationToken) { // Your code here // The data argument represents the CloudEvent data payload // Signal function completion return Task.CompletedTask; } } }
.NET 런타임에서는 .NET용 함수 프레임워크 사용하여 ICloudEventFunction<T>
인터페이스와 함께 CloudEvent 핸들러 클래스를 구현합니다. HandleAsync()
메서드는 CloudEvent
객체 및 연결된 CloudEvent 데이터 페이로드를 인수로 수락합니다.
위 예시에서 CloudEventDataType
으로 표시된 CloudEvent 데이터 페이로드 인수 유형은 함수가 처리하는 이벤트 유형과 일치해야 합니다. Google CloudEvents .NET 라이브러리는 Google에서 지원하는 다양한 이벤트에 대한 데이터 유형을 제공합니다.
함수 진입점은 네임스페이스를 포함한 CloudEvent 핸들러 클래스의 정규화된 이름입니다. 이 예시에서 진입점은 MyProject.MyCloudEventFunction
입니다.
Ruby
require "functions_framework"
# Register a CloudEvent function with the Functions Framework
FunctionsFramework.cloud_event "my_cloudevent_function" do |cloud_event|
# Your code here
# Access the CloudEvent data payload via cloud_event.data
end
Ruby에서는 Ruby용 함수 프레임워크에 CloudEvent 핸들러 함수를 등록합니다. 핸들러 함수는 CloudEvents Event
객체를 인수로 허용해야 합니다.
함수 진입점은 함수 프레임워크에 핸들러가 등록된 이름입니다.
이 예시에서 진입점은 my_cloudevent_function
입니다.
PHP
<?php
use CloudEvents\V1\CloudEventInterface;
use Google\CloudFunctions\FunctionsFramework;
// Register a CloudEvent function with the Functions Framework
FunctionsFramework::cloudEvent('myCloudEventFunction', 'myCloudEventHandler');
// Define your CloudEvent handler
function myCloudEventHandler(CloudEventInterface $event): void
{
// Your code here
// Access the CloudEvent data payload via $event->getData()
}
PHP에서는 PHP용 함수 프레임워크로 CloudEvent 핸들러 함수를 등록합니다.
핸들러 함수는 CloudEventInterface
인터페이스를 준수하는 인수를 수락해야 합니다.
함수 진입점은 함수 프레임워크에 핸들러가 등록된 이름입니다.
이 예시에서 진입점은 myCloudEventFunction
입니다.
CloudEvent 함수의 경우 이벤트 데이터는 CloudEvents 형식으로 함수에 전달되고 함수를 트리거하는 이벤트 유형에 해당하는 CloudEvent 데이터 페이로드가 포함됩니다. 지원되는 트리거, 이벤트 유형, 연결된 이벤트 데이터 형식에 대한 자세한 내용은 Cloud Functions 트리거를 참조하세요.
Google 이벤트 저장소에는 Google에서 발급한 CloudEvents를 사용하기 위한 리소스가 포함되어 있습니다.
백그라운드 함수
Cloud Functions(1세대) Node.js, Python, Go, Java 런타임의 이벤트 기반 함수는 CloudEvent 함수와 다른 인수가 필요합니다. 이 이전 이벤트 기반 함수 스타일을 백그라운드 함수라고 합니다.
다음 예시에서는 각 런타임의 기본 백그라운드 함수 소스 파일을 보여줍니다. 소스 코드를 찾을 위치에 대한 자세한 내용은 소스 디렉터리 구조를 참조하세요.
Node.js
// Define and export an event handler
exports.myBackgroundFunction = (eventData, context, callback) => {
// Your code here
// The eventData argument represents the event data payload
// Optionally signal function completion:
callback();
};
Node.js에서는 이벤트 데이터를 처리하는 함수를 정의하고 내보냅니다. Cloud Functions는 핸들러 함수에 다음 인수를 전달합니다.
eventData
: 이벤트 데이터 페이로드를 나타내는 객체입니다. 형식은 이벤트 유형에 따라 다릅니다.context
: 이벤트에 대한 메타데이터가 포함된 객체입니다.callback
: 신호를 완료하도록 호출할 수 있는 선택적 함수입니다. 이 콜백의 첫 번째 인수는 오류를 나타내는 것으로 해석됩니다. 인수 또는null
첫 번째 인수를 전달하지 않으면 성공했다는 뜻입니다.
함수 진입점은 내보낸 이벤트 핸들러 이름입니다. 이 예시에서 진입점은 myBackgroundFunction
입니다.
Python
# Define an event handler
def my_background_function(event_data, context):
# Your code here
# The event_data argument represents the event data payload
Python에서는 이벤트 데이터를 처리하는 함수를 정의합니다. Cloud Functions는 핸들러 함수에 다음 인수를 전달합니다.
event_data
: 이벤트 데이터 페이로드를 나타내는 사전입니다. 형식은 이벤트 유형에 따라 다릅니다.context
: 이벤트에 대한 메타데이터가 포함된 객체입니다.
함수 진입점은 핸들러 함수 이름입니다. 이 예시에서 진입점은 my_background_function
입니다.
Go
package mybackgroundfunction import ( "context" ) // Function MyBackgroundFunction accepts and handles event data func MyBackgroundFunction(ctx context.Context, e EventDataType) error { // Your code here // The argument e represents the event data payload // Return nil if no error occurred return nil }
Go에서는 이벤트 데이터를 처리하는 내보낸 함수를 정의합니다. Cloud Functions는 핸들러 함수에 다음 인수를 전달합니다.
ctx
: 이벤트에 대한 메타데이터가 포함된context.Context
객체입니다.cloud.google.com/go/functions/metadata
패키지를 사용하여 메타데이터를 검색할 수 있습니다.e
: 이벤트 데이터 페이로드를 나타내는 객체입니다. 위 예시에서EventDataType
로 표시된 유형은 함수가 처리하는 이벤트 유형에 해당하는 구조체여야 합니다. 이벤트 데이터 페이로드는json.Unmarshal()
을 사용하여 구조체로 결합되지 않습니다.
함수 진입점은 내보낸 이벤트 핸들러 이름입니다. 이 예시에서 진입점은 MyBackgroundFunction
입니다.
자바
package mybackgroundfunction; import com.google.cloud.functions.BackgroundFunction; import com.google.cloud.functions.Context; // Define a class that implements the BackgroundFunction<T> interface public class MyBackgroundFunction implements BackgroundFunction<EventDataType> { // Implement the accept() method to handle events @Override public void accept(EventDataType eventData, Context context) { // Your code here // The eventData argument represents the event data payload } }
Java에서는 Java용 함수 프레임워크 API를 사용하여 BackgroundFunction<T>
인터페이스로 이벤트 핸들러 클래스를 구현합니다. accept()
메서드는 이벤트 데이터 페이로드 및 이벤트에 대한 메타데이터가 포함된 Context
객체를 인수로 수락합니다.
위 예시에서 EventDataType
으로 표시된 이벤트 데이터 페이로드 인수 유형은 함수가 처리하는 이벤트 유형과 일치해야 합니다. 이벤트 데이터 페이로드는 Gson.fromJson()
을 사용하여 이 클래스의 인스턴스로 역직렬화됩니다.
함수 진입점은 패키지 이름을 포함한 이벤트 핸들러 클래스의 정규화된 이름입니다. 이 예시에서 진입점은 mybackgroundfunction.MyBackgroundFunction
입니다.
백그라운드 함수의 경우 이벤트 데이터 페이로드는 함수를 트리거하는 이벤트 유형에 해당하는 형식으로 함수에 직접 전달됩니다. 지원되는 트리거, 이벤트 유형, 관련 이벤트 데이터 형식에 대한 자세한 내용은 Cloud Functions(1세대)에서 지원되는 트리거를 참조하세요.
함수 종료
Cloud Functions는 함수가 반환될 때 이벤트 기반 함수 실행이 완료된 것으로 간주합니다. 함수가 백그라운드 태스크(예: 스레드, 기능, JavaScript Promise
객체, 콜백 또는 시스템 프로세스)를 만드는 경우 이를 종료하거나 함수에서 반환하기 전 태스크를 해결해야 합니다. 함수가 반환되기 전에 종료되지 않은 작업은 완료되지 않을 수 있으며 정의되지 않은 동작이 발생할 수 있습니다.
자동 재시도
실패한 호출을 자동으로 재시도하도록 이벤트 기반 함수를 구성할 수 있습니다. 자세한 내용은 이벤트 기반 함수 재시도를 참조하세요.
다음 단계
- Cloud Functions 트리거 알아보기
- Cloud 함수 배포 방법 알아보기
- 튜토리얼을 참조하여 이벤트 기반 함수 예시 등 다양한 Cloud Functions 사용 사례 알아보기