【AI格闘記】Cloud RunでApplication exec likely failed


こんにちは、フリーランスエンジニアの太田雅昭です。

背景

プログラマは自分用のツールを作りがちです。私もその一人で、Google Compute Engine上で指定サイトの更新チェックをするプログラムを定期的に動かしていました。ただCompute Engineは常時起動で地味にコストがかかります。ブログも動かしていた関係からそこで一緒に使っていたのですが、ブログをGithub Pagesに移行した関係で、Cloud Run(従量課金で実行時のみ課金)に移行しようとした次第です。

Cloud Runは使わない時は課金されないため、定期実行のバッチ処理には最適な選択肢です。

AIに丸投げ

最近のプログラマは、本番は慎重になりつつも、自分用のツールはAIに任せがちです。ということでClaude Sonnet 4.5にまかせて、ステップごとに実装させていきました。

  • Honoへの移行、コード修正
  • Dockerfileの作成
  • デプロイスクリプトの生成

簡単なツールなので、すぐ終わるつもりでいました。ローカルでのDockerテストも問題なく動作していたため、完全に油断していました。

デプロイできない

なぜか一向にデプロイが成功しませんでした。Cloud Runのログを確認しても、具体的なエラーメッセージがさっぱり出てきません。ローカルテストは成功しているのに、これはおかしいと。しかし自分用のツールで一つ一つ見るのも面倒臭い。AIに直させて買い物へ行ってAIに直させてパンを食べて、そうこうしているうちに午前が終わろうとしています。これはまずいです。早くなんとかしないと、本業に取り掛かれません。焼きそばパンをかじりながら考えます。

諦めてじっくり見る

あきらめてじっくりエラーを追うことにしました。ところどころログ出力やヘルスチェックエンドポイントを追加して、どこでエラーが出ているかを確認しようとします。今回初めてCloud Run環境でbunを使っていたため、そこのエラーをずっと疑っていたのですが、違いました。ここで一つのエラー文に注目します。

Application exec likely failed

これが鍵ではないかと。探してみるとありました。

https://stackoverflow.com/questions/69898865/google-cloud-run-failing-with-application-exec-likely-failed-error

これによると、Dockerをビルドするプラットフォームが違うためにこのエラーが出るようです。具体的には、M1/M2 MacなどのARM64アーキテクチャでビルドしたイメージを、Cloud Run(AMD64/x86_64)で実行しようとすると発生するとのこと。

いやいや待ってください。デプロイは通常gcloud関数で行うので、プラットフォーム間で差異が出るわけがありません。いやいやまさか。そう思いながらAIにこのURLを渡してみました。すると

AI: 「まさにこれです!」

は?いやいやgcloud buildしてたらプラットフォームの差異なんて出ないでしょ?何を言ってるんだこのバカAIは。待てよいやまさか。

まさかの真相

慌ててデプロイスクリプトを確認すると、下記のようになっていました。

# Dockerイメージをビルド
echo ""
echo "4. Dockerイメージビルド..."
docker build --no-cache -t ${IMAGE_NAME}:latest .

完全にローカル(M2 Mac)でビルドしてプッシュしていました。これではARM64アーキテクチャのイメージがCloud Runに送られてしまいます。

はい、以下のように修正して終わりました。

# Dockerイメージをビルド(Cloud Buildを使用してプラットフォーム問題を回避)
echo ""
echo "4. Dockerイメージビルド(Cloud Buildを使用)..."
gcloud builds submit --tag ${IMAGE_NAME}:latest .

gcloud builds submitを使用することで、ビルドがGoogle Cloud上で行われるため、正しいアーキテクチャ(AMD64)のイメージが生成されます。

なぜこうなったか

人が前提として思っている当たり前は、AIにとっては違っていたりします。これは人同士でも同じではあるのですが、どうもAIに対しては過剰な期待感があるのかもしれません。

私の中での暗黙の前提

  • Google Cloudへのデプロイなら当然gcloudコマンドを使うだろう
  • クロスプラットフォームの問題は自動的に考慮されるだろう
  • ベストプラクティスに従った実装をしてくれるだろう

実際のAIの判断

  • Dockerのビルドはdocker buildが最も一般的
  • ローカルでビルドしてプッシュするのがシンプル
  • 特に指示がなければ標準的な方法を選択

そのために、AIだからこれくらいは当たり前だろうと無意識に思っていたのでしょう。まさかAIがDockerをローカルでビルドしてGoogle CloudにPushするなんて、夢にも思わないわけです。しかし実際はそうなっていました。

改めて、AIは便利なツールではありますが、盲信してはいけないことを思い知らされた朝でした。