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

この仮想マシンには、必要なすべての開発ツールが読み込まれます。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. 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. 最後に、mysqlapplication.properties に追加して、Spring Boot アプリで Cloud SQL for MySQL プロファイルを有効にします。spring.profiles.active プロパティ:

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 に接続する方法を学習しました。

詳細