Google Cloud FunctionsでJava 11ランタイムを活用する方法

Google Cloud FunctionsとJava 11の連携

近年、Google Cloud Functionsが多くの開発者に利用されています。このサービスは、サーバーを手動で管理することなく、コードをクラウド上で実行することを可能にします。特に、Javaを使った開発が行いやすくなる機能が加わったことで、エンタープライズ向けの開発でもその利便性が向上しています。

新しいJava 11ランタイムの導入

2020年5月、Java 11ランタイムのベータ版がリリースされ、Javaを使用したGoogle Cloud Functionsの開発が可能になりました。これにより、Node.jsやGo、Pythonだけでなく、JAVAプログラミング言語でもCloud Functionsを活用できるようになりました。

Cloud Functionsとは?

Cloud Functionsでは、HTTPリクエストやCloud Pub/Subからのメッセージ、新たにアップロードされたファイルに基づいて、リアクションを実行することができます。つまり、任意のイベントに応じて動作するプログラムを簡単に作成・運用できるのです。

関数の形状

Cloud Functionsには主に2種類の関数があります:

  • HTTP関数: 受信したHTTPリクエストに応答するタイプ
  • バックグラウンド関数: Cloud eventsに反応するタイプ

Java Functions Frameworkは、これらの関数を作成するためのAPIを提供しています。このAPIを使って、ローカルでの実行やデバッグ、さらにはクラウドやオンプレミスへのデプロイも可能です。

HTTPリクエストに応答する関数の実装

HTTPリクエストを処理するためには、HttpFunctionインターフェースを実装する必要があります。

import com.google.cloud.functions.*;
import java.io.*;

public class Example implements HttpFunction {
    @Override
    public void service(HttpRequest request, HttpResponse response) throws IOException {
        var writer = response.getWriter();
        writer.write("Hello developers!");
    }
}

クラウドイベントに応じるバックグラウンド関数の実装

バックグラウンド関数では、例えば新しいPub/SubメッセージやCloud Storageファイルの更新に反応します。ここではJSONペイロードを扱う方法が2つあります。

  • JSON文字列を自分で解析するRawBackgroundFunction
  • Gsonライブラリを使ってオブジェクトを自動的に変換するBackgroundFunction
import com.google.cloud.functions.Context;
import com.google.cloud.functions.RawBackgroundFunction;

public class RawFunction implements RawBackgroundFunction {
    @Override
    public void accept(String json, Context context) {
        // JSONを扱うコード
    }
}

ローカルで関数を実行する

コードを開発することは素晴らしいですが、自身のコードが実際に動作するのを見るのはもっと素晴らしい体験です。Functions Frameworkには、ローカルで関数を実行するためのツールが含まれています。

Mavenでの実行

もしMavenを使用している場合は、以下のようにpom.xmlにFunction Mavenプラグインを追加することができます。

<plugin>
    <groupId>com.google.cloud.functions</groupId>
    <artifactId>function-maven-plugin</artifactId>
    <version>0.9.2</version>
    <configuration>
        <functionTarget>com.example.Example</functionTarget>
    </configuration>
</plugin>

その後、コマンドラインで以下を実行します:

$ mvn function:run

Gradleでの実行

Gradleの場合は、専用のプラグインはないものの、以下の手順で設定することができます。

configurations {
    invoker
}
dependencies {
    invoker 'com.google.cloud.functions.invoker:java-function-invoker:1.0.0-beta1'
}
tasks.register("runFunction", JavaExec) {
    main = 'com.google.cloud.functions.invoker.runner.Invoker'
    classpath(configurations.invoker)
    args('--target', 'com.example.Example', '--port', '8080')
}

関数のデプロイ

関数はMavenプラグインを使ってデプロイすることもできますが、ここではgcloudコマンドラインを使用してデプロイする方法に焦点を当てます。

$ gcloud functions deploy exampleFn 
    --region europe-west1 
    --trigger-http 
    --allow-unauthenticated 
    --runtime java11 
    --entry-point com.example.Example 
    --memory 512MB

他の言語やフレームワークのサポート

Java以外の言語として、GroovyKotlinScalaなども使用可能で、MicronautやSpring Bootなどのサードパーティフレームワークと連携することもできます。

まとめ

今回は、Google Cloud FunctionsにおけるJava 11の利用と、その設定・デプロイの流れを解説しました。これからは、ぜひ自分の好きなプログラミング言語やフレームワークを使って、Cloud Functionsを試してみてはいかがでしょうか。Google Cloud Platformの無料トライアルを活用して、新しい可能性を広げていきましょう!