이 페이지에서는 Functions Framework를 사용하여 HTTP 및 이벤트 기반 Cloud Run 함수를 작성하는 방법을 설명합니다.
Functions 프레임워크 개요
함수 소스 코드를 작성할 경우 Cloud Run Functions 작성용 오픈소스 라이브러리인 함수 프레임워크를 사용해야 합니다. 함수 프레임워크를 사용하면 Cloud Run 및 로컬 개발 머신, Knative 기반 환경을 포함한 다른 환경에서 실행되는 가벼운 함수를 작성할 수 있습니다.
함수 프레임워크를 사용하면 다음을 수행할 수 있습니다.
- 요청에 대한 응답으로 Cloud Run Functions를 호출합니다.
- 일반적인 방식으로 이벤트 데이터를 설명하는 업계 표준 사양인 CloudEvents 사양에 따라 자동으로 이벤트 마셜링 취소
- 테스트를 위해 로컬 개발 서버를 시작합니다.
함수 프레임워크는 모듈식 서비스를 빌드할 수 있는 인터페이스를 제공합니다. 소스 코드에서 함수 프레임워크를 사용하려면 다음을 지정합니다.
함수 진입점
소스 코드는 Cloud Run이 함수를 호출할 때 실행되는 코드인 함수 진입점을 정의해야 합니다. 함수를 배포할 때 이 진입점을 지정합니다.
진입점을 정의하는 방법은 사용되는 언어 런타임에 따라 달라집니다. 일부 언어에서는 함수를 진입점으로 사용하고 다른 언어에서는 클래스를 사용합니다.
서명 유형
함수 프레임워크로 함수 소스 코드를 작성하는 경우 다음 두 가지 서명 유형 중 하나를 지정해야 합니다.
- HTTP 함수: HTTP 핸들러 함수를 등록합니다. 함수에 URL 엔드포인트가 필요하고 웹훅과 같은 HTTP 요청에 응답해야 하는 경우 HTTP 함수를 사용합니다.
- 이벤트 기반 함수(CloudEvents 함수라고도 함): CloudEvents 핸들러 함수를 등록합니다. Pub/Sub 주제에 대한 메시지 또는 Cloud Storage 버킷의 변경사항과 같은 Google Cloud 프로젝트 내에서 이벤트에 대한 응답으로 함수를 직접 트리거해야 하는 경우 이벤트 기반 함수를 사용합니다.
소스 디렉터리 구조
함수 프레임워크는 여러 프로그래밍 언어에서 지원됩니다. 선택한 언어 런타임과 작성하려는 함수 유형에 따라 코드 구성 및 함수 구현 방법이 결정됩니다.
Cloud Run에서 함수 정의를 찾을 수 있도록 각 언어 런타임에는 소스 코드 구성에 대한 요구사항이 있습니다.
Node.js
Node.js 함수의 기본 디렉터리 구조는 다음과 같습니다.
. ├── index.js └── package.json
기본적으로 Cloud Run은 함수 디렉터리 루트에 있는 index.js
파일에서 소스 코드를 로드하려고 합니다. 다른 기본 소스 파일을 지정하려면 package.json
파일에서 main
필드를 사용합니다.
또한 package.json
파일에는 Node.js용 함수 프레임워크가 종속 항목으로 포함되어야 합니다.
{
"main": "index.js",
"dependencies": {
"@google-cloud/functions-framework": "^3.0.0"
},
"type": "module"
}
기본 파일의 코드는 함수 진입점을 정의해야 하고 다른 코드와 Node.js 모듈을 가져올 수 있습니다. 기본 파일은 또한 개별적으로 배포할 수 있는 여러 함수 진입점을 정의할 수 있습니다.
자세한 내용은 Node.js 런타임 개요 및 Node.js용 함수 프레임워크를 참조하세요.
Python
Python 함수의 기본 디렉터리 구조는 다음과 같습니다.
. ├── main.py └── requirements.txt
Cloud Run은 함수 디렉터리 루트에 있는 main.py
파일에서 소스 코드를 로드합니다. 기본 파일 이름은 main.py
여야 합니다.
requirements.txt
파일에는 Python용 함수 프레임워크가 종속 항목으로 포함되어야 합니다.
functions-framework==3.*
main.py
파일의 코드는 함수 진입점을 정의해야 하고 다른 코드 및 외부 종속 항목을 일반적으로 가져올 수 있습니다. main.py
파일은 또한 개별적으로 배포할 수 있는 여러 함수 진입점을 정의할 수 있습니다.
자세한 내용은 Python 런타임 개요 및 Python용 함수 프레임워크를 참조하세요.
Go
Go 함수의 기본 디렉터리 구조는 다음과 같습니다.
. ├── myfunction.go └── go.mod
함수는 프로젝트 루트의 Go 패키지에 있어야 합니다. 패키지 및 소스 파일에는 이름 제한이 없습니다. 단 함수는 package main
에 있을 수 없습니다. 로컬 테스트와 같이 main
패키지가 필요한 경우 하위 디렉터리에 패키지를 만들 수 있습니다.
. ├── myfunction.go ├── go.mod └── cmd/ └── main.go
go.mod
파일에는 Go용 함수 프레임워크가 종속 항목으로 포함되어야 합니다.
module example.com/my-module
require (
github.com/GoogleCloudPlatform/functions-framework-go v1.5.2
)
루트 패키지의 코드는 함수 진입점을 정의해야 하고 하위 패키지의 다른 코드 및 종속 항목을 일반적으로 가져올 수 있습니다. 패키지는 또한 개별적으로 배포할 수 있는 여러 함수 진입점을 정의할 수 있습니다.
자세한 내용은 Go 런타임 개요 및 Go용 함수 프레임워크를 참조하세요.
Java
자바 함수의 기본 디렉터리 구조는 다음과 같습니다.
. ├── pom.xml └── src/ └── main/ └── java/ └── MyFunction.java
자바 소스 파일은 src/main/java/
디렉터리에 있어야 하고 이름 제한이 없습니다. 소스 파일이 패키지를 선언할 경우 패키지 이름을 사용해서 src/main/java
아래에 여분의 디렉터리를 추가합니다.
. ├── pom.xml └── src/ └── main/ └── java/ └── mypackage/ └── MyFunction.java
src/test/java/
하위 디렉터리 아래에 연관된 테스트를 배치하는 것이 좋습니다.
pom.xml
파일에는 자바용 함수 프레임워크가 종속 항목으로 포함되어야 합니다.
...
<dependency>
<groupId>com.google.cloud.functions</groupId>
<artifactId>functions-framework-api</artifactId>
<version>1.0.4</version>
</dependency>
...
소스 파일의 코드는 함수 진입점을 정의해야 하고 다른 코드 및 외부 종속 항목을 일반적으로 가져올 수 있습니다. 소스 파일은 또한 개별적으로 배포할 수 있는 여러 함수 진입점을 정의할 수 있습니다.
자세한 내용은 Java 런타임 개요 및 Java용 함수 프레임워크를 참조하세요.
.NET
.NET 함수의 기본 디렉터리 구조는 다음과 같습니다.
. ├── MyFunction.cs └── MyProject.csproj
다른 .NET 소스 코드와 마찬가지로 프로젝트를 구성할 수 있습니다. 소스 파일에는 이름 제한이 없습니다.
프로젝트 파일에는 .NET용 함수 프레임워크가 종속 항목으로 포함되어야 합니다.
...
<PackageReference Include="Google.Cloud.Functions.Hosting" Version="1.0.0" />
...
소스 파일의 코드는 함수 진입점을 정의해야 하고 다른 코드 및 외부 종속 항목을 일반적으로 가져올 수 있습니다. 소스 파일은 또한 개별적으로 배포할 수 있는 여러 함수 진입점을 정의할 수 있습니다.
자세한 내용은 .NET 런타임 개요 및 .NET용 함수 프레임워크를 참조하세요.
Ruby
Ruby 함수의 기본 디렉터리 구조는 다음과 같습니다.
. ├── app.rb ├── Gemfile └── Gemfile.lock
Cloud Run은 함수 디렉터리 루트에 있는 app.rb
파일에서 소스 코드를 로드합니다. 기본 파일 이름은 app.rb
여야 합니다.
Gemfile
파일에는 Ruby용 함수 프레임워크가 종속 항목으로 포함되어야 합니다.
source "https://rubygems.org"
gem "functions_framework", "~> 1.0"
app.rb
파일의 코드는 함수 진입점을 정의해야 하고 다른 코드 및 외부 종속 항목을 일반적으로 가져올 수 있습니다. app.rb
파일은 또한 개별적으로 배포할 수 있는 여러 함수 진입점을 정의할 수 있습니다.
자세한 내용은 Ruby 런타임 개요 및 Ruby용 함수 프레임워크를 참조하세요.
PHP
PHP 함수의 기본 디렉터리 구조는 다음과 같습니다.
. ├── index.php └── composer.json
Cloud Run은 함수 디렉터리 루트에 있는 index.php
파일에서 소스 코드를 로드합니다. 기본 파일 이름은 index.php
여야 합니다.
composer.json
파일에는 PHP용 함수 프레임워크가 종속 항목으로 포함되어야 합니다.
{
"require": {
"google/cloud-functions-framework": "^1.1"
}
}
index.php
파일의 코드는 함수 진입점을 정의해야 하고 다른 코드와 외부 종속 항목을 일반적으로 가져올 수 있습니다. index.php
파일은 개별적으로 배포할 수 있는 함수 진입점 여러 개를 정의할 수도 있습니다.
자세한 내용은 PHP 런타임 개요 및 PHP용 함수 프레임워크를 참조하세요.
함수 여러 개를 단일 프로젝트로 그룹화하면 모든 함수가 같은 종속 항목 집합을 공유하게 될 수 있습니다. 그러나 일부 함수에는 모든 종속 항목이 필요하지 않을 수 있습니다.
가능하면 대규모 다기능 코드베이스를 분할하고 앞선 예시와 같이 자체 소스와 프로젝트 구성 파일과 함께 각 함수를 자체 최상위 디렉터리에 배치하는 것이 좋습니다. 이렇게 하면 특정 함수에 필요한 종속 항목 수가 최소화되어 함수에 필요한 메모리 양이 줄어듭니다.
HTTP 함수 작성
HTTP(S) 요청을 통해 함수를 호출하려면 HTTP 함수를 작성합니다. HTTP 시맨틱스를 허용하려면 함수 프레임워크를 사용하고 HTTP 관련 인수를 허용하도록 HTTP 함수 서명을 지정합니다.
다음 예시에서는 각 런타임의 기본 HTTP 함수 소스 파일을 보여줍니다. 완전한 작동 예시는 Google Cloud CLI를 사용하여 Cloud Run 함수 배포를 참고하세요. 소스 코드를 찾을 위치에 대한 자세한 내용은 소스 디렉터리 구조를 참고하세요.
Node.js
ES 모듈
import { http } from '@google-cloud/functions-framework';
http('myHttpFunction', (req, res) => {
// Your code here
// Send an HTTP response
res.send('OK');
});
package.json
파일에 "type": "module"
를 포함한 다음 종속 항목을 추가합니다.
{
"dependencies": {
"@google-cloud/functions-framework": "^3.0.0"
},
"type": "module"
}
CommonJS 모듈
const functions = require('@google-cloud/functions-framework');
// Register an HTTP function with the Functions Framework
functions.http('myHttpFunction', (req, res) => {
// Your code here
// Send an HTTP response
res.send('OK');
});
package.json
파일에 다음 종속 항목을 추가합니다.
{
"dependencies": {
"@google-cloud/functions-framework": "^3.0.0"
}
}
Node.js에서 Node.js용 함수 프레임워크에 HTTP 핸들러 함수를 등록합니다. HTTP 핸들러 함수는 요청 및 응답 인수를 수락하고 HTTP 응답을 전송하는 Express 미들웨어 함수여야 합니다.
Cloud Run은 HTTP 핸들러에서 req.body
및 req.rawBody
객체에 액세스할 수 있도록 body-parser
를 사용하여 요청의 Content-Type
헤더에 따라 요청 본문을 자동으로 파싱합니다.
함수 진입점은 함수 프레임워크에 핸들러가 등록된 이름입니다.
이 예시에서 진입점은 myHttpFunction
입니다.
Python
import functions_framework
# Register an HTTP function with the Functions Framework
@functions_framework.http
def my_http_function(request):
# Your code here
# Return an HTTP response
return 'OK'
Python에서는 HTTP 핸들러 함수를 Python용 함수 프레임워크에 등록합니다. HTTP 핸들러 함수는 Flask 요청 객체를 인수로 수락하고 Flask가 HTTP 응답 객체로 변환할 수 있는 값을 반환해야 합니다.
함수 진입점은 함수 프레임워크에 핸들러가 등록된 이름입니다.
이 예시에서 진입점은 my_http_function
입니다.
Go
package myhttpfunction
import (
"fmt"
"net/http"
"github.com/GoogleCloudPlatform/functions-framework-go/functions"
)
func init() {
// Register an HTTP function with the Functions Framework
functions.HTTP("MyHTTPFunction", myHTTPFunction)
}
// Function myHTTPFunction is an HTTP handler
func myHTTPFunction(w http.ResponseWriter, r *http.Request) {
// Your code here
// Send an HTTP response
fmt.Fprintln(w, "OK")
}
Go에서는 init()
함수에서 Go용 함수 프레임워크에 HTTP 핸들러 함수를 등록합니다. HTTP 핸들러 함수는 표준 http.HandlerFunc
인터페이스를 사용하여 HTTP 응답을 전송해야 합니다.
함수 진입점은 함수 프레임워크에 핸들러가 등록된 이름입니다.
이 예시에서 진입점은 MyHTTPFunction
입니다.
HTTP 핸들러 함수는 표준 http.HandlerFunc
인터페이스를 구현해야 합니다. 함수가 요청에 대한 응답을 만드는 데 사용하는 http.ResponseWriter 인터페이스와 인바운드 HTTP 요청의 세부정보가 포함된 http.Request 구조체에 대한 포인터를 받습니다.
Java
package myhttpfunction;
import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
// Define a class that implements the HttpFunction interface
public class MyHttpFunction implements HttpFunction {
// Implement the service() method to handle HTTP requests
@Override
public void service(HttpRequest request, HttpResponse response) throws Exception {
// Your code here
// Send an HTTP response
response.getWriter().write("OK");
}
}
자바에서는 자바용 함수 프레임워크 API를 사용하여 HttpFunction
인터페이스로 HTTP 핸들러 클래스를 구현합니다. service()
메서드는 HTTP 응답을 전송해야 합니다.
함수 진입점은 패키지 이름을 포함하여 HTTP 핸들러 클래스의 정규화된 이름입니다. 이 예시에서 진입점은 myhttpfunction.MyHttpFunction
입니다.
service
메서드는 인바운드 HTTP 요청을 설명하는 HttpRequest
객체와 함수가 응답 메시지로 채우는 HttpResponse
객체를 수신합니다.
.NET
using Google.Cloud.Functions.Framework;
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
namespace MyProject
{
// Define a class that implements the IHttpFunction interface
public class MyHttpFunction : IHttpFunction
{
// Implement the HandleAsync() method to handle HTTP requests
public async Task HandleAsync(HttpContext context)
{
// Your code here
// Send an HTTP response
await context.Response.WriteAsync("OK");
}
}
}
.NET 런타임에서는 .NET용 함수 프레임워크를 사용하여 IHttpFunction
인터페이스로 HTTP 핸들러 클래스를 구현합니다. HandleAsync()
메서드는 표준 ASP.NET HttpContext
객체를 인수로 수락하고 HTTP 응답을 전송해야 합니다.
함수 진입점은 네임스페이스를 포함하여 HTTP 핸들러 클래스의 정규화된 이름입니다. 이 예시에서 진입점은 MyProject.MyHttpFunction
입니다.
Ruby
require "functions_framework"
# Register an HTTP function with the Functions Framework
FunctionsFramework.http "my_http_function" do |request|
# Your code here
# Return an HTTP response
"OK"
end
Ruby에서는 Ruby용 함수 프레임워크로 HTTP 핸들러 함수를 등록합니다. HTTP 핸들러 함수는 Rack 요청 객체를 인수로 수락하고 HTTP 응답으로 사용될 수 있는 값을 반환해야 합니다.
함수 진입점은 함수 프레임워크에 핸들러가 등록된 이름입니다.
이 예시에서 진입점은 my_http_function
입니다.
PHP
<?php
use Google\CloudFunctions\FunctionsFramework;
use Psr\Http\Message\ServerRequestInterface;
// Register an HTTP function with the Functions Framework
FunctionsFramework::http('myHttpFunction', 'myHttpHandler');
// Define your HTTP handler
function myHttpHandler(ServerRequestInterface $request): string
{
// Your code here
// Return an HTTP response
return 'OK';
}
PHP에서는 PHP용 함수 프레임워크로 HTTP 핸들러 함수를 등록합니다.
HTTP 핸들러 함수는 PSR-7 ServerRequestInterface
인터페이스를 구현하는 인수를 수락하고 HTTP 응답을 PSR-7 ResponseInterface
인터페이스를 구현하는 문자열 또는 객체로 반환해야 합니다.
함수 진입점은 함수 프레임워크에 핸들러가 등록된 이름입니다.
이 예시에서 진입점은 myHttpFunction
입니다.
HTTP 요청 및 응답
함수 프레임워크에 HTTP 핸들러 함수를 등록하면 HTTP 핸들러가 요청 메서드를 검사하고 메서드에 따라 여러 작업을 실행할 수 있습니다.
Cloud Run 함수에 HTTP 요청을 전송하도록 이벤트 제공자를 구성하면 함수가 HTTP 응답을 전송합니다. 함수가 백그라운드 태스크(예: 스레드, futures, JavaScript 프로미스 객체, 콜백 또는 시스템 프로세스)를 만드는 경우 이를 종료하거나 HTTP 응답을 전송하기 전 태스크를 해결해야 합니다. HTTP 응답이 전송되기 전 종료되지 않은 태스크는 완료되지 않을 수 있고 정의되지 않은 동작을 일으킬 수 있습니다.
CORS 처리
교차 출처 리소스 공유(CORS)는 한 도메인에서 실행되는 애플리케이션이 다른 도메인의 리소스에 액세스하도록 허용하는 한 가지 방법입니다. 예를 들어 사용자 도메인이 함수 액세스를 위해 Cloud Run Functions 도메인에 요청을 수행하도록 허용해야 할 수 있습니다.
함수에 교차 출처 요청을 허용하려면 Access-Control-Allow-Origin
헤더를 HTTP 응답에 따라 적합하게 설정합니다. 프리플라이트된 교차 출처 요청의 경우 204
응답 코드 및 추가 헤더로 프리플라이트 OPTIONS
요청에 응답해야 합니다.
Node.js
Python
Go
자바
.NET
Ruby
PHP
CORS가 올바르게 설정되지 않은 경우 다음과 같은 오류가 표시될 수 있습니다.
XMLHttpRequest cannot load https://YOUR_FUNCTION_URL. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://YOUR_DOMAIN' is therefore not allowed access.
CORS 제한사항
프리플라이트된 교차 출처 요청의 경우 프리플라이트 OPTIONS 요청이 승인 헤더 없이 전송되므로, 인증이 필요한 모든 HTTP 함수에서 거부됩니다. 프리플라이트 요청이 실패하기 때문에 기본 요청도 실패합니다. 이 제한사항을 해결하려면 다음 옵션 중 하나를 사용합니다.
- 함수에 대해 공개 액세스를 허용합니다.
- 함수에 대해 IAP(Identity-Aware Proxy)를 구성합니다. Cloud Run Functions에 전송되는 프리플라이트 OPTIONS 요청의 승인 헤더가 제공됩니다.
- CORS를 방지하기 위해 웹 앱 및 Cloud Run을 동일한 도메인에 호스팅합니다. 이렇게 하려면 Cloud Run Functions와 Firebase 호스팅을 통합하면 됩니다.
이벤트 기반 함수 작성
Pub/Sub 주제에 대한 메시지 또는 Cloud Storage 버킷의 변경사항과 같은 Google Cloud 프로젝트 내 이벤트에 대한 응답으로 함수를 직접 트리거하려는 경우 이벤트 기반 함수를 작성합니다.
이벤트 기반 함수는 일반적인 방식으로 이벤트 데이터를 설명하기 위한 업계 표준 사양인 CloudEvents를 기반으로 합니다. CloudEvents 사양에 대한 자세한 내용은 CloudEvents GitHub 저장소를 참고하세요. CloudEvents 프로젝트는 코드에서 CloudEvents 객체를 사용하는 데 도움이 되는 CloudEvents SDK 세트도 제공합니다.
다음 예시에서는 각 런타임의 이벤트 기반 함수 소스 파일을 보여줍니다. 소스 코드를 찾을 위치에 대한 자세한 내용은 소스 디렉터리 구조를 참고하세요.
Node.js
ES 모듈
import { cloudEvent } from "@google-cloud/functions-framework";
cloudEvent('myCloudEventFunction', cloudEvent => {
// Your code here
// Access the CloudEvent data payload using cloudEvent.data
});
package.json
파일에 "type": "module"
를 포함한 다음 종속 항목을 추가합니다.
{
"dependencies": {
"@google-cloud/functions-framework": "^3.0.0"
},
"type": "module"
}
CommonJS 모듈
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 using cloudEvent.data
});
package.json
파일에 다음 종속 항목을 추가합니다.
{
"dependencies": {
"@google-cloud/functions-framework": "^3.0.0"
}
}
Node.js에서는 CloudEvent 핸들러 함수를 Node.js용 함수 프레임워크에 등록합니다.
핸들러 함수에서 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에서는 CloudEvent 핸들러 함수를 Python용 함수 프레임워크에 등록합니다.
핸들러 함수에서 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 using e.Data() or e.DataAs(...)
// Returning an error causes its message to be logged.
// Example:
err := myInternalFunction() // may return an error
if err != nil {
// Append error message to log
return err
}
// Return nil if no error occurred
return nil
}
Go에서는 Go용 함수 프레임워크에 CloudEvent 핸들러 함수를 등록합니다. 핸들러 함수는 CloudEvents event.Event
객체를 인수로 허용해야 합니다.
함수 진입점은 함수 프레임워크에 핸들러가 등록된 이름입니다.
이 예시에서 진입점은 MyCloudEventFunction
입니다.
Java
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 using 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
입니다.
.NET
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 using $event->getData()
}
PHP에서는 CloudEvent 핸들러 함수를 PHP용 함수 프레임워크에 등록합니다.
핸들러 함수는 CloudEventInterface
인터페이스를 준수하는 인수를 수락해야 합니다.
함수 진입점은 함수 프레임워크에 핸들러가 등록된 이름입니다.
이 예시에서 진입점은 myCloudEventFunction
입니다.
이벤트 기반 함수의 경우 이벤트 데이터는 함수를 트리거하는 이벤트 유형에 해당하는 CloudEvent 데이터 페이로드와 함께 CloudEvent 형식의 함수로 전달됩니다. 지원되는 트리거, 이벤트 유형, 관련 이벤트 데이터 형식에 대한 자세한 내용은 함수 트리거를 참조하세요.
Google 이벤트 저장소에는 Google에서 발급한 CloudEvent를 사용하는 리소스가 포함되어 있습니다.
함수 종료
함수가 반환되면 Cloud Run은 이벤트 기반 함수 실행이 완료된 것으로 간주합니다. 함수에서 백그라운드 태스크(예: 스레드, 기능, JavaScript 프로미스 객체, 콜백 또는 시스템 프로세스)를 만드는 경우 함수에서 반환하기 전에 이러한 태스크를 종료해야 합니다. 함수가 반환되기 전에 종료되지 않은 작업은 완료되지 않을 수 있으며 정의되지 않은 동작이 발생할 수 있습니다.
자동 재시도
실패한 호출을 자동으로 다시 시도하도록 이벤트 기반 함수를 구성할 수 있습니다. 자세한 내용은 이벤트 기반 함수 재시도를 참조하세요.