3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Cloud Run Functions 第一世代と第二世代のイベントデータの違い

Posted at

Cloud Run Functions 第一世代と第二世代のイベントデータの違い

はじめに

Cloud Run Functions(旧称 Cloud Functions)は第一世代と第二世代が存在し、2025/9/25 現在では第二世代のみ作成が可能です。

現在私は第一世代の関数を運用しています。
現時点でも第一世代のサポートはされていますが、今後来たるであろうサポート終了に向けて変更点を調査しました。

私が運用している関数は Cloud Storage トリガーを設定しているので、この記事ではイベントデータの扱い方の違いについて取り上げます。

ランタイム

以降の検証では以下のランタイムを使用しています。
第一世代:Java 17
第二世代:Java 21

受け取るイベントデータ

第一世代

メインクラスの accept() の引数にイベントデータ用クラスを指定します。

専用のクラスが用意されているわけではなく、実装者が適宜クラスを実装する必要がありました。
具体的には、イベントデータ用のクラスを用意して、必要なデータの getter を実装することで必要なプロパティを取得します。

example.java
	@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 型へ変換することで各プロパティを取得することが可能です!
第一世代よりも実装が簡単になりました!
(第一世代でももしかしてできたかも…)

具体例は以下です。

example.java
	@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>"
}

参考記事

以上です。
どなたかの参考になれば幸いです。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?