Google App Engine Flexible で Java 9 アプリケーションが動くという話

スポンサーリンク

これを書いている時点ではベータ版ですが、App Engine Flexible には Java 8 ランタイムが用意されています。Spring Boot や Spark などのフレームワークで作られたウェブアプリケーションを動かすことが想定されているようです。

App Engine > Documentation > Java > Flexible Environment > Java 8 ランタイム
https://cloud.google.com/appengine/docs/flexible/java/dev-java-only?hl=ja

Java 8 でベータなら Java 9 対応はまだまだかなあと思っていたのですが、なんと Java 9 で書かれたアプリケーションを動かすことができました、という話です。

来月には Spring Boot 2.0.0 がリリースされる予定です。

Spring Boot – Milestones
https://github.com/spring-projects/spring-boot/milestones

そして、Spring Boot 2 は Java 9 をサポートする最初のバージョンです。

Spring Boot with Java 9
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-with-Java-9

つまり、Spring Boot 2.0.0 が出るやいなや、App Engine Flexible でも動かせるということですね。ただし、GCP のドキュメントには Java 9 に関する記述は現時点ではまだ一切無いです。よって、何の保証も無いでしょうし、実験レベルで使用するのが適切でしょう。

さて、App Engine Flexible で使用するための OpenJDK の Docker イメージは、アジアだと https://console.cloud.google.com/gcr/images/google-appengine/ASIA/openjdk にあります。

latest, 8 というタグの他に、既に 9 というタグが付いたイメージがあります。これが OpenJDK 9 のイメージのようです。

ちなみに、us.gcr.io, eu.gcr.io, asia.gcr.io, gcr.io の違いについては下記に。

Container Registry > イメージの push と pull
https://cloud.google.com/container-registry/docs/pushing-and-pulling?hl=ja

参考までに、Google App Engine Gradle plugin を使用して Java 8 な Spring Boot アプリケーションを App Engine Flexible にデプロイするやり方は過去のポストに。

Google App Engine Flexible で動作する Spring Boot アプリケーションと Google Cloud SQL との連携
GCP! GCP! 前準備 ビルドツールに Gradle を使用した Spring Boot アプリケーションを準備しておきます。形式は Executable jar とします。 また、GCP の API Manager ...

ということで、Java 9 なアプリケーションを準備します。例えば、build.gradle に下記のように書かれているアプリケーションです。

...

sourceCompatibility = 1.9
targetCompatibility = 1.9

...

app.yaml の内容は例えば下記の通りです。Java 8 の場合との差異としては、rutime_config の jdk の値を変更するだけですね。

runtime: custom
env: flex
service: mokyu

runtime_config:
  jdk: openjdk9

Dockerfile の内容は例えば下記の通りです。Java 8 の場合との差異としては、Docker イメージのタグの値を 9 に変更するだけですね。

FROM asia.gcr.io/google-appengine/openjdk:9
COPY myapp-1.0.0-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]

そして、gradle appengineDeploy を実行すれば、App Engine Flexible 環境にデプロイされます。