App Engine スタンダード環境に Spring Boot アプリをデプロイする

1. 始める前に

App Engine アプリは作成や管理が簡単で、トラフィックやデータ ストレージのニーズの変化に応じたスケーリングも簡単です。App Engine 環境では、サーバーを管理する手間がかかりません。アプリをアップロードするだけで使えるようになります。

App Engine アプリは受信トラフィックに基づいて自動的にスケーリングします。ロード バランシング、マイクロサービス、認可、SQL データベース、NoSQL データベース、メモリ キャッシュ、トラフィック分割、ロギング、検索、バージョニング、ロールアウトとロールバック、セキュリティ スキャンはすべてネイティブでサポートされており、高度なカスタマイズが可能です。

App Engine スタンダード環境App Engine フレキシブル環境では、Java、Python、PHP、NodeJS、Go などの多数のプログラミング言語がサポートされています。2 つの環境を使用することで、デベロッパーはアプリの動作を柔軟に管理できます。それぞれの環境には一定の強みがあります。詳細については、App Engine 環境の選択をご覧ください。

Spring Boot アプリを App Engine スタンダード環境にデプロイする方法を学習します。スタンダード環境は、使用されていないインスタンスはゼロまでスケールダウンされ、自動的にスケールアップされます。

前提条件

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

演習内容

  • App Engine で Spring Boot Java アプリを作成する方法

必要なもの

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

2. 設定と要件

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell

ここでは、Google Cloud で動作するコマンドライン環境である Cloud Shell を使用します。

Cloud Shell をアクティブにする

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

55efc1aaa7a4d3ad.png

Cloud Shell を初めて起動する場合は、内容を説明する中間画面が表示されます。中間画面が表示されたら、[続行] をクリックします。

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

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

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 ウェブアプリを作成する

Cloud Shell が起動したら、コマンドラインを使用して、Spring Initializr で新しい Spring Boot アプリを生成できます。

$ curl https://start.spring.io/starter.tgz \
  -d bootVersion=3.0.5 \
  -d dependencies=web \
  -d type=maven-project \
  -d baseDir=gae-standard-example | tar -xzvf -
$ cd gae-standard-example

4. Maven pom.xml を更新する

Java サーバーアプリをデプロイするには、Maven App Engine プラグインまたは Gradle App Engine プラグインを使用する方法と、war パッケージ ディレクトリをデプロイする方法の 2 つがあります。Maven App Engine プラグインを使用してアプリをデプロイします。

Maven App Engine プラグインを追加する

pom.xml を更新して、デプロイ プロセスを簡素化する Google Cloud プラグインを含めます。Vim、nano、または Emacs を使用してファイルを編集できます。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" ...>
  ...
  <build>
    <plugins>
      ...
      <plugin>
        <groupId>com.google.cloud.tools</groupId>
        <artifactId>appengine-maven-plugin</artifactId>
        <version>2.4.4</version>
        <configuration>
          <version>1</version>
          <projectId>GCLOUD_CONFIG</projectId>
        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
</project>

5. App Engine 記述子を追加

  1. アプリを App Engine スタンダード環境にデプロイするには、新しい src/main/appengine/app.yaml 記述子ファイルを作成する必要があります。
$ mkdir -p src/main/appengine/
$ touch src/main/appengine/app.yaml
  1. src/main/appengine/app.yaml ファイルを編集して、次の内容を追加します。

src/main/appengine/app.yaml

runtime: java17
instance_class: F1

6. コントローラを追加

DemoApplication.java"hello world!" を返す新しいコントローラを追加します。

src/main/java/com/example/demo/DemoApplication.java

package com.example.demo;

...

// Add imports
import org.springframework.web.bind.annotation.*;

@SpringBootApplication
public class DemoApplication {
  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }
}

// Add the controller.
@RestController
class HelloWorldController {
  @GetMapping("/")
  public String hello() {
    return "hello world!";
  }
}

7. アプリをローカルで実行する

  1. JAVA_HOME が正しい JDK バージョンに設定されていることを確認します。
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
  1. Spring Boot プラグインを使用して Spring Boot アプリを起動できます。
$ ./mvnw -DskipTests spring-boot:run
  1. アプリが起動したら、Cloud Shell ツールバーの [ウェブでプレビュー] 1a94d5bd10bfc072.png をクリックし、[ポート 8080 でプレビュー] を選択します。

3aca52f76c6c22a3.png

ブラウザのタブが開き、起動したサーバーに接続されます。

7b0d8494f647822a.png

8. アプリを App Engine にデプロイする

  1. まず、プロジェクトを初期化して、App Engine アプリを実行できるようにします。また、米国中部リージョンで実行されるようにプロジェクトを初期化します。
$ gcloud app create --region us-central
You are creating an app for project [...].
WARNING: Creating an App Engine application for a project is irreversible and the region
cannot be changed. More information about regions is at
https://cloud.google.com/appengine/docs/locations
  1. 次に、mvn appengine:deploy を実行して、アプリを App Engine スタンダード環境にデプロイします。
$ ./mvnw -DskipTests package appengine:deploy
... first time deploy may take a couple of minutes
  1. アプリがデプロイされたら、ウェブブラウザで http://<project-id>.appspot.com を開くか、Cloud Shell で次のコマンドを使用してアプリにアクセスできます。
$ gcloud app browse
... [It may print out the URL for your app]

9. クリーンアップ

App Engine アプリケーションは削除できませんが、無効にすることはできます。

Google Cloud コンソールで App EngineSettings に移動し、Disable Application を選択します。

8052c1e4ad73d70e.png

また、プロジェクト全体を削除することもできます。

$ gcloud projects delete YOUR-PROJECT-ID

10.完了

初めての App Engine ウェブアプリを記述する方法を学びました。

詳細