【Cloud Run】Goのランタイムバージョンアップ(1.21→1.25)でハマった話と解決策

 2025.12.08 XIMIX 山田

はじめに

現在、Cloud Run FunctionsでGoアプリケーションを運用しています。これまで ランタイムとしてGo 1.21 を使用していましたが、Google Cloudのスケジュールによると 2025年9月3日に非推奨 となり、2026年3月3日には廃止 される予定です。(参考:ランタイムサポート

余裕を持って対応しようと、gcloudコマンドでバージョン指定をGo1.25に変更して再デプロイを試みたのですが、ここで予期せぬエラーが発生しました。 さらに厄介だったのが、出力されたエラーメッセージに具体的な原因が記されていなかった ことです。そのため、原因の特定と解決に想定以上の時間を費やすことになってしまいました。

本記事では、同様の現象に遭遇した方がスムーズに解決できるよう、エラーの内容とその解決策を共有します。

原因と解決策

原因

結論から言ってしまうと、デプロイ失敗の原因は .gcloudignoreファイルにgo.modファイルとgo.sumファイルが含まれていたこと でした。

.gcloudignoreファイルから該当の行を削除することで、デプロイが成功しました。

ディレクトリ構成

私の環境では、以下のような構成でコードを管理していました。gcfディレクトリ下でシェルスクリプトを実行してCloud Run Functionsをデプロイします。

gcf
├── vendor
├── .gcloudignore      <-- 今回の主犯
├── README.md
├── deploycommand.sh   # デプロイ用スクリプト
├── function.go      
├── go.mod
└── go.sum

.gcloudignore

.gcloudignoreとは Git の.gitignore と同じような役割を持つファイルです。ここに記述されたファイルは、デプロイ時にGoogle Cloud上へアップロードされません。

エラー時の.gcloudignoreファイルの中身はこちら

deploycommand.sh
.gcloudignore
env*.yaml
*_bk
go.mod  
go.sum  

gcloud functions deployCloud Run Functionをデプロイしようとしていましたが、go.modを参照できない→ビルドプロセスで依存関係の解決やモジュール定義が正しく行われない、ということでエラーが発生したようです。

コマンド内容

gcloud functions deploy \
<ファンクション名> \
--project=${PROJECT_ID} \
--region=${REGION} \
--runtime=go125 \
--gen2

エラーの内容

デプロイ失敗時にコンテナのヘルスチェックで失敗していますという旨のエラーが出ました。これだけではポートの問題か、タイムアウトの問題か勘違いしてしまいます。

ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Could not create or update Cloud Run service <ファンクション名>, Container Healthcheck failed. Revision <リビジョン名> is not ready and cannot serve traffic. The user-provided container failed to start and listen on the port defined provided by the PORT=8080 environment variable within the allocated timeout. This can happen when the container port is misconfigured or if the timeout is too short. The health check timeout can be extended. Logs for this revision might contain more information.

エラーの内容を調査したところ、Google公式によるトラブルシューティングにて、requirements.txtを修復することで解決していたので、パッケージに問題であるとあたりをつけることができました。

そこでパッケージの依存関係の整理や、

go mod tidy -go=1.25

vendorディレクトリにパッケージのダウンロードをするなど

go mod vendor

パッケージ周りの修正をしてはデプロイして失敗するというトライ&エラーを繰り返したのちに、.gcloudignoreファイルに問題であることに気づきました。

何故.gcloudignoreにgo.modがあったのか

Googleの公式ドキュメントに原因となりそうな記述がありました。

1.16 より前の Go バージョンではgo.mod ファイルと vendor ディレクトリがある場合は、関数のデプロイ時に vendor ディレクトリが無視される、とあります。vendorディレクトリを尊重するにはgo.modとgo.sumを.gcloudignoreに記述することが推奨されています。

おそらくその名残で.gcloudignoreにgo.modが記述されていたのでしょう。

現在のGo1.25ではvendor/module.txtとgo.modの内容の整合性を確認しているようです。(参考:Go Vendoring

まとめ

今回のエラーは、過去のバージョン(Go 1.11〜1.16頃)における「vendorディレクトリ運用のための設定」が、Go1.25へのバージョンアップ時に足かせになったという事例でした。

Cloud Run Functions や Cloud Run でデプロイエラー(特に Healthcheck failed や Build Error)に遭遇し、ログを見ても原因が判然としない場合は、一度 .gcloudignore を疑ってみてください。

この記事が、同じくGoのランタイムアップデートで苦戦している方の助けになれば幸いです。

参考


BACK TO LIST

   

Recent post最新記事

Contentsコンテンツ