Spring-Boot + KotlinのWebアプリケーションをGoogleAppEngine(GAE)のスタンダード環境へデプロイする




それでは味気ないので、今回はSPRING INITIALIZRで作ったプロジェクトをGAE環境へデプロイしました。




Spring Bootの雛形作成

まずはSpringBootの雛形をSPRING INITIALIZRのサイトをcurlで叩いて作成します。

  • dependencies: web
  • language: kotlin
  • packaging: war
$ curl -s https://start.spring.io/starter.tgz -d dependencies=web -d language=kotlin -d packaging=war | tar -xzvf -
x mvnw
x .mvn/
x .mvn/wrapper/
x src/
x src/main/
x src/main/kotlin/
x src/main/kotlin/com/
x src/main/kotlin/com/example/
x src/main/kotlin/com/example/demo/
x src/main/resources/
x src/main/resources/static/
x src/main/resources/templates/
x src/test/
x src/test/kotlin/
x src/test/kotlin/com/
x src/test/kotlin/com/example/
x src/test/kotlin/com/example/demo/
x .gitignore
x .mvn/wrapper/maven-wrapper.jar
x .mvn/wrapper/maven-wrapper.properties
x mvnw.cmd
x pom.xml
x src/main/kotlin/com/example/demo/DemoApplication.kt
x src/main/kotlin/com/example/demo/ServletInitializer.kt
x src/main/resources/application.properties
x src/test/kotlin/com/example/demo/DemoApplicationTests.kt



  • spring-boot-starter-webからjul-to-slf4jとspring-boot-starter-tomcatを除外
  • javax.servlet-apiのバージョンを3.1.0に固定
  • spring-boot-starter-tomcatの依存を削除
  • pluginにappengine-maven-pluginを追加
        <!-- ココを追加 -->
        <!-- 追加ココまで -->
<!-- ココを追加 -->
<!-- 追加ココまで -->
<!-- 消す
    <!-- ココを追加 -->
    <!-- 追加ココまで -->

gcloud initで初期化

事前にCLOUD SDKを導入してください。

configuration nameProject IDspring-boot-demo-20180122にしています。
Project IDは入力するタイミングがわかりづらいので注意です。

$ gcloud init
Welcome! This command will take you through the configuration of gcloud.

Settings from your current configuration [api-project-sample-test02] are:
  account: example@gmail.com
  disable_usage_reporting: 'False'
  project: api-project-sample-test02

Pick configuration to use:
 [1] Re-initialize this configuration [api-project-sample-test02] with new settings 
 [2] Create a new configuration
 [3] Switch to and re-initialize existing configuration: [default]
Please enter your numeric choice:  2

Enter configuration name. Names start with a lower case letter and 
contain only lower case letters a-z, digits 0-9, and hyphens '-':  spring-boot-demo-20180122
Your current configuration has been set to: [spring-boot-demo-20180122]

You can skip diagnostics next time by using the following flag:
  gcloud init --skip-diagnostics

Network diagnostic detects and fixes local network connection issues.
Checking network connection...done.                                                                                                                                                                        
Reachability Check passed.
Network diagnostic (1/1 checks) passed.

Choose the account you would like to use to perform operations for 
this configuration:
 [1] example@gmail.com
 [2] Log in with a new account
Please enter your numeric choice:  1

You are logged in as: [example@gmail.com].

Pick cloud project to use: 
 [1] api-project-sample-test
 [2] api-project-sample-test01
 [3] api-project-sample-test02
 [4] Create a new project
Please enter numeric choice or text value (must exactly match list 
item):  4

Enter a Project ID. Note that a Project ID CANNOT be changed later.
Project IDs must be 6-30 characters (lowercase ASCII, digits, or
hyphens) in length and start with a lowercase letter. spring-boot-demo-20180122
Your current project has been set to: [spring-boot-demo-20180122].

Not setting default zone/region (this feature makes it easier to use
[gcloud compute] by setting an appropriate default value for the
--zone and --region flag).
See https://cloud.google.com/compute/docs/gcloud-compute section on how to set
default compute region and zone manually. If you would like [gcloud init] to be
able to do this for you the next time you run it, make sure the
Compute Engine API is enabled for your project on the
https://console.developers.google.com/apis page.

Your Google Cloud SDK is configured and ready to use!

* Commands that require authentication will use example@gmail.com by default
* Commands will reference project `spring-boot-demo-20180122` by default
Run `gcloud help config` to learn how to change individual settings

This gcloud configuration is called [spring-boot-demo-20180122]. You can create additional configurations if you work with multiple accounts and/or projects.
Run `gcloud topic configurations` to learn more.

Some things to try next:

* Run `gcloud --help` to see the Cloud Platform services you can interact with. And run `gcloud help COMMAND` to get help on any gcloud command.
* Run `gcloud topic -h` to learn about advanced features of the SDK like arg files and output formatting

gcloud app createでアプリケーションを作成


$ gcloud app create
You are creating an app for project [spring-boot-demo-20180122].
WARNING: Creating an App Engine application for a project is irreversible and the region
cannot be changed. More information about regions is at

Please choose the region where you want your App Engine application 

 [1] europe-west2  (supports standard and flexible)
 [2] us-central    (supports standard and flexible)
 [3] europe-west   (supports standard and flexible)
 [4] europe-west3  (supports standard and flexible)
 [5] us-east1      (supports standard and flexible)
 [6] us-east4      (supports standard and flexible)
 [7] asia-northeast1 (supports standard and flexible)
 [8] asia-south1   (supports standard and flexible)
 [9] australia-southeast1 (supports standard and flexible)
 [10] southamerica-east1 (supports standard and flexible)
 [11] northamerica-northeast1 (supports standard and flexible)
 [12] cancel
Please enter your numeric choice:  7

Creating App Engine application in project [spring-boot-demo-20180122] and region [asia-northeast1]....done.                                                                                               
Success! The app is now created. Please use `gcloud app deploy` to deploy your first app.


mvn appengine:run

ただし、途中でon project demo: Dev App Server does not support App Engine Flexible Environment applications.というエラーがでます。

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] --- maven-war-plugin:2.6:war (default-war) @ demo ---
[INFO] Packaging webapp
[INFO] Assembling webapp [demo] in [/Users/tgoto/example/target/demo-0.0.1-SNAPSHOT]
[INFO] Processing war project
[INFO] Webapp assembled in [342 msecs]
[INFO] Building war: /Users/tgoto/example/target/demo-0.0.1-SNAPSHOT.war
[INFO] --- spring-boot-maven-plugin:1.5.9.RELEASE:repackage (default) @ demo ---
[INFO] <<< appengine-maven-plugin:1.3.1:run (default-cli) < package @ demo <<<
[INFO] --- appengine-maven-plugin:1.3.1:run (default-cli) @ demo ---
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12.241 s
[INFO] Finished at: 2018-01-21T20:24:57+09:00
[INFO] Final Memory: 51M/732M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.google.cloud.tools:appengine-maven-plugin:1.3.1:run (default-cli) on project demo: Dev App Server does not support App Engine Flexible Environment applications. -> [Help 1]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException




  • ディレクトリを作成します
mkdir -p src/main/webapp/WEB-INF
  • 作ったディレクトリに移動します
cd src/main/webapp/WEB-INF
  • appengine-web.xmlを取得します。
curl -O https://raw.githubusercontent.com/GoogleCloudPlatform/getting-started-java/master/appengine-standard-java8/kotlin-springboot-appengine-standard/src/main/webapp/WEB-INF/appengine-web.xml
  • logging.propertiesを取得します。
curl -O https://raw.githubusercontent.com/GoogleCloudPlatform/getting-started-java/master/appengine-standard-java8/kotlin-springboot-appengine-standard/src/main/webapp/WEB-INF/logging.properties


$ ls -l
total 16
-rw-r--r--  1 tgoto  713033059   885  1 21 20:26 appengine-web.xml
-rw-r--r--  1 tgoto  713033059  1027  1 21 20:27 logging.properties


mvn appengine:run


[INFO] GCLOUD: 2018-01-21 20:28:40.503:INFO:oejs.Server:main: Started @4831ms
[INFO] GCLOUD: 1 21, 2018 11:28:40 午前 com.google.appengine.tools.development.AbstractModule startup
[INFO] GCLOUD: 情報: Module instance default is running at http://localhost:8080/
[INFO] GCLOUD: 1 21, 2018 11:28:40 午前 com.google.appengine.tools.development.AbstractModule startup
[INFO] GCLOUD: 情報: The admin console is running at http://localhost:8080/_ah/admin
[INFO] GCLOUD: 1 21, 2018 8:28:40 午後 com.google.appengine.tools.development.DevAppServerImpl doStart
[INFO] GCLOUD: 情報: Dev App Server is now running


$ mvn appengine:deploy


[INFO] GCLOUD: #============================================================#
[INFO] GCLOUD: #= Uploading 42 files to Google Cloud Storage               =#
[INFO] GCLOUD: #============================================================#
[INFO] GCLOUD: File upload done.
[INFO] GCLOUD: Updating service [default]...
[INFO] GCLOUD: .............done.
[INFO] GCLOUD: Updating service [default]...
[INFO] GCLOUD: Waiting for operation [apps/spring-boot-demo-20180122/operations/b92507ce-91de-4d88-9bbf-0ec08abca807] to complete...
[INFO] GCLOUD: ...done.
[INFO] GCLOUD: done.
[INFO] GCLOUD: Deployed service [default] to [https://spring-boot-demo-20180122.appspot.com]
[INFO] GCLOUD: You can stream logs from the command line by running:
[INFO] GCLOUD:   $ gcloud app logs tail -s default
[INFO] GCLOUD: To view your application in the web browser run:
[INFO] GCLOUD:   $ gcloud app browse
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:02 min
[INFO] Finished at: 2018-01-21T21:20:21+09:00
[INFO] Final Memory: 31M/581M
[INFO] ------------------------------------------------------------------------