Cloud Run Functions 第一世代と第二世代のイベントデータの違い
はじめに
Cloud Run Functions(旧称 Cloud Functions)は第一世代と第二世代が存在し、2025/9/25 現在では第二世代のみ作成が可能です。
現在私は第一世代の関数を運用しています。
現時点でも第一世代のサポートはされていますが、今後来たるであろうサポート終了に向けて変更点を調査しました。
私が運用している関数は Cloud Storage トリガーを設定しているので、この記事ではイベントデータの扱い方の違いについて取り上げます。
ランタイム
以降の検証では以下のランタイムを使用しています。
第一世代:Java 17
第二世代:Java 21
受け取るイベントデータ
第一世代
メインクラスの accept() の引数にイベントデータ用クラスを指定します。
専用のクラスが用意されているわけではなく、実装者が適宜クラスを実装する必要がありました。
具体的には、イベントデータ用のクラスを用意して、必要なデータの getter を実装することで必要なプロパティを取得します。
@Override
// 第一引数にイベントデータ用クラスを定義する
public void accept(GcsEvent event, Context context) {
event.getBucket();
event.getName();
}
// イベントデータ用のクラスを定義する
// バケット名とファイル名を取得したかったので、その2つのプロパティの getter を用意した
public static class GcsEvent {
private String bucket;
private String name;
public String getBucket() {
return bucket;
}
public String getName() {
return name;
}
}
第二世代
第二世代では、メインクラスの accept() の引数に CloudEvent クラスを指定します。
CloudEvent クラス内のプロパティには、 CloudEvent クラスを Json 型へ変換することで各プロパティを取得することが可能です!
第一世代よりも実装が簡単になりました!
(第一世代でももしかしてできたかも…)
具体例は以下です。
@Override
public void accept(CloudEvent event) {
// event を一度 String に変換し、その後 Json へ再変換
String eventData = new String(Objects.requireNonNull(event.getData()).toBytes());
JsonObject data = JsonParser.parseString(eventData).getAsJsonObject();
// 欲しいプロパティキーを指定する
final String bucket = data.get("bucket").getAsString();
final String filename = data.get("name").getAsString();
}
ちなみに、Cloud Storage トリガー使用時の CloudEvent クラスに格納されているプロパティは以下の通りです。
CloudEvent クラスの内容は accept() 内で logger.info(new String(event.getData().toBytes())); を実行することで、ログから確認可能です。
{
"kind": "storage#object",
"id": "<Bucket Name>/<File Name>/<Generation>",
"selfLink": "https://www.googleapis.com/storage/v1/b/<Bucket Name>/o/<File Name>",
"name": "<File Name>",
"bucket": "<Bucket Name>",
"generation": "<Generation>",
"metageneration": "1",
"contentType": "text/plain",
"timeCreated": "2025-09-18T07:06:13.219Z",
"updated": "2025-09-18T07:06:13.219Z",
"storageClass": "STANDARD",
"timeStorageClassUpdated": "2025-09-18T07:06:13.219Z",
"size": "15",
"md5Hash": "<md5Hash>",
"mediaLink": "https://storage.googleapis.com/download/storage/v1/b/<Bucket Name>/o/<File Name>?generation=<Generation>&alt=media",
"crc32c": "<crc32c>",
"etag": "<eTag>"
}
参考記事
以上です。
どなたかの参考になれば幸いです。