はじめに
この記事は、2010年代にGoogle App Engine(GAE)でJava 8アプリケーションを構築・運用してきたが、令和6年(2025年)になってもそのまま放置されている、あるいは「今更移行するべきか悩んでいる」方を対象としています。
GAE Java 8ランタイムは2021年1月30日にサポート終了(EOL)となり、以後セキュリティパッチも提供されていません。本記事では、2025年時点で「そのまま動いている」アプリケーションが本当に安全なのか、どのようなリスクがあるのか、最小のコストで移行するための選択肢を具体的なコードと手順を交えて解説します。読み終えると、GAE Java 8を「放置」「移行」「置き換え」の3つの戦略から自社に最適なものを選べるようになります。
前提知識
- GAE Standard/Java 8の基本的な動作(
appengine-web.xmlやweb.xmlの存在を知っている) - MavenもしくはGradleによるJavaプロジェクトのビルド経験
- GCP Consoleでサービスを有効化した経験(IAMやAPIの概念を理解している)
GAE Java 8は令和でも動いているが、それでいいのか
GAE Java 8ランタイムは2021年1月30日でEOLを迎えましたが、「既存のインスタンスは動き続ける」というGoogleの方針により、2025年現在でもデプロイ済みアプリは稼働しています。しかし、以下の点で明確なリスクがあります。
-
セキュリティパッチが一切入らない
Log4jなどの深刻な脆弱性が発覚しても、ランタイム側で修正されることはありません。アプリ側で回避策を実装する必要があります。 -
新規デプロイができない
2025年1月以降、gcloud app deployでJava 8ランタイムを指定するとERROR: (gcloud.app.deploy) INVALID_ARGUMENT: version.runtime is not supportedとエラーになります。つまり「ゼロから新規環境を作れない」だけでなく、「バグ修正のための再デプロイも不可」という状況です。 -
周辺ライブラリが次々とJava 8をドロップ
Spring Boot 3.x、Jakarta EE 9以降、Jetty 11以降はJava 11以上を要求します。2025年時点で新しい機能を追加しようとすると、ほぼ100%の確率でビルドできません。
結論から言うと、「動いているからOK」はもはや通用せず、「動かなくなる前に移行を終える」段階に来ています。
2025年でも安全にGAE Java 8を動かすための3つの選択肢
選択肢1:Java 17/21ランタイムへの移行(推奨)
GAE Standardは2025年6月時点でJava 21(LTS)を正式サポートしています。移行手順は以下の通りです。
ステップ1:app.yamlの作成
Java 8時代のappengine-web.xmlは使えなくなるため、まずapp.yamlをルートに配置します。
Yamlruntime: java21 instance_class: F2 entrypoint: java -cp '*' com.example.app.Main automatic_scaling: min_instances: 1 max_instances: 10
ステップ2:Jetty/Undertowを外れ、組み込みHTTPサーバを使う
Java 11以降のランタイムでは、GAEが提供するServletコンテナは使えません。Spring Bootを例に取ると、spring-boot-starter-webにデフォルトで組み込まれるTomcatをそのまま使います。
Xml<!-- pom.xml --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.3.0</version> </parent> <properties> <java.version>21</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
ステップ3:Datastore/TasksなどのGAE固有APIを置き換える
Java 8時代のcom.google.appengine.api.datastore.*は使えません。代わりにGoogle Cloud Client Libraryを使います。
Java// Before (GAE Java 8) import com.google.appengine.api.datastore.DatastoreServiceFactory; DatastoreService ds = DatastoreServiceFactory.getDatastoreService(); // After (Java 21) import com.google.cloud.datastore.Datastore; import com.google.cloud.datastore.DatastoreOptions; Datastore ds = DatastoreOptions.getDefaultInstance().getService();
ハマった点:Datastoreの名前空間(namespace)がデフォルトで""にならない
Java 8時代のDatastoreはNamespaceManager.set("myns")で切り替えていましたが、Cloud Client LibraryではDatastoreOptions.newBuilder().setNamespace("myns").build()で明示的に指定する必要があります。忘れると「データが消えたように見える」ため、移行前に必ずテスト環境で検証しましょう。
解決策
移行スクリプトでnamespaceを自動切り替えするUtilクラスを作成し、すべてのRepositoryで利用します。
Javapublic final class DatastoreUtil { private static final String NAMESPACE = Optional.ofNullable(System.getenv("DATASTORE_NAMESPACE")) .orElse("myns"); public static Datastore create() { return DatastoreOptions.newBuilder() .setNamespace(NAMESPACE) .build() .getService(); } }
選択肢2:Cloud Run/Cloud Functionsへの載せ替え(本格移行)
GAEに縛られない形で完全にマネージドサービスに移行したい場合、Cloud Runが最もオーケストレーションが近い選択肢です。手順は以下の通り。
- Spring Bootで作成したJARを
distroless/java21イメージに載せる gcloud run deployでリビジョンを管理- 旧GAEタスクはCloud Tasks、旧GAEキャッシュはMemorystore for Redisで置き換える
選択肢3:Java 8のまま「動かなくなるまで放置」(非推奨)
2025年6月現在、「以前にデプロイ済みのGAE Java 8サービスは動き続ける」というGoogleの声明は変わっていません。しかし、以下の通り将来的に完全に止まる可能性が高いです。
- 2026年にかけてGAEが新しいインフラ基盤(第二世代ランタイム)へ完全移行した際、旧基盤(Java 8が載っている側)がシャットダウンされる
- 新たなセキュリティインシデント(例:2022年のLog4j Shell)が発生し、ランタイム側で緊急対応が必要になった際に、Java 8ランタイムはパッチ適用不可のため、Google側で強制停止される
結論:選択肢3は「時間稼ぎ」にすぎず、ビジネスリスクが高すぎます。
まとめ
本記事では、GAE Java 8が2025年令和の今も動いているものの、セキュリティパッチが止まり、新規デプロイも不能になっている現状を解説しました。
- Java 21ランタイムへの移行が最も手軽で、GAE Standardのままサービス運用を継続できる
- Cloud Runへの載せ替えで完全マネージド&リビジョン管理が可能
- Java 8のまま放置する選択肢は技術的負債が確定しており、早めの移行が必須
GAE Java 8からの移行は、単なるバージョンアップではなく「プラットフォームの刷新」を意味します。しかし、Cloud Client Libraryへの置き換えとapp.yamlへの移行を乗り越えれば、以後はLTSが10年保証されたJava 21で安定的に動かせます。
次回は、移行後のCI/CD(Cloud Build + Artifact Registry)を最短1時間で構築する方法を紹介します。
参考資料
- GAE Java 8ランタイムサポート終了アナウンス
- Java 21ランタイム公式ドキュメント
- Spring Boot 3.x移行ガイド
- Google Cloud Client Library for Java – Datastore
