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アプリケーションのデフォルトサービスが作成されます。
You can also use another Java runtime supported by App Engine, for example, for Java 17, use |
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 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
Cloud run から、サービス名、リージョン、認証されていない呼び出しが許可されているかどうかについて質問されます。これらの質問に答えると、アプリケーションがデプロイされます。
デプロイが完了すると、出力にはアプリケーションにアクセスするためのURLが表示されます。
Cloud Run supports health checks, it is strongly advised to provide them thanks to Quarkus SmallRye Health support. |
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の使用
When generating native executables, you must mark jnr.ffi.provider.jffi.NativeFinalizer$SingletonHolder
as runtime initialized.
quarkus.native.additional-build-args=--initialize-at-run-time=jnr.ffi.provider.jffi.NativeFinalizer$SingletonHolder
Additionally, starting with com.google.cloud.sql:postgres-socket-factory:1.17.0
, you must also mark com.kenai.jffi.internal.Cleaner
as runtime initialized.
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)にあります(サポートされているサービスの正確なリストについては、リポジトリをご覧ください)。
You can find some documentation about them in the Quarkiverse Google Cloud Services documentation.