Google Cloud Platform (GCP)へのデプロイ
このガイドでは以下をカバーしています:
-
Googleクラウドにログイン
-
Google Cloud Functions に Function をデプロイする
-
JARをGoogle App Engineスタンダード環境にデプロイする
-
DockerイメージをGoogle App Engineフレキシブル環境カスタムランタイムへデプロイする
-
Dockerイメージを Google Cloud Run にデプロイする
-
Cloud SQLの使用
前提条件
このガイドを完成させるには、以下が必要です:
-
ざっと 1 hour for all modalities
-
IDE
-
JDK 17+がインストールされ、
JAVA_HOME
が適切に設定されていること -
Apache Maven 3.9.9
-
使用したい場合は、 Quarkus CLI
-
Google Cloudのアカウント 。無料アカウントでも大丈夫です。
本ガイドでは、 入門ガイドで開発したアプリケーションを入力とします。
手元に get-started アプリケーションがあることを確認するか、Git リポジトリをクローンします: git clone https://github.com/quarkusio/quarkus-quickstarts.git
、もしくは archive をダウンロードしてください。ソリューションは getting-started
ディレクトリーにあります。
Google Cloud Functions へのデプロイ
Quarkusは、次のエクステンションを使用して、アプリケーションをGoogle Cloud Functionsにデプロイすることをサポートしています。
-
Google Cloud Functions: Google Cloud Functions APIを使用して関数を構築
-
Google Cloud FunctionsのHTTPバインディング :Quarkus HTTP API:Quarkus REST(旧RESTEasy Reactive、Jakarta REST実装)、Undertow(サーブレット)、Vert.x Web、 Funqy HTTP を使用して関数を構築
-
Funqy Google Cloud Functions: Funqyを使って関数を構築
各エクステンションは特定の種類のアプリケーション開発をサポートしており、それらを使用してアプリケーションを開発、パッケージ化、デプロイする方法の詳細については、特定のガイドに従ってください。
Google App Engineスタンダード環境へのデプロイ
まずはじめに、Google Cloud プロジェクト用に App Engine 環境が初期化されていることを確認してください。もしまだであれば、 gcloud app create --project=[YOUR_PROJECT_ID]
で初期化してください。
次に、 src/main/appengine/app.yaml
ファイルを作成する必要がありますので、選択したエンジンのみの最低限のものにしておきましょう。
runtime: java21
これにより、App Engineアプリケーションのデフォルトサービスが作成されます。
App Engineがサポートする別のJavaランタイムを使用することもできます。たとえば、Java 17の場合は、代わりに |
App Engineスタンダード環境は、デフォルトのQuarkus固有のパッケージングレイアウトをサポートしていないため、アプリケーションをuber-jarとしてパッケージングするよう、 application.properties
ファイルを設定する必要があります。
quarkus.package.jar.type=uber-jar
次に、アプリケーションを手動で構築するか、その責任を gcloud
または Google Cloud Maven プラグインに任せるかを選択することができます。
アプリケーションを手動でビルドする
mvn clean package
を使用してアプリケーションをビルドするために Maven を使用します。依存関係を含むアプリケーションのすべてのクラスを含む単一の JAR を生成します。
最後に、 gcloud
を使用して、アプリケーションを App Engine サービスとしてデプロイします。
gcloud app deploy target/getting-started-1.0.0-SNAPSHOT-runner.jar
このコマンドは、アプリケーション jar をアップロードし、App Engine で起動します。
コマンド実行が完了すると、出力にはアプリケーションの URL (ターゲット URL) が表示されます。curlを使うか、 gcloud app browse
を使ってブラウザで直接アプリケーションを開くことができます。
gcloud 経由でアプリケーションをビルドする
gcloud
にアプリケーションをビルドさせることができます。これは App Engine にデプロイする最もシンプルな方法です。
最後に、プロジェクトのルートで gcloud app deploy
を実行すると、すべてのプロジェクトファイルをアップロードし( .gcloudignore
ファイルを介してリストを縮小することができます)、Maven(または Gradle)で JAR をパッケージして、App Engine で起動することができます。
コマンド実行が完了すると、出力にはアプリケーションの URL (ターゲット URL) が表示されます。curlを使うか、 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.7.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フレキシブル環境カスタムランタイムへのデプロイ
まずはじめに、Google Cloud プロジェクト用に App Engine 環境が初期化されていることを確認してください。もしまだであれば、 gcloud app create --project=[YOUR_PROJECT_ID]
によって初期化してください。
App Engineフレキシブル環境カスタムランタイムはDockerイメージを使用してアプリケーションを実行します。
まず、プロジェクトのルートに以下の内容の app.yaml
ファイルを作成します。
runtime: custom
env: flex
App Engineフレキシブル環境カスタムランタイムは、アプリケーションを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 カスタム ランタイムは ヘルス チェック をサポートします。 Quarkus SmallRye Health サポートを用いてヘルス チェックを提供することを強くお勧めします。 |
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
Cloud run から、サービス名、リージョン、認証されていない呼び出しが許可されているかどうかについて質問されます。これらの質問に答えると、アプリケーションがデプロイされます。
デプロイが完了すると、出力にはアプリケーションにアクセスするためのURLが表示されます。
Cloud Runは ヘルスチェック をサポートしています。 Quarkus SmallRye Health サポートにより、ヘルスチェックを行うことを強くお勧めします。 |
Cloud SQLの使用
Google Cloud SQLは、MySQL、PostgreSQL、Microsoft SQL Serverのマネージドインスタンスを提供します。Quarkusはこの3つのデータベースをサポートしています。
JDBCドライバーでのCloud SQLの使用
アプリケーションをCloud SQLで動作させるには、まず対応するJDBCエクステンションを使用する必要があります。例えば、PostgreSQLの場合は、 quarkus-jdbc-postgresql
エクステンションを追加します。
次に、Cloud SQLへの追加の接続性を提供するCloud SQL JDBCライブラリを pom.xml
に追加する必要があります。PostgreSQLの場合は、以下の依存関係を追加する必要があります。
<dependency>
<groupId>com.google.cloud.sql</groupId>
<artifactId>postgres-socket-factory</artifactId>
<version>${postgres-socket-factory.version}</version>
</dependency>
最後に、ソケットファクトリを使用するために、データソースを特別に設定する必要があります。
quarkus.datasource.db-kind=postgresql
quarkus.datasource.jdbc.url=jdbc:postgresql:///mydatabase (1)
quarkus.datasource.username=quarkus
quarkus.datasource.password=quarkus
quarkus.datasource.jdbc.additional-jdbc-properties.cloudSqlInstance=project-id:gcp-region:instance (2)
quarkus.datasource.jdbc.additional-jdbc-properties.socketFactory=com.google.cloud.sql.postgres.SocketFactory (3)
1 | JDBCのURLには、データベースのホスト名/IPを含めないようにしてください。 |
2 | インスタンスIDを構成するために、 cloudSqlInstance JDBCプロパティを追加しています。 |
3 | socketFactory additional JDBC プロパティを追加して、Cloud SQL への接続に使用するソケットファクトリを構成します。このプロパティは postgres-socket-factory の依存関係に由来します。 |
#15782の問題により、現時点ではdevモードではPostgreSQLのソケットファクトリを使用することはできません。 |
リアクティブSQLクライアントでのCloud SQLの使用
JDBCクライアントの代わりに、私達のリアクティブSQLクライアントの1つを使用することもできます。Cloud SQLでこれを行うには、以下の依存関係を追加してください(プラットフォームに応じて分類子を調整してください)。
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-transport-native-epoll</artifactId>
<classifier>linux-x86_64</classifier>
</dependency>
次に、リアクティブデータソースをホスト名なし、Nettyネイティブトランスポートで設定します。
quarkus.datasource.reactive.url=postgresql://:5432/db-name?host=/cloudsql/project-id:zone:db-name
quarkus.vertx.prefer-native-transport=true
これは、アプリケーションがApp EngineなどのGoogle Cloudマネージドランタイム内で実行されている場合にのみ機能します。 |
ネイティブ実行可能ファイルでのCloud SQLの使用
ネイティブ実行可能ファイルを生成する場合は、 jnr.ffi.provider.jffi.NativeFinalizer$SingletonHolder
をランタイム初期化済としてマークする必要があります。
quarkus.native.additional-build-args=--initialize-at-run-time=jnr.ffi.provider.jffi.NativeFinalizer$SingletonHolder
さらに、 com.google.cloud.sql:postgres-socket-factory:1.17.0
からは、 com.kenai.jffi.internal.Cleaner
を実行時初期化としてマークする必要があります。
quarkus.native.additional-build-args=--initialize-at-run-time=jnr.ffi.provider.jffi.NativeFinalizer$SingletonHolder\\,com.kenai.jffi.internal.Cleaner
さらに詳しく
PubSub、BigQuery、Storage、Spanner、Firestore、Secret Managerなど、さまざまなGoogle Cloud Servicesにアクセスするためのエクステンションのセットが、Quarkiverse(コミュニティによって維持されているQuarkusエクステンションのためのGitHub organization)にあります(サポートされているサービスの正確なリストについては、リポジトリをご覧ください)。
Quarkiverse Google Cloud Services のドキュメントを参照してください。