使用 Cloud Functions (第 2 代) 和 Eventarc 处理 Cloud Storage 事件
深入探索
如需查看包含此代码示例的详细文档,请参阅以下内容:
代码示例
C#
如需向 Cloud Functions 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
using CloudNative.CloudEvents;
using Google.Cloud.Functions.Framework;
using Google.Events.Protobuf.Cloud.Storage.V1;
using Microsoft.Extensions.Logging;
using System.Threading;
using System.Threading.Tasks;
namespace HelloGcs;
/// <summary>
/// Example Cloud Storage-triggered function.
/// This function can process any event from Cloud Storage.
/// </summary>
public class Function : ICloudEventFunction<StorageObjectData>
{
private readonly ILogger _logger;
public Function(ILogger<Function> logger) =>
_logger = logger;
public Task HandleAsync(CloudEvent cloudEvent, StorageObjectData data, CancellationToken cancellationToken)
{
_logger.LogInformation("Event: {event}", cloudEvent.Id);
_logger.LogInformation("Event Type: {type}", cloudEvent.Type);
_logger.LogInformation("Bucket: {bucket}", data.Bucket);
_logger.LogInformation("File: {file}", data.Name);
_logger.LogInformation("Metageneration: {metageneration}", data.Metageneration);
_logger.LogInformation("Created: {created:s}", data.TimeCreated?.ToDateTimeOffset());
_logger.LogInformation("Updated: {updated:s}", data.Updated?.ToDateTimeOffset());
return Task.CompletedTask;
}
}
Go
如需向 Cloud Functions 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
// 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"
"github.com/googleapis/google-cloudevents-go/cloud/storagedata"
"google.golang.org/protobuf/encoding/protojson"
)
func init() {
functions.CloudEvent("HelloStorage", helloStorage)
}
// helloStorage consumes a CloudEvent message and logs details about the changed object.
func helloStorage(ctx context.Context, e event.Event) error {
log.Printf("Event ID: %s", e.ID())
log.Printf("Event Type: %s", e.Type())
var data storagedata.StorageObjectData
if err := protojson.Unmarshal(e.Data(), &data); err != nil {
return fmt.Errorf("protojson.Unmarshal: %w", err)
}
log.Printf("Bucket: %s", data.GetBucket())
log.Printf("File: %s", data.GetName())
log.Printf("Metageneration: %d", data.GetMetageneration())
log.Printf("Created: %s", data.GetTimeCreated().AsTime())
log.Printf("Updated: %s", data.GetUpdated().AsTime())
return nil
}
Java
如需向 Cloud Functions 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
import com.google.cloud.functions.CloudEventsFunction;
import com.google.events.cloud.storage.v1.StorageObjectData;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.util.JsonFormat;
import io.cloudevents.CloudEvent;
import java.nio.charset.StandardCharsets;
import java.util.logging.Logger;
public class HelloGcs implements CloudEventsFunction {
private static final Logger logger = Logger.getLogger(HelloGcs.class.getName());
@Override
public void accept(CloudEvent event) throws InvalidProtocolBufferException {
logger.info("Event: " + event.getId());
logger.info("Event Type: " + event.getType());
if (event.getData() == null) {
logger.warning("No data found in cloud event payload!");
return;
}
String cloudEventData = new String(event.getData().toBytes(), StandardCharsets.UTF_8);
StorageObjectData.Builder builder = StorageObjectData.newBuilder();
JsonFormat.parser().merge(cloudEventData, builder);
StorageObjectData data = builder.build();
logger.info("Bucket: " + data.getBucket());
logger.info("File: " + data.getName());
logger.info("Metageneration: " + data.getMetageneration());
logger.info("Created: " + data.getTimeCreated());
logger.info("Updated: " + data.getUpdated());
}
}
Node.js
如需向 Cloud Functions 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
const functions = require('@google-cloud/functions-framework');
// Register a CloudEvent callback with the Functions Framework that will
// be triggered by Cloud Storage.
functions.cloudEvent('helloGCS', cloudEvent => {
console.log(`Event ID: ${cloudEvent.id}`);
console.log(`Event Type: ${cloudEvent.type}`);
const file = cloudEvent.data;
console.log(`Bucket: ${file.bucket}`);
console.log(`File: ${file.name}`);
console.log(`Metageneration: ${file.metageneration}`);
console.log(`Created: ${file.timeCreated}`);
console.log(`Updated: ${file.updated}`);
});
PHP
如需向 Cloud Functions 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
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('helloGCS', 'helloGCS');
function helloGCS(CloudEventInterface $cloudevent)
{
// This function supports all Cloud Storage event types.
$log = fopen(getenv('LOGGER_OUTPUT') ?: 'php://stderr', 'wb');
$data = $cloudevent->getData();
fwrite($log, 'Event: ' . $cloudevent->getId() . PHP_EOL);
fwrite($log, 'Event Type: ' . $cloudevent->getType() . PHP_EOL);
fwrite($log, 'Bucket: ' . $data['bucket'] . PHP_EOL);
fwrite($log, 'File: ' . $data['name'] . PHP_EOL);
fwrite($log, 'Metageneration: ' . $data['metageneration'] . PHP_EOL);
fwrite($log, 'Created: ' . $data['timeCreated'] . PHP_EOL);
fwrite($log, 'Updated: ' . $data['updated'] . PHP_EOL);
}
Python
如需向 Cloud Functions 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
from cloudevents.http import CloudEvent
import functions_framework
# Triggered by a change in a storage bucket
@functions_framework.cloud_event
def hello_gcs(cloud_event: CloudEvent) -> tuple:
"""This function is triggered by a change in a storage bucket.
Args:
cloud_event: The CloudEvent that triggered this function.
Returns:
The event ID, event type, bucket, name, metageneration, and timeCreated.
"""
data = cloud_event.data
event_id = cloud_event["id"]
event_type = cloud_event["type"]
bucket = data["bucket"]
name = data["name"]
metageneration = data["metageneration"]
timeCreated = data["timeCreated"]
updated = data["updated"]
print(f"Event ID: {event_id}")
print(f"Event type: {event_type}")
print(f"Bucket: {bucket}")
print(f"File: {name}")
print(f"Metageneration: {metageneration}")
print(f"Created: {timeCreated}")
print(f"Updated: {updated}")
return event_id, event_type, bucket, name, metageneration, timeCreated, updated
Ruby
如需向 Cloud Functions 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
require "functions_framework"
FunctionsFramework.cloud_event "hello_gcs" do |event|
# This function supports all Cloud Storage events.
# The `event` parameter is a CloudEvents::Event::V1 object.
# See https://cloudevents.github.io/sdk-ruby/latest/CloudEvents/Event/V1.html
payload = event.data
logger.info "Event: #{event.id}"
logger.info "Event Type: #{event.type}"
logger.info "Bucket: #{payload['bucket']}"
logger.info "File: #{payload['name']}"
logger.info "Metageneration: #{payload['metageneration']}"
logger.info "Created: #{payload['timeCreated']}"
logger.info "Updated: #{payload['updated']}"
end
后续步骤
如需搜索和过滤其他 Google Cloud 产品的代码示例,请参阅 Google Cloud 示例浏览器。