これは何?
Apple Silicon、M1 MacBook ProでビルドしたDockerイメージをCloud Runで動かそうとすると、コンテナが立ち上がる前にエラーで落ちる。
コンテナが立ち上がっていないため、詳しいエラー内容もわからない。
このような事象に遭遇して解決に時間を要したため、原因調査や対策について備忘録を残しておく。
Dockerイメージのアーキテクチャによる問題
1つ目に遭遇したエラーは以下の内容。
terminated: Application failed to start: failed to load /valhalla/scripts/run.sh: exec format error
Default STARTUP TCP probe failed 1 time consecutively for container "custom-valhalla-1" on port 8002. The instance was not started.
これはApple Siliconだとありがちなもので、Dockerイメージのアーキテクチャが問題である。
Cloud Runは x86_64
であることに対し、Apple Silicon上でビルドしたDockerイメージは arm64
となる。
そのため、ビルド時に明示的にプラットフォームを指定すれば良い。
$ docker build --platform linux/amd64 -t custom-valhalla:0.1.0 .
ちなみに、 valhalla
というのは、OSSの経路検索エンジン。
Cloud Runの実行環境による問題
2つ目に遭遇したエラーは以下の内容。
The user-provided container failed to start and listen on the port defined provided by the PORT=8002 environment variable.
これはエラーメッセージのみから追うのは難しいが、Cloud Runの実行環境による問題だった。
Cloud Runには2024年9月時点で2種類の実行環境が用意されており、デフォルトでは第1世代が選択される。
第1世代はコールドスタートが高速だというメリットがあるものの、第2世代のようなLinuxの完全互換性は実現されていない。
そのため、第1世代ではコンテナを動かすために必要な素材が入っておらず、コンテナの起動に失敗してしまっていたのがこのエラーの原因だった。
第2世代を選択することで無事コンテナが起動された。
(デフォルトを選ぶとCloud Runが適切な実行環境を選択してくれるとのことだが、自分の場合はそうではなかった……)
どのように原因調査を進めるのが良いか?
最後に、Cloud Runのエラーに遭遇した際の対処Tipsを記載して終わる。
- ググる
- Google Cloud上のログを確認する
- ChatGPTなどの生成AIに質問する
- AWS Lamdaでデプロイしてみる
1と2は当然のこととして、最近だと3つ目のChatGPTにも大いに助けられている。
ただし、これらは有用なエラーメッセージがあってこそ輝くものである。
「Cloud Runの実行環境による問題」の問題で遭遇したエラーのように、 そもそもコンテナが立ち上がらないため詳細なエラーログを取得できない 場面もある。
そういった際、一度Google Cloudから離れ、AWSにてデプロイすることで異なるエラーログを得ることができるケースも存在する。
実際、今回私がGoogle Cloud (Cloud Run)で得たエラーログと、AWS (Lambda)で得たエラーログを比較すると下記の通りである。
# Cloud Runのエラーログ
The user-provided container failed to start and listen on the port defined provided by the PORT=8002 environment variable.
# Lambdaのエラーログ
If you run with custom UID or GID you have to create the mapped directory to the container's /custom files manually before starting the image
前者はPORTまわりに問題があるかも、といったエラーを出してくれているが、どこを確認してもPORT設定には問題が見つからなかった。
一方、後者はどうやらcustomディレクトリのファイルをどうにかする必要があることを教えてくれている。
後者の内容でググると、なんと下記記事にたどり着き、今回の原因はCloud Runの実行環境が問題であることを知れたのである。
(AWSで発生したエラーをググって、Google Cloudの解決策に辿り着くのは何とも皮肉であるが……)
どうしようもなくなったら利用するクラウドを変えてみるというのは、エラー原因調査においてひとつの選択肢なのだろう。