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 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell

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

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 を有効にする必要があります。これは、API にアクセスできるようにするために各プロジェクトに 1 回のみ行う必要があります。
$ 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 に初めてアクセスする場合は、次のダイアログが表示され、初回設定を行います。[Cloud Run の使用を開始する] が表示されたら、クリックします。

1b2bf05712f6150a.png

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

c0b4b980662f7807.png

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

2049621ae97d62ee.png

  1. ダイアログには、以前にビルドしたイメージが表示されます。イメージを選択して [続行] をクリックします。

564367bc65caefbf.png

  1. アプリのデプロイは、あと数回クリックするだけで完了します。[Deployment platform] で [Cloud Run (fully managed)] を選択すると、Google Cloud でサービスが完全に管理されます。ロケーションに適したリージョンを選択し、[未認証の呼び出しを許可する] を選択して、[作成] をクリックします。これを探してた!

3eb0f51d15326cac.png

イメージが完全にデプロイされると、Cloud Run ページにアプリにアクセスするための URL が表示されます。確認してみましょう。

8bf800dd6e2f44f2.png

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

Kotlin app on Cloud Run, containerized by Jib!

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

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 にデプロイして、すぐにサービスを開始しました。

その他の情報