The English version of quarkus.io is the official project site. Translated sites are community supported on a best-effort basis.

Google Cloud Functions (Serverless) with RESTEasy, Undertow, or Reactive Routes

quarkus-google-cloud-functions-http エクステンションは、RESTEasy Reactive (Jakarta REST), Undertow (Servlet), Reactive Routes, Funqy HTTP でマイクロサービスを書き、これらのマイクロサービスをGoogle Cloud Functionsのランタイムにデプロイできるようにするものです。

Google Cloud Functionsのデプロイメント1つで、Jakarta REST、Servlet、Reactive Routes、Funqy HTTP エンドポイントをいくつでも表すことができます。

この技術は、previewと考えられています。

preview では、下位互換性やエコシステムでの存在は保証されていません。具体的な改善には設定や API の変更が必要になるかもしれませんが、 stable になるための計画は現在進行中です。フィードバックは メーリングリストGitHub の課題管理 で受け付けています。

とりうるステータスの完全なリストについては、 FAQの項目 を参照してください。

前提条件

このガイドを完成させるには、以下が必要です:

ソリューション

このガイドでは、サンプルプロジェクトを生成し、Jakarta REST API、Servlet API、Reactive Routes、またはFunqy HTTP APIで書かれた3つのHTTPエンドポイントを作成する方法を説明します。ビルドが完了したら、プロジェクトをGoogle Cloudにデプロイすることができるようになります。

これらの手順を順にすべて実行しない場合、完成したサンプルを以下で確認できます。

Gitレポジトリをクローンするか git clone https://github.com/quarkusio/quarkus-quickstarts.gitアーカイブ をダウンロードします。

The solution is located in the google-cloud-functions-http-quickstart directory.

Maven デプロイメントプロジェクトの作成

quarkus-google-cloud-functions-http のエクステンションを持つアプリケーションを作成します。以下のMavenコマンドで作成することができます:

コマンドラインインタフェース
quarkus create app org.acme:google-cloud-functions-http \
    --extension='google-cloud-functions-http,resteasy-reactive-jackson,undertow,reactive-routes,funqy-http' \
    --no-code
cd google-cloud-functions-http

Gradleプロジェクトを作成するには、 --gradle または --gradle-kotlin-dsl オプションを追加します。

For more information about how to install and use the Quarkus CLI, see the Quarkus CLI guide.

Maven
mvn io.quarkus.platform:quarkus-maven-plugin:3.4.1:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=google-cloud-functions-http \
    -Dextensions='google-cloud-functions-http,resteasy-reactive-jackson,undertow,reactive-routes,funqy-http' \
    -DnoCode
cd google-cloud-functions-http

Gradleプロジェクトを作成するには、 -DbuildTool=gradle または -DbuildTool=gradle-kotlin-dsl オプションを追加します。

Windowsユーザーの場合:

  • If using cmd, (don’t use backward slash \ and put everything on the same line)

  • If using Powershell, wrap -D parameters in double quotes e.g. "-DprojectArtifactId=google-cloud-functions-http"

Google Cloudにログイン

アプリケーションのデプロイにはGoogle Cloudへのログインが必要で、以下のように行います:

gcloud auth login

エンドポイントの作成

今回のサンプルプロジェクトでは、RESTEasy Reactive(Jakarta REST)用、Undertow(Servlet)用、Reactive routes用、Funqy HTTP 用の4つのエンドポイントを作成することにします。

これらの様々なエンドポイントは、デモンストレーションのためのものです。実際のアプリケーションでは、これらの技術の中から1つを選び、それにこだわるべきです。

各タイプのエンドポイントが不要な場合は、対応するエクステンションを pom.xml から削除することができます。

Quarkusは、Cloud Functionsの第1世代と第2世代をサポートしています。Cloud Functions gen 2の概要については、Google Cloud Functionsのドキュメントの このページを 参照してください。gen 2を使用するには、 --gen2 パラメータを追加する必要があります。

Jakarta RESTエンドポイント

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/hello")
public class GreetingResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "Hello from RESTEasy Reactive";
    }
}

サーブレットエンドポイント

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet(name = "ServletGreeting", urlPatterns = "/servlet/hello")
public class GreetingServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setStatus(200);
        resp.addHeader("Content-Type", "text/plain");
        resp.getWriter().write("hello");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getReader().readLine();
        resp.setStatus(200);
        resp.addHeader("Content-Type", "text/plain");
        resp.getWriter().write("hello " + name);
    }
}

Reactive Routesエンドポイント

import static io.quarkus.vertx.web.Route.HttpMethod.GET;

import io.quarkus.vertx.web.Route;
import io.vertx.ext.web.RoutingContext;

public class GreetingRoutes {
    @Route(path = "/vertx/hello", methods = GET)
    void hello(RoutingContext context) {
        context.response().headers().set("Content-Type", "text/plain");
        context.response().setStatusCode(200).end("hello");
    }
}

Funqy HTTP エンドポイント

import io.quarkus.funqy.Funq;

public class GreetingFunqy {
    @Funq
    public String funqy() {
        return "Make it funqy";
    }
}

ビルドとGoogle Cloudへのデプロイ

Google Cloud FunctionのデプロイにはシングルJARが必要なため、Quarkusでは強制的に uber-jar タイプのパッケージを作成しています。

標準の mvn clean package コマンドを使用して、アプリケーションをパッケージ化します。前述のコマンドの結果、 target/deployment ディレクトリ内に、プロジェクトのクラスと依存関係を含む単一の JAR ファイルが作成されます。

そして、 gcloud を使って、機能を Google Cloud にデプロイすることができるようになります。

ここではJava 17ランタイムを使用しますが、デプロイコマンドで --runtime=java17 の代わりに --runtime=java11 を使用することで、Java 11ランタイムに切り替えることが可能です。
gcloud functions deploy quarkus-example-http \
  --entry-point=io.quarkus.gcp.functions.http.QuarkusHttpFunction \
  --runtime=java17 --trigger-http --allow-unauthenticated --source=target/deployment

このクラスはCloud FunctionsとQuarkusを統合するクラスであるため、エントリーポイントは常に io.quarkus.gcp.functions.http.QuarkusHttpFunction に設定する必要があります。

このコマンドを初めて起動したときには、以下のようなエラーメッセージが表示されることがあります:

ERROR: (gcloud.functions.deploy) OperationError: code=7, message=Build Failed: Cloud Build has not been used in project <project_name> before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/cloudbuild.googleapis.com/overview?project=<my-project> then retry.

これは、Cloud Buildがまだ有効化されていないことを意味します。このエラーを解決するには、エラーに表示されているURLを開き指示に従った後、数分待ってからコマンドを再試行してください。

このコマンドは、作成したCloud Functions 関数をトリガーするための httpsTrigger.url を出力します。

そして、エンドポイントを経由して呼び出すことができます:

  • Jakarta RESTの場合: {httpsTrigger.url}/hello

  • サーブレットの場合: {httpsTrigger.url}/servlet/hello

  • リアクティブルートの場合: {httpsTrigger.url}/vertx/hello

  • Funqyの場合: {httpsTrigger.url}/funqy

ローカルでのテスト

関数をローカルでテストする最も簡単な方法は、Cloud Function invoker JAR を使用することです。

以下のコマンドでMaven経由でダウンロードできます:

mvn dependency:copy \
  -Dartifact='com.google.cloud.functions.invoker:java-function-invoker:1.3.0' \
  -DoutputDirectory=.

invokerを使用する前に、mvn package で関数をビルドする必要があります。

そして、それを使ってローカルに機能を立ち上げることができます。

java -jar java-function-invoker-1.3.0.jar \
  --classpath target/deployment/google-cloud-functions-http-1.0.0-SNAPSHOT-runner.jar \
  --target io.quarkus.gcp.functions.http.QuarkusHttpFunction
--classpath パラメーターには、関数クラスとQuarkus関連のすべてのクラスを含む、先の手順でパッケージ化されたJARを指定する必要があります。

エンドポイントは http://localhost:8080 で利用できます。

次のステップ?

Google Cloud Functions Funqy バインディング を使用すると、プロバイダに依存しない Service as a Service フレームワークである Funqy を使用することができ、HTTP 関数や Background 関数を Google Cloud にデプロイすることができます。