Spring Boot Kotlin アプリをコンテナ化して Cloud Run にデプロイする

1. 始める前に

Google が提供する強力なイメージ ビルドツールを使用すると、Docker や Dockerfile を使用せずに、Java アプリ用に最適化された Docker コンテナ イメージを短時間で簡単にビルドして公開できます。また、Google Cloud では、ステートレス コンテナを自動的にスケーリングするマネージド コンピューティング プラットフォームである Cloud Run により、コンテナにサーバーレスをもたらします。この Codelab では、Spring Boot Kotlin アプリをコンテナ化し、Container Registry に公開して、Google Cloud でイメージをシームレスに実行することがいかに簡単であるかを説明します。

この Codelab では、Kotlin で簡単なアプリを設定する手順について説明します。ここでは、JibContainer RegistryCloud Run などの Google Cloud サービスとツールを使用する方法を示します。

前提条件

  • Java プログラミング言語とツールの基本知識
  • Linux の標準的なテキスト エディタ(Vim、Emacs、nano など)に関する知識

演習内容

  • Spring Boot Kotlin アプリを設定する。
  • 最適化された Docker イメージをビルドする。
  • イメージを Container Registry に公開します。
  • Cloud Run でコンテナ化されたアプリを実行します。

必要なもの

  • Google Cloud プロジェクト
  • Google Chrome などのブラウザ

2. 設定方法

セルフペース型の環境設定

  1. Cloud コンソールにログインして、新しいプロジェクトを作成するか、既存のプロジェクトを再利用しますGmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

プロジェクト ID を忘れないようにしてください。プロジェクト ID はすべての Google Cloud プロジェクトを通じて一意の名前にする必要があります(上記の名前はすでに使用されているので使用できません)。以降、このコードラボでは PROJECT_ID と呼びます。

  1. 次に、Google Cloud リソースを使用するために、Cloud Console で課金を有効にする必要があります。

このコードラボを実行しても、費用はほとんどかからないはずです。このチュートリアル以外で請求が発生しないように、リソースのシャットダウン方法を説明する「クリーンアップ」セクションの手順に従うようにしてください。Google Cloud の新規ユーザーは、$300 USD 分の無料トライアル プログラムをご利用いただけます。

Cloud Shell

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud 上で動作するコマンドライン環境である Cloud Shell を使用します。

Cloud Shell をアクティブにする

  1. Cloud Console で、[Cloud Shell をアクティブにする] 4292cbf4971c9786.png をクリックします。

bce75f34b2c53987.png

Cloud Shell を初めて起動する場合は、その内容を説明する中間画面(スクロールしなければ見えない範囲)が表示されます。その場合は、[続行] をクリックします(今後表示されなくなります)。この中間画面は次のようになります。

70f315d7b402b476.png

Cloud Shell のプロビジョニングと接続に少し時間がかかる程度です。

fbe3a0674c982259.png

この仮想マシンには、必要な開発ツールがすべて含まれています。仮想マシンは Google Cloud で稼働し、永続的なホーム ディレクトリが 5 GB 用意されているため、ネットワークのパフォーマンスと認証が大幅に向上しています。このコードラボでの作業のほとんどは、ブラウザまたは Chromebook から実行できます。

Cloud Shell に接続すると、すでに認証は完了しており、プロジェクトに各自のプロジェクト ID が設定されていることがわかります。

  1. Cloud Shell で次のコマンドを実行して、認証されたことを確認します。
gcloud auth list

コマンド出力

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。
gcloud config list project

コマンド出力

[core]
project = <PROJECT_ID>

上記のようになっていない場合は、次のコマンドで設定できます。

gcloud config set project <PROJECT_ID>

コマンド出力

Updated property [core/project].

3. Spring Boot アプリを初期化する

  1. Spring Initializr を使用して新しい Spring Boot アプリを生成します。
$ curl https://start.spring.io/starter.tgz \
    -d language=kotlin \
    -d dependencies=web \
    -d baseDir=kotlin-jib-cloud-run | tar -xzvf -

Initializr は、テンプレート アプリの pom.xml の依存関係に spring-boot-starter-web を自動的に追加します。

  1. テンプレート アプリのディレクトリに移動します。
$ cd kotlin-jib-cloud-run
  1. Maven を使用してアプリをビルドして実行します。
$ ./mvnw -DskipTests spring-boot:run
  1. 起動すると、ポート 8080 でリッスンが開始されます。Cloud Shell ツールバーのウェブでプレビュー アイコン 396bfd51f55afb5d.png をクリックし、[ポート 8080 でプレビュー] を選択してアプリにアクセスします。

4172e1e141daf0c1.png

  1. アプリはまだ有用な処理を行っていないため、404 レスポンスが返されます。Control+C でアプリを停止します。

4. ウェブ コントローラを追加する

  1. デモ パッケージに次の Controller クラスを作成します。
$ vi src/main/kotlin/com/example/demo/Controller.kt
    or
$ nano src/main/kotlin/com/example/demo/Controller.kt

src/main/kotlin/com/example/demo/Controller.kt

package com.example.demo

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController

@RestController
class Controller {
  
  @GetMapping("/")
  fun saySomething(): String {
    return "Kotlin app on Cloud Run, containerized by Jib!"
  }
}
  1. アプリを再ビルドして実行します。
$ ./mvnw spring-boot:run
  1. ウェブでプレビュー アイコン a6cfcaa1d2119c52.png を使用してアプリを再度確認します。今回は、「Kotlin app on Cloud Run, containerized by Jib!」というメッセージが表示されます。Control+C でアプリを停止します。

5. アプリをコンテナ化して Container Registry に公開する

Jib を使用すると、Docker を使用せずに最適化された方法でアプリをコンテナ化し、任意の Container Registry に公開できます。

  1. 続行する前に、Container Registry API を有効にする必要があります。この操作は、プロジェクトごとに 1 回行うだけで、API にアクセスできるようになります。
$ gcloud services enable containerregistry.googleapis.com
  1. Jib を実行して Docker イメージをビルドし、Container Registry に公開します。
$ ./mvnw com.google.cloud.tools:jib-maven-plugin:3.1.1:build \
    -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/kotlin-jib-cloud-run

最終的に、アプリがコンテナ化され、Container Registry に push されたことを示す次のメッセージが表示されます。

[INFO] Built and pushed image as gcr.io/PROJECT_ID/kotlin-jib-cloud-run
...
[INFO] BUILD SUCCESS

エラーが表示された場合は、$GOOGLE_CLOUD_PROJECT が Google Cloud プロジェクト ID(PROJECT_ID)に正しく設定されているかどうかを再確認します。

  1. 次に進む前に、画像が正常に公開されているかどうかを確認してください。Cloud コンソールに戻り、ナビゲーション メニューc8b4ea3c68f4c1e3.png をクリックして、[Container Registry] を選択します。

6421550ba806beab.png

38ae0ca573c3dcd.png

画像が正常に公開されたことがわかります。

c9086605411691c3.png

6. コンテナ化されたアプリを Cloud Run で実行する

Cloud Run は、コンテナにサーバーレスをもたらし、ステートレス コンテナを自動的にスケーリングします。

  1. ナビゲーション メニューc8b4ea3c68f4c1e3.png をもう一度クリックし、[Cloud Run] を選択します。

812c7c87527ebe4a.png

Cloud Run に初めてアクセスする場合は、1 回限りの設定に関する次のダイアログが表示されます。[Cloud Run の使用を開始] が表示されたらクリックします。

1b2bf05712f6150a.png

  1. [Cloud Run] ページで、[サービスを作成] をクリックします。

c0b4b980662f7807.png

  1. 次の画面で、[ソース] の下の [選択] をクリックします。ソースは Cloud Run で実行するイメージです。

2049621ae97d62ee.png

  1. ダイアログに、先ほどビルドしたイメージが表示されます。画像を選択し、[続行] をクリックします。

564367bc65caefbf.png

  1. わずか数クリックでアプリをデプロイできます。[デプロイ プラットフォーム] で [Cloud Run(フルマネージド)] を選択して、Google Cloud でサービスを完全に管理します。ロケーションに適したリージョンを選択し、[未認証の呼び出しを許可] を選択して [作成] をクリックします。これで作業は完了です。

3eb0f51d15326cac.png

イメージが完全にデプロイされると、Cloud Run ページにアプリにアクセスするための URL が表示されます。ぜひご覧ください。

8bf800dd6e2f44f2.png

最後に、アプリに期待されるメッセージが表示されます。

Kotlin app on Cloud Run, containerized by Jib!

これで、今後、新しいアプリ バージョンをデプロイする必要がある場合は、ページの [Deploy New Revision] をクリックすることで実施できます。

7. クリーンアップ

  1. 環境をクリーンアップするには、Cloud Run にデプロイされたアプリと Container Registry の公開イメージを削除する必要があります。Cloud Run に移動し、アプリを選択して [削除] をクリックします。

1dfc2f51c1b5f6e.png

  1. 同様に、[Container Registry] ページに移動してイメージを削除します。

1b724136c1655935.png

8. 完了

これで、Spring Boot Kotlin アプリをコンテナ化し、Cloud Run にデプロイできました。

Jib を使用して、Docker のインストールや Dockerfile の作成を行うことなく最適化されたコンテナ イメージをビルドし、それを Container Registry に公開しました。Jib はイメージ構築を最適化しているため、Docker に関する深い知識がなくても、Java アプリを迅速かつ効率的にコンテナ化できます。その後、数回のクリックでアプリを Cloud Run にデプロイし、すぐにサービスを開始できました。

その他の情報