アプリケーション開発

Google Cloud Functions が Java 11 に対応

#appdev

※この投稿は米国時間 2020 年 5 月 26 日に、Google Cloud blog に投稿されたものの抄訳です。

先日 25 周年を迎えた Java プログラミング言語は、エンタープライズ アプリケーションの開発において現在でも最もよく使用されている言語の 1 つです。Google Cloud ではこれまで App Engine と Cloud Run で、サーバーレスの Java マイクロサービスの実行に対応していましたが、本日より、Google Cloud Functions にも Java 11 を導入いたします。Google Cloud Functions はイベント ドリブンのサーバーレス コンピューティング プラットフォームで、ローカルでもクラウドでも、サーバーをプロビジョニングせずに実行できるのが特徴です。これに伴い、Google の Functions Framework for Java や、Spring Cloud FunctionsMicronaut などのフレームワークでお好きな JVM 言語(JavaKotlinGroovyScala など)を使って、Cloud Functions を記述できるようになります。

現在ベータ版が提供されている Cloud Functions for Java 11 では、Java を使ってビジネス クリティカルなアプリケーションやインテグレーション レイヤを構築し、その関数をフルマネージドの環境にデプロイして、プライベート VPC ネットワーク上のリソースにアクセスすることが可能です。Java 関数は負荷に応じて自動的にスケールされます。この方法で、HTTP イベントに応答する HTTP 関数や、各種クラウド サービスや GCP サービス(Pub/Sub、Cloud Storage、Firestore など)のイベントを処理するバックグランド関数を記述できます。

Cloud Functions が特に適している用途としては、サーバーレス アプリケーションのバックエンドにおけるサードパーティ サービスや API との統合のほか、モバイルや IoT のバックエンドなどがあります。また、リアルタイムのデータ処理システムにも適していて、Cloud Storage にファイルがアップロードされると同時に処理することや、Pub/Sub イベントのリアルタイム ストリームを処理することなどが可能です。さらに、仮想アシスタントや chat bot、動画分析、画像分析、感情分析などのインテリジェント アプリケーションにも適しています。

Cloud Functions for Java 11 の例

ポータブルな Java 関数を記述するためのオープンソースの FaaS(Functions as a Service)フレームワークである Functions Framework for Java を使って関数を開発できます。関数の開発と実行はローカルで行って、その関数を Cloud Functions やその他の Java 環境にデプロイできます。

HTTP 関数で HttpFunction インターフェースを実装します。

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

Functions Framework API の依存関係を Maven pom.xml に追加します。

  <dependency>
  <groupId>com.google.cloud.functions</groupId>
  <artifactId>functions-framework-api</artifactId>
  <version>1.0.1</version>
  <scope>provided</scope>
</dependency>

続けて、Function Maven プラグインを追加し、関数をローカルで実行できるようにします。

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

関数をローカルで実行します。

  mvn function:run

IDE を使って、この Maven のターゲットを Debugger モードで立ち上げ、関数をローカルでデバッグすることもできます。

2 Cloud Functions for Java 11.png

関数をデプロイするには、コマンドラインで gcloud を使用します。

  gcloud beta functions deploy helloworld-function \
  --entry-point function.HelloWorld --runtime java11 --trigger-http

または、Function Maven プラグインを使ってデプロイすることもできます。

  mvn function:deploy -Dfunction.deploy.name=helloworld-function

完全な例は GitHub で確認できます。この関数をフルマネージドの Cloud Functions 環境で実行するほか、Functions Framework ランタイムを Cloud Run、Google Kubernetes Engine、仮想マシンなど、別の環境に持ち込むこともできます。

サードパーティ フレームワークのサポート

Google の Functions Framework for Java に加えて、Micronaut フレームワークと Spring Cloud Function プロジェクトの両方が Google Cloud Functions を標準サポートするようになりました。それぞれのフレームワークのプログラミング モデル(依存関係の注入などの機能を含む)を使用して、HTTP 関数とバックグラウンド関数の両方を作成できます。

Micronaut

Micronaut のチームは、Cloud Functions Java 11 ランタイムの専用サポートを実装しました。Functions Framework の HttpFunction インターフェースを直接実装する代わりに、Micronaut のプログラミング モデルを使用して、Helloworld HTTP 関数を単なる Micronaut コントローラにすることができます。

  @Controller("/hello")
public class HelloController {
    @Get("/{name}")
    String greet(String name) {
        return "Hello " + name;
    }
}

GitHub に Micronaut と Cloud Functions の詳細な例とそのドキュメントが掲載されています。

Spring Cloud Function

Google Cloud Java Frameworks のチームは Spring のチームと連携し、Spring Boot のユーザーが簡単に Google Cloud のサービスを利用できるようにする Spring Cloud GCP プロジェクトを開始しました。最近、このチームは Spring Cloud Function のチームと連携して Spring Cloud Function GCP Adapter を開発しました。関数には標準の Java 関数を使用できるため、Google Cloud 上で実行できるようにコードを修正することなく、Spring Cloud Function アプリケーションを Cloud Functions で実行できます。

  @Bean
public Function<String, String> uppercase() {
  return value -> value.toUpperCase();
}

GitHub に Spring Cloud Function と Cloud Functions の詳細な例が掲載されています。

JVM 言語

Cloud Functions では最新の Java 11 言語の機能を使用できるだけでなく、お好みの JVM 言語(Kotlin、Groovy、Scala など)も使用できます。たとえば、以下のように Kotlin で関数を記述できます。

  class HelloWorld : HttpFunction {
  fun helloWorld(req: HttpRequest, res: HttpResponse) {
    with(res.writer) { write("Hello Kotlin World!") }
}

同じ関数を Groovy で記述すると以下のようになります。

  class HelloWorld implements HttpFunction {
  void service(HttpRequest req, HttpResponse res) {
    res.writer.write("Hello Groovy World!")
  }
}

Groovy の例に関する詳細をご確認いただけます。また GitHub にもすべての例が掲載されています(KotlinGroovyScala)。

Cloud Functions for Java 11 を今すぐお試しください

Cloud Functions for Java 11 は現在ベータ版であり、今すぐお好みの JVM 言語とフレームワークでお試しいただけます。クイック スタートガイド初めての関数の記述方法を学び、Google Cloud Platform の無料トライアルで試すことができます。技術面の詳細について知りたい場合は、こちらの Google Developers ブログの記事もご覧ください。Java 向けのオープンソース Functions Framework に関心がある場合は、ぜひプロジェクトをご覧ください。ご参加いただける場合もあります。皆さんが記述した Java 関数を目にすることを楽しみにしています。

この記事に協力してくれた Google 社員の皆さん(Éamonn McManus、Magda Zakrzewska、Sławek Walkowski、Ludovic Champenois、Katie McCormick、Grant Timmerman、Ace Nassri、Averi Kitsch、Les Vogel、Kurtis Van Gent、Ronald Laeremans、Mike Eltsufin、Dmitry Solomakha、Daniel Zou、Jason Polites、Stewart Reichling、Vinod Ramachandran)に感謝します。また、Cloud Functions のサポートに尽力していただいた Micronaut のチームと Spring Cloud Function のチームにも感謝申し上げます。

-By デベロッパー アドボケイト Ray Tsang, デベロッパー アドボケイト Guillaume Laforge