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

Google Cloud Platform (GCP)へのデプロイ

このガイドでは以下をカバーしています:

  • Googleクラウドにログイン

  • Google Cloud Functions に Function をデプロイする

  • JARをGoogle App Engine Standart にデプロイする

  • DockerイメージをGoogle App Engine Flexible Custom Runtimes にデプロイする

  • Dockerイメージを Google Cloud Run にデプロイする

  • Cloud SQLの使用

前提条件

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

本ガイドでは、 入門ガイドで開発したアプリケーションを入力とします。

手元に get-started アプリケーションがあることを確認するか、Git リポジトリをクローンします: git clone https://github.com/quarkusio/quarkus-quickstarts.git 、もしくは archive をダウンロードしてください。ソリューションは getting-started ディレクトリーにあります。

Googleクラウドにログイン

Login to Google Cloud is necessary for deploying the application. It can be done as follows:

gcloud auth login

Google Cloud Functions へのデプロイ

Quarkusは、次のエクステンションを使用して、アプリケーションをGoogle Cloud Functionsにデプロイすることをサポートしています。

各エクステンションは特定の種類のアプリケーション開発をサポートしており、それらを使用してアプリケーションを開発、パッケージ化、デプロイする方法の詳細については、特定のガイドに従ってください。

Google App Engine Standardへのデプロイ

Java 8 ランタイムはQuarkusと互換性のない独自のサーブレットエンジンを使用しているため、Java 11 ランタイムのみをカバーします。

First, make sure to have an App Engine environment initialized for your Google Cloud project, if not, initialize one via gcloud app create --project=[YOUR_PROJECT_ID].

次に、 src/main/appengine/app.yaml ファイルを作成する必要がありますが、選択したエンジンだけで最低限のものにしておきましょう。

runtime: java11

これにより、App Engineアプリケーションのデフォルトサービスが作成されます。

You can also use the new Java 17 runtime by defining runtime: java17 instead.

App Engine Standard does not support the default Quarkus' specific packaging layout, therefore, you must set up your application to be packaged as an uber-jar via your application.properties file:

quarkus.package.type=uber-jar

Then, you can choose to build the application manually or delegating that responsibility to gcloud or the Google Cloud Maven plugin.

アプリケーションを手動でビルドする

mvn clean package を使用してアプリケーションをビルドするために Maven を使用します。依存関係を含むアプリケーションのすべてのクラスを含む単一の JAR を生成します。

最後に、 gcloud を使用して、アプリケーションを App Engine サービスとしてデプロイします。

gcloud app deploy target/getting-started-1.0.0-SNAPSHOT-runner.jar

このコマンドは、アプリケーション jar をアップロードし、App Engine で起動します。

When it’s done, the output will display the URL of your application (target url), you can use it with curl or directly open it in your browser using gcloud app browse.

gcloud 経由でアプリケーションをビルドする

gcloud にアプリケーションをビルドさせることができます。これは App Engine にデプロイする最もシンプルな方法です。

Then, you can just launch gcloud app deploy in the root of your project, it will upload all your project files (the list can be reduced via the .gcloudignore file), package your JAR via Maven (or Gradle) and launch it on App Engine.

When it’s done, the output will display the URL of your application (target url), you can use it with curl or directly open it in your browser using gcloud app browse.

Google Cloud Mavenプラグインを介したアプリケーションのビルド

また、App Engine Mavenプラグインを使用して、Mavenでアプリケーションのデプロイを制御することもできます。

まず、プラグインを pom.xml に追加します。

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>appengine-maven-plugin</artifactId>
    <version>2.4.0</version>
    <configuration>
        <projectId>GCLOUD_CONFIG</projectId> (1)
        <version>gettingstarted</version>
        <artifact>${project.build.directory}/${project.artifactId}-${project.version}-runner.jar</artifact> (2)
    </configuration>
</plugin>
1 デフォルトの gcloud 設定を使用します。
2 デフォルトのJAR名を、Quarkus Mavenプラグインによって生成されたものにオーバーライドします。

その後、Mavenを使用してアプリケーションをビルドし、 mvn clean package appengine:deploy を経由してApp Engineにデプロイすることができます。

それが完了すると、出力にはアプリケーションの URL (ターゲット URL) が表示されます。curlを使うか、 gcloud app browse を使ってブラウザで直接開くことができます。

Google App Engine Flexible Custom Runtimes へのデプロイ

まずはじめに、Google Cloud プロジェクト用に App Engine 環境が初期化されていることを確認してください。もしまだであれば、 gcloud app create --project=[YOUR_PROJECT_ID] によって初期化してください。

App Engine Flexible Custom RuntimesはDockerイメージを使用してアプリケーションを実行します。

まず、プロジェクトのルートに以下の内容の app.yaml ファイルを作成します。

runtime: custom
env: flex

App Engine Flexible Custom Runtimesは、アプリケーションをDockerコンテナーとしてデプロイしますが、アプリケーション内で提供されるDockerfileのいずれかを選択してデプロイすることができます。

JVM版とネイティブ実行可能ファイル版の両方が動作します。

JVMアプリケーションをデプロイするには

  • JVMのDockerfileをプロジェクトのルートディレクトリーにコピーします: cp src/main/docker/Dockerfile.jvm Dockerfile .

  • mvn clean package を使用してアプリケーションを構築します。

ネイティブアプリケーションをデプロイするには

  • ネイティブのDockerfileをプロジェクトのルートディレクトリーにコピーします: cp src/main/docker/Dockerfile.native Dockerfile .

  • mvn clean package -Dnative を使用して、アプリケーションをネイティブ実行可能ファイルとしてビルドします。

最後に、プロジェクトのルートで gcloud app deploy を起動すると、すべてのプロジェクトファイルをアップロードし( .gcloudignore ファイルを介してリストを縮小することができます)、Dockerfile をビルドし、App Engine Flexible カスタムランタイム上で起動します。

Cloud Buildを使用してDockerイメージをビルドし、Google Container Registry(GCR)にデプロイします。

完了すると、出力にはアプリケーションの URL (ターゲット URL) が表示されます。curlを使うか、 gcloud app browse を使ってブラウザで直接開くことができます。

App Engine Flexible custom runtimes support health checks, it is strongly advised to provide them thanks to Quarkus Smallrye Health support.

Google Cloud Runへのデプロイ

Google Cloud Runでは、Google Cloud Platform内でDockerコンテナーをマネージドな方法で実行することができます。

デフォルトでは、Quarkusは8080番ポートをリッスンし、これはCloud Runのデフォルトポートでもあります。Cloud Runで定義された環境変数 PORT を使用して、QuarkusのHTTPポートをカスタマイズする必要はありません。

Cloud RunはCloud Buildを使用してDockerイメージを構築し、Google Container Registry(GCR)にデプロイします。

JVM版とネイティブ実行可能ファイル版の両方が動作します。

JVMアプリケーションをデプロイするには

  • JVMのDockerfileをプロジェクトのルートディレクトリーにコピーします: cp src/main/docker/Dockerfile.jvm Dockerfile .

  • mvn clean package を使用してアプリケーションを構築します。

ネイティブアプリケーションをデプロイするには

  • ネイティブのDockerfileをプロジェクトのルートディレクトリーにコピーします: cp src/main/docker/Dockerfile.native Dockerfile .

  • mvn clean package -Dnative を使用して、アプリケーションをネイティブ実行可能ファイルとしてビルドします。

次に、Cloud Buildのためにアップロードすべきでないファイルをgcloudに伝えるための .gcloudignore ファイルを作成します。これがない場合、デフォルトは .gitignore で、通常はパッケージ化されたアプリケーションが作成されたターゲットディレクトリーを除外します。

この例では、 src ディレクトリーだけを除外しています。

src/

その後、Cloud Buildを使ってイメージをビルドすると、アプリケーションのすべてのファイル(`.gcloudignore`fileで無視されたファイルを除く)をGoogle Cloud Storageバケットにアップロードし、DockerイメージをビルドしてGoogle Container Registry (GCR)にプッシュします。

gcloud builds submit --tag gcr.io/PROJECT-ID/helloworld
また、イメージをローカルにビルドして、公開されているDockerレジストリーにプッシュし、次のステップでこのイメージを使用することもできます。

最後に、Cloud Runを使ってアプリケーションを起動します。

gcloud run deploy --image gcr.io/PROJECT-ID/helloworld --platform managed

Cloud run will ask you questions on the service name, the region and whether unauthenticated calls are allowed. After you answer to these questions, it will deploy your application.

デプロイが完了すると、出力にはアプリケーションにアクセスするためのURLが表示されます。

Cloud SQLの使用

Google Cloud SQL provides managed instances for MySQL, PostgreSQL and Microsoft SQL Server. Quarkus has support for all three databases.

JDBCドライバーでのCloud SQLの使用

To make your applications work with Cloud SQL, you first need to use the corresponding JDBC extension, for example, for PostgreSQL, add the quarkus-jdbc-postgresql extension.

Then you need to add to your pom.xml the Cloud SQL JDBC library that provides the additional connectivity to Cloud SQL. For PostgreSQL you will need to include the following dependency:

<dependency>
    <groupId>com.google.cloud.sql</groupId>
    <artifactId>postgres-socket-factory</artifactId>
    <version>${postgres-socket-factory.version}</version>
</dependency>

Finally, you need to configure your datasource specifically to use the socket factory:

quarkus.datasource.db-kind=other (1)
quarkus.datasource.jdbc.url=jdbc:postgresql:///mydatabase (2)
quarkus.datasource.jdbc.driver=org.postgresql.Driver
quarkus.datasource.username=quarkus
quarkus.datasource.password=quarkus
quarkus.datasource.jdbc.additional-jdbc-properties.cloudSqlInstance=project-id:gcp-region:instance (3)
quarkus.datasource.jdbc.additional-jdbc-properties.socketFactory=com.google.cloud.sql.postgres.SocketFactory (4)
1 Database kind must be 'other' as we need to skip Quarkus auto-configuration.
2 The JDBC URL should not include the hostname / IP of the database.
3 We add the cloudSqlInstance additional JDBC property to configure the instance id.
4 We add the socketFactory additional JDBC property to configure the socket factory used to connect to Cloud SQL, this one is coming from the postgres-socket-factory dependency.
If you use Hibernate ORM, you also need to configure quarkus.hibernate-orm.dialect=org.hibernate.dialect.PostgreSQL10Dialect as Hibernate ORM would not be able to automatically detect the dialect of your database.
Using a PostgreSQL socket factory is not possible in dev mode at the moment due to issue #15782.

リアクティブSQLクライアントでのCloud SQLの使用

You can also use one of our reactive SQL client instead of the JDBC client. To do so with Cloud SQL, add the following dependency (adjust the classifier depending on your platform):

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-transport-native-epoll</artifactId>
    <classifier>linux-x86_64</classifier>
</dependency>

Then configure your reactive datasource with no hostname and with the Netty native transport:

quarkus.datasource.reactive.url=postgresql://:5432/db-name?host=/cloudsql/project-id:zone:db-name
quarkus.vertx.prefer-native-transport=true
This only works when your application is running inside a Google Cloud managed runtime like App Engine.

さらに詳しく

You can find a set of extensions to access various Google Cloud Services in the Quarkiverse (a GitHub organization for Quarkus extensions maintained by the community), including PubSub, BigQuery, Storage, Spanner, Firestore, Secret Manager (visit the repository for an accurate list of supported services).

これらについてのドキュメントは、 QuarkiverseのGoogle Cloud Servicesリポジトリ にあります。