Google Compute Engine で動作する Spring Boot アプリケーションと Google Cloud SQL との連携

スポンサーリンク

GCP! GCP!

Cloud SDK

ローカルマシンからコマンドで Compute Engine と Cloud SQL を制御できるように、まずは Google Cloud SDK をインストールしておきます。ローカルマシンは、Ubuntu 16.04.2 です。

Cloud SDK
https://cloud.google.com/sdk/downloads

ダウンロードし、インストールスクリプトを実行し、初期化。

wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-161.0.0-linux-x86_64.tar.gz
tar zxvf google-cloud-sdk-161.0.0-linux-x86_64.tar.gz 
mv google-cloud-sdk ~/
cd ~/google-cloud-sdk/
 ./install.sh
source ~/.bashrc
./bin/gcloud init

初期化中、Compute Engine の設定では、asia-northeast1-a を設定しました。

[5] asia-northeast1-a

バージョンの確認。

gcloud -v
Google Cloud SDK 161.0.0
bq 2.0.24
core 2017.06.26
gcloud 
gsutil 4.26

Cloud SQL

gcloud で Cloud SQL のインスタンスを作成してみます。今回は MySQL 5.7 で、asia-northeast1 リージョンに作成しました。インスタンス名は spring-boot-gcp としてみました。

なお、Cloud SQL のインスタンス名は一度作成して削除すると、1週間程は再利用できないので注意が必要です。

Deleting Instances  |  Cloud SQL for MySQL  |  Google Cloud
gcloud sql instances create spring-boot-gcp --region=asia-northeast1 --database-version=MYSQL_5_7 --tier=db-n1-standard-1

数分で作成されます。

Creating Cloud SQL instance...done.                                                                                                                        
Created 
https://www.googleapis.com/sql/v1beta4/projects/xxx/instances/spring-boot-gcp
. NAME REGION TIER ADDRESS STATUS spring-boot-gcp asia-northeast1 db-n1-standard-1 x.x.x.x RUNNABLE

user という名前のユーザーを作成してみます。

gcloud sql users create user % --instance=spring-boot-gcp --password=user1234

結果、

Creating Cloud SQL user...done.                                                                                                                            
Created user [user].

spring_boot_gcp という名前のデータベースを作成してみます。

gcloud sql databases create spring_boot_gcp --instance=spring-boot-gcp

結果、

Creating Cloud SQL database...done.                                                                                                                        
Created database [spring_boot_gcp].
instance: spring-boot-gcp
name: spring_boot_gcp
project: xxx

Compute Engine

gcloud で Compute Engine のインスタンスを作成してみます。まず、Compute Engine のマシンタイプのリストを表示してみます。今回はその中で一番スペックが低くて安価な f1-micro を使用します。

gcloud compute machine-types list
NAME            ZONE                    CPUS  MEMORY_GB  DEPRECATED
...
f1-micro        asia-northeast1-a       1     0.60
...

Compute Engine のイメージのリストを表示してみます。今回はその中で Ubuntu 16.04 を使用します。

gcloud compute images list
NAME                                              PROJECT            FAMILY                    DEPRECATED  STATUS
...
ubuntu-1604-xenial-v20170619a                     ubuntu-os-cloud    ubuntu-1604-lts                       READY
...

実際に gcloud で Compute Engine のインスタンスを作成します。その際、Could SQL を有効に設定しておきます。

gcloud compute instances create spring-boot-gcp \
      --machine-type=f1-micro \
      --image-family ubuntu-1604-lts --image-project ubuntu-os-cloud \
      --scopes=default,sql,sql-admin

なお、gcloud init 時に Compute Engine のゾーン設定を行っていると、zone オプションは必要ありません。

--zone asia-northeast1-a

インスタンスが作成されたら、gcloud を使用した SSH で接続してみます。

gcloud compute ssh spring-boot-gcp

Spring Boot アプリケーションを実行できるように OpenJDK 8 をインストールしておきます。ついでに JAVA_HOME の設定もしています。

sudo apt-get update
sudo apt-get -y install openjdk-8-jdk
sudo sh -c "echo 'export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64' >> /etc/profile.d/jdk.sh"
sudo sh -c "echo 'export PATH=\$JAVA_HOME/bin:\$PATH' >> /etc/profile.d/jdk.sh"
source /etc/profile.d/jdk.sh

Compute Engine と Cloud SQL を接続するための Cloud SQL Proxy を Compute Engine で動作させます。なお、instance の値は、インスタンス名ではなく、インスタンス接続名 (プロジェクト名:リージョン名:インスタンス名) です。

wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64
mv cloud_sql_proxy.linux.amd64 cloud_sql_proxy
chmod +x cloud_sql_proxy
./cloud_sql_proxy -instances=xxxxx:asia-northeast1:spring-boot-gcp=tcp:3306 &

本番だと、cloud_sql_proxy を Systemd 等でサービス化することになるかと思います。

Spring Boot アプリケーション

MySQL と連携するアプリケーションを作成しておきます。application.yml は例えば下記のような感じです。

spring:
  profiles: localhost
  datasource:
    url: jdbc:mysql://localhost:3306/spring_boot_gcp
    username: user
    password: user1234
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect

アプリケーションをビルドし、成果物の jar ファイルを gcloud を使用して SCP で Compute Engine に送信します。

gcloud compute scp ~/IdeaProjects/spring-boot-gcp/build/libs/spring-boot-gcp-1.0.0-SNAPSHOT.jar  spring-boot-gcp:/home/hirooka/

Compute Engine 上で java -jar spring-boot-gcp-1.0.0-SNAPSHOT.jar コマンドを実行し、アプリケーションが起動し、Cloud SQL と連携して動作すれば OK です。localhost の TCP:3306 は Cloud SQL Proxy と接続され、Cloud Proxy SQL が Cloud SQL との接続をよろしくやってくれるということですね。

なお、本番では Spring Boot の jar ファイルは、Systemd 等でサービス化することになるかと思います。

おわりに

インスタンスを稼働させておくとお金がかかるので最後に削除しておきます。

gcloud compute instances delete spring-boot-gcp
gcloud sql instances delete spring-boot-gcp