Pub/Sub Cloud 함수 샘플을 보여줍니다.
더 살펴보기
이 코드 샘플이 포함된 자세한 문서는 다음을 참조하세요.
- .NET 언어
- 백그라운드 함수
- Cloud Functions 직접 호출
- Cloud Pub/Sub 튜토리얼
- CloudEvent 함수
- 시작하기 튜토리얼: Cloud Functions(2세대)
- Google Cloud Pub/Sub 트리거
- JVM 언어
- 로컬 개발
- 백그라운드 함수 테스트
- 이벤트 기반 함수 테스트
- Cloud Functions 작성
코드 샘플
C#
using CloudNative.CloudEvents;
using Google.Cloud.Functions.Framework;
using Google.Events.Protobuf.Cloud.PubSub.V1;
using Microsoft.Extensions.Logging;
using System.Threading;
using System.Threading.Tasks;
namespace HelloPubSub
{
public class Function : ICloudEventFunction<MessagePublishedData>
{
private readonly ILogger _logger;
public Function(ILogger<Function> logger) =>
_logger = logger;
public Task HandleAsync(CloudEvent cloudEvent, MessagePublishedData data, CancellationToken cancellationToken)
{
string nameFromMessage = data.Message?.TextData;
string name = string.IsNullOrEmpty(nameFromMessage) ? "world" : nameFromMessage;
_logger.LogInformation("Hello {name}", name);
return Task.CompletedTask;
}
}
}
C++
#include <google/cloud/functions/cloud_event.h>
#include <boost/log/trivial.hpp>
#include <cppcodec/base64_rfc4648.hpp>
#include <nlohmann/json.hpp>
namespace gcf = ::google::cloud::functions;
// Though not used in this example, the event is passed by value to support
// applications that move-out its data.
void hello_world_pubsub(gcf::CloudEvent event) { // NOLINT
if (event.data_content_type().value_or("") != "application/json") {
BOOST_LOG_TRIVIAL(error) << "expected application/json data";
return;
}
auto const payload = nlohmann::json::parse(event.data().value_or("{}"));
auto const name = cppcodec::base64_rfc4648::decode<std::string>(
payload["message"]["data"].get<std::string>());
BOOST_LOG_TRIVIAL(info) << "Hello " << (name.empty() ? "World" : name);
}
Go
// Package helloworld provides a set of Cloud Functions samples.
package helloworld
import (
"context"
"log"
)
// 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 Pub/Sub message.
func HelloPubSub(ctx context.Context, m PubSubMessage) error {
name := string(m.Data) // Automatically decoded from base64.
if name == "" {
name = "World"
}
log.Printf("Hello, %s!", name)
return nil
}
자바
import com.google.cloud.functions.BackgroundFunction;
import com.google.cloud.functions.Context;
import com.google.events.cloud.pubsub.v1.Message;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.logging.Level;
import java.util.logging.Logger;
public class HelloPubSub implements BackgroundFunction<Message> {
private static final Logger logger = Logger.getLogger(HelloPubSub.class.getName());
@Override
public void accept(Message message, Context context) {
String name = "world";
if (message != null && message.getData() != null) {
name = new String(
Base64.getDecoder().decode(message.getData().getBytes(StandardCharsets.UTF_8)),
StandardCharsets.UTF_8);
}
logger.info(String.format("Hello %s!", name));
return;
}
}
Kotlin
import com.google.cloud.functions.BackgroundFunction
import com.google.cloud.functions.Context
import com.google.events.cloud.pubsub.v1.Message;
import java.nio.charset.StandardCharsets
import java.util.Base64
import java.util.logging.Logger
class HelloPubSub : BackgroundFunction<Message> {
override fun accept(message: Message, context: Context) {
// name's default value is "world"
var name = "world"
if (message?.data != null) {
name = String(
Base64.getDecoder().decode(message.data!!.toByteArray(StandardCharsets.UTF_8)),
StandardCharsets.UTF_8)
}
LOGGER.info(String.format("Hello %s!", name))
return;
}
companion object {
private val LOGGER = Logger.getLogger(HelloPubSub::class.java.name)
}
}
Node.js
/**
* Background Cloud Function to be triggered by Pub/Sub.
* This function is exported by index.js, and executed when
* the trigger topic receives a message.
*
* @param {object} message The Pub/Sub message.
* @param {object} context The event metadata.
*/
exports.helloPubSub = (message, context) => {
const name = message.data
? Buffer.from(message.data, 'base64').toString()
: 'World';
console.log(`Hello, ${name}!`);
};
PHP
use CloudEvents\V1\CloudEventInterface;
use Google\CloudFunctions\FunctionsFramework;
// Register the function with Functions Framework.
// This enables omitting the `FUNCTIONS_SIGNATURE_TYPE=cloudevent` environment
// variable when deploying. The `FUNCTION_TARGET` environment variable should
// match the first parameter.
FunctionsFramework::cloudEvent('helloworldPubsub', 'helloworldPubsub');
function helloworldPubsub(CloudEventInterface $event): void
{
$log = fopen(getenv('LOGGER_OUTPUT') ?: 'php://stderr', 'wb');
$cloudEventData = $event->getData();
$pubSubData = base64_decode($cloudEventData['message']['data']);
$name = $pubSubData ? htmlspecialchars($pubSubData) : 'World';
fwrite($log, "Hello, $name!" . PHP_EOL);
}
Python
def hello_pubsub(event, context):
"""Background Cloud Function to be triggered by Pub/Sub.
Args:
event (dict): The dictionary with data specific to this type of
event. The `@type` field maps to
`type.googleapis.com/google.pubsub.v1.PubsubMessage`.
The `data` field maps to the PubsubMessage data
in a base64-encoded string. The `attributes` field maps
to the PubsubMessage attributes if any is present.
context (google.cloud.functions.Context): Metadata of triggering event
including `event_id` which maps to the PubsubMessage
messageId, `timestamp` which maps to the PubsubMessage
publishTime, `event_type` which maps to
`google.pubsub.topic.publish`, and `resource` which is
a dictionary that describes the service API endpoint
pubsub.googleapis.com, the triggering topic's name, and
the triggering event type
`type.googleapis.com/google.pubsub.v1.PubsubMessage`.
Returns:
None. The output is written to Cloud Logging.
"""
import base64
print("""This Function was triggered by messageId {} published at {} to {}
""".format(context.event_id, context.timestamp, context.resource["name"]))
if 'data' in event:
name = base64.b64decode(event['data']).decode('utf-8')
else:
name = 'World'
print('Hello {}!'.format(name))
Ruby
require "functions_framework"
require "base64"
FunctionsFramework.cloud_event "hello_pubsub" do |event|
# The event parameter is a CloudEvents::Event::V1 object.
# See https://cloudevents.github.io/sdk-ruby/latest/CloudEvents/Event/V1.html
name = Base64.decode64 event.data["message"]["data"] rescue "World"
# A cloud_event function does not return a response, but you can log messages
# or cause side effects such as sending additional events.
logger.info "Hello, #{name}!"
end
다음 단계
다른 Google Cloud 제품의 코드 샘플을 검색하고 필터링하려면 Google Cloud 샘플 브라우저를 참조하세요.