Spring Boot アプリを Cloud SQL に接続する

1. 始める前に

Cloud SQL は、Google Cloud 上のリレーショナル データベースの設定、維持、運用、管理を簡単にできるようにするフルマネージド データベース サービスです。Cloud SQL は、Cloud SQL for MySQL または Cloud SQL for PostgreSQL で使用できます。

この Codelab では、Cloud SQL for MySQL インスタンスを設定し、Cloud SQL インスタンスをバックエンド ストレージとして使用するように Spring Boot アプリを更新する方法を学びます。Spring Boot Starter for Google Cloud SQL は、自動構成された DataSource を提供します。これにより、コードを最小限に変更するだけで Cloud SQL を簡単に利用できます。この Codelab では、Spring Petclinic のソースコードを使用します。

前提条件

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

演習内容

  • Spring Boot アプリで Cloud SQL を使用する。

必要なもの

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 をアクティブにする

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

55efc1aaa7a4d3ad.png

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

9c92662c6a846a5c.png

すぐにプロビジョニングが実行され、Cloud Shell に接続されます。

9f0e51b578fecce5.png

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

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. Cloud SQL for MySQL インスタンスを設定する

  1. Cloud Shell が起動したら、コマンドラインを使用して新しい Cloud SQL インスタンスを作成できます。
$ gcloud sql instances create my-instance

このオペレーションが完了すると、インスタンスを使用できるようになります。

  1. ここで、Petclinic アプリに使用するデータベースを作成します。
$ gcloud sql databases create petclinic --instance my-instance

Cloud コンソールからインスタンスにアクセスして構成することもできます。

  1. 次のコマンドを実行して、project-id:zone-id:instance-id 形式でインスタンス接続名を取得します。これは、後で Spring Boot アプリを構成するときに使用します。
$ gcloud sql instances describe my-instance | grep connectionName

4. Petclinic アプリのクローンを作成してローカルでテストする

  1. 次に、Petclinic アプリをローカルに複製します。
$ git clone https://github.com/spring-projects/spring-petclinic

$ cd spring-petclinic
  1. 正しい Java バージョンが設定されていることを確認し、Petclinic アプリをローカルで実行します。
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/

$ ./mvnw spring-boot:run
  1. Cloud Shell で [ウェブでプレビュー] 1a94d5bd10bfc072.png をクリックし、[ポート 8080 でプレビュー] を選択します。

3aca52f76c6c22a3.png

ブラウザに次のような Petclinic のホームページが表示されます。

34e0d4f1e1765560.png

  1. データを追加して、いろいろ試してみましょう。アプリはメモリ内 HyperSQL データベースを使用します。これで、HyperSQL から Cloud SQL をデータベースとして使用するように切り替わります。

5. Petclinic で Cloud SQL を使用する

Maven pom.xml ファイルを更新する

次のように pom.xml ファイルを更新します。スターターは、Cloud SQL データベースに接続するための自動構成された DataSource オブジェクトを提供します。ファイルの編集には、Vim、nano、Emacs を使用できます。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" ...>
    ...
    <!-- Add Spring Cloud GCP Dependency BOM -->
    <dependencyManagement>
        <dependencies>
          <dependency>
          <groupId>com.google.cloud</groupId>
          <artifactId>spring-cloud-gcp-dependencies</artifactId>
          <version>4.1.4</version>
          <type>pom</type>
          <scope>import</scope>
          </dependency>
      </dependencies>
    </dependencyManagement>
    <dependencies>
      ...
      <!-- Add CloudSQL Starter for MySQL -->
      <dependency>
        <groupId>com.google.cloud</groupId>
        <artifactId>spring-cloud-gcp-starter-sql-mysql</artifactId>
      </dependency>
      ...
    </dependencies>
</project>

application-mysql.properties を更新する

  1. src/main/resources/application-mysql.properties の内容を次のプロパティに置き換えます。前の手順でインスタンス接続名を設定する必要があります。

src/main/resources/application-mysql.properties

database=mysql

spring.cloud.gcp.sql.database-name=petclinic
spring.cloud.gcp.sql.instance-connection-name=YOUR_CLOUD_SQL_INSTANCE_CONNECTION_NAME

# Initialize the database since the newly created Cloud SQL database has no tables. The following flag is for Spring Boot 2.5+.
spring.sql.init.mode=always  

  1. 最後に、application.propertiesspring.profiles.active プロパティに mysql を追加して、Spring Boot アプリで Cloud SQL for MySQL プロファイルを有効にします。

src/main/resources/application.properties

# Keep the content of the file the same
...

# In the last line, add mysql to the spring.profiles.active property
spring.profiles.active=mysql

6. Cloud Shell でアプリを実行する

  1. Spring Boot プラグインを使用して、Spring Boot アプリを通常どおりに起動できます。
$ ./mvnw -DskipTests spring-boot:run
  1. アプリが起動したら、Cloud Shell ツールバーの [ウェブでプレビュー] 1a94d5bd10bfc072.png をクリックし、[ポート 8080 でプレビュー] を選択します。

3aca52f76c6c22a3.png

ブラウザに次のような Spring Petclinic のホームページが再び表示されます。

34e0d4f1e1765560.png

  1. ペットの飼い主のエントリを追加します。

省略可: Cloud SQL がデータを永続化したことを確認する

入力したデータが Cloud SQL に保存されていることを、次の図のように確認できます。パスワードの入力を求められたら、Enter キーを押します。

$ gcloud sql connect my-instance -u root
Whitelisting your IP for incoming connection for 5 minutes...done.
Enter password: <Press Enter, there is no password by default>
...
mysql> use petclinic;
mysql> select * from owners;

省略可: Cloud SQL インスタンスを削除する

アプリを停止したら、次のコマンドを使用して Cloud SQL インスタンスを削除できます。

$ gcloud sql instances delete my-instance

7. 完了

Spring Boot アプリで Cloud SQL に接続する方法を学習しました。

詳細