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

Quarkus REST、Undertow、またはReactive Routesを使用したGoogle Cloud Functions(サーバーレス)

quarkus-google-cloud-functions-http エクステンションを使用すると、Quarkus REST(Jakarta REST)、Undertow(サーブレット)、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アーカイブ をダウンロードします。

ソリューションは google-cloud-functions-http-quickstart ディレクトリ にあります。

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

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

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

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

Quarkus CLIのインストールと使用方法の詳細については、 Quarkus CLI ガイドを参照してください。

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

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

Windowsユーザーの場合:

  • cmdを使用する場合、(バックスラッシュ \ を使用せず、すべてを同じ行に書かないでください)。

  • Powershellを使用する場合は、 -D パラメータを二重引用符で囲んでください。例: "-DprojectArtifactId=google-cloud-functions-http"

Google Cloudにログイン

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

gcloud auth login

エンドポイントの作成

このサンプルプロジェクトでは、Quarkus REST(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 Quarkus REST";
    }
}

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

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=java21 を使用することで、Java 21ランタイムに切り替えることができます。
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 にデプロイすることができます。

関連コンテンツ