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

スポンサーリンク

GCP! GCP!

前準備

ビルドツールに Gradle を使用した Spring Boot アプリケーションを準備しておきます。形式は Executable jar とします。

また、GCP の API Manager で Cloud SQL API を有効にしておきます。

API Manager – Google Cloud SQL API (API for Cloud SQL database instance management.)

Google Cloud Platform
Google Cloud Platform では、Google と同じインフラストラクチャでアプリケーション、ウェブサイト、サービスを構築、導入、拡大することができます。

また、予めプロジェクト内に App Engine アプリケーションを作成していないと appengineDeploy 時に下記のようなエラーとなります。

ERROR: (gcloud.app.deploy) The current Google Cloud project [XXXXX] does not contain an App Engine application. Use `gcloud app create` to initialize an App Engine application within the project.

そのため、作成しておきます。例えば、

gcloud app create --region us-central

Google App Engine Gradle plugin

Spring Boot アプリケーションを App Engine Flexible に対応させるべく、Google App Engine Gradle plugin を適用します。アプリケーション本体のコードには一切手を加えません。build.gradle に追記するのみです。それから、データベースの設定を application.yml に記述している場合やデプロイ環境を環境変数で変更させたい場合は application.yml にも追記が必要です。

Google App Engine Gradle plugin
https://github.com/GoogleCloudPlatform/app-gradle-plugin

...

apply plugin: 'com.google.cloud.tools.appengine' // ADD!

...

buildscript {
  repositories {
    ...
    ...
  }
  dependencies {
    ...
    classpath 'com.google.cloud.tools:appengine-gradle-plugin:+' // ADD!
    ...
  }
}

...

repositories {
    ...
    ...
}

...

dependencies {
    ...
    compile 'com.google.cloud.sql:mysql-socket-factory-connector-j-6:+' // ADD!
    ...
}

プロファイルで application.yml を切り換えると便利です。例えば、App Engine 用に下記のような設定をしておきます。

spring:
  profiles:
    active: localhost
---
spring:
  profiles: gae
  datasource:
    url: jdbc:mysql://google/spring_boot_gcp?cloudSqlInstance=project-id:asia-northeast1:spring-boot-gcp&socketFactory=com.google.cloud.sql.mysql.SocketFactory
    username: user
    password: user1234
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect

src/main/appengine/app.yaml を追加します。

なお、ファイル名は app.yaml です。app.yml だとデプロイに失敗します。

runtime: custom
env: flex

runtime_config:
   jdk: openjdk8

オートスケールしたいならさらに下記のような追記も。

automatic_scaling:
  min_num_instances: 1
  max_num_instances: 3

src/main/docker/Dockerfile を追加します。

FROM gcr.io/google_appengine/openjdk8
VOLUME /tmp
ADD spring-boot-gcp-1.0.0-SNAPSHOT.jar app.jar
CMD [ "java","-Djava.security.egd=file:/dev/./urandom","-jar","-Dspring.profiles.active=gae","/app.jar"]

そして

gradle appengineDeploy

5, 6 分くらいでデプロイされます。

PostgreSQL

MySQL だけではなく、PostgreSQL も同様です。socketFactory を PostgreSQL 用に変更するだけですね。

build.gradle の depandencies の MySQL のところを

compile 'com.google.cloud.sql:postgres-socket-factory:1.0.3'

application.yml の MySQL のところを

jdbc:postgresql://google/spring_boot_gcp?socketFactory=com.google.cloud.sql.postgres.SocketFactory&socketFactoryArg=project-id:asia-northeast1:spring-boot-gcp

参考

Using Gradle and the App Engine Plugin
https://cloud.google.com/appengine/docs/flexible/java/using-gradle

App Engine Gradle Plugin Tasks and Properties
https://cloud.google.com/appengine/docs/flexible/java/gradle-reference

Cloud SQL Socket Factory for JDBC drivers
https://github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory