はじめに

この記事は、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.xmlweb.xmlの存在を知っている)
  • MavenもしくはGradleによるJavaプロジェクトのビルド経験
  • GCP Consoleでサービスを有効化した経験(IAMやAPIの概念を理解している)

GAE Java 8は令和でも動いているが、それでいいのか

GAE Java 8ランタイムは2021年1月30日でEOLを迎えましたが、「既存のインスタンスは動き続ける」というGoogleの方針により、2025年現在でもデプロイ済みアプリは稼働しています。しかし、以下の点で明確なリスクがあります。

  1. セキュリティパッチが一切入らない
    Log4jなどの深刻な脆弱性が発覚しても、ランタイム側で修正されることはありません。アプリ側で回避策を実装する必要があります。

  2. 新規デプロイができない
    2025年1月以降、gcloud app deployでJava 8ランタイムを指定するとERROR: (gcloud.app.deploy) INVALID_ARGUMENT: version.runtime is not supportedとエラーになります。つまり「ゼロから新規環境を作れない」だけでなく、「バグ修正のための再デプロイも不可」という状況です。

  3. 周辺ライブラリが次々と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をルートに配置します。

Yaml
runtime: 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で利用します。

Java
public 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が最もオーケストレーションが近い選択肢です。手順は以下の通り。

  1. Spring Bootで作成したJARをdistroless/java21イメージに載せる
  2. gcloud run deployでリビジョンを管理
  3. 旧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時間で構築する方法を紹介します。

参考資料