👏
Cloud Run デプロイ時のアーキテクチャ不一致エラーの解決覚書
本稿の内容は、「コンテナは実行環境に合うようにビルドが必要。Cloud Runはx86_64アーキテクチャであり、このアーキテクチャ向けのビルドが必要」に尽きます。
発生した問題
M1チップ搭載のMacマシンでビルドした、FastAPIアプリケーションのDockerイメージをArtifact Registryにプッシュし、Cloud Runにデプロイした際に以下のエラーが発生し、サービスが起動しませんでした。
Error waiting to create Service: Error waiting for Creating Service: Error code 13, message: Revision 'hello-api-service-00001-555' 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. Logs for this revision might contain more information.
環境及び問題が発生した構築手順
- Apple M1チップ搭載Macマシンで、マルチアーキテクチャビルドを指定せずに Fast API アプリケーションをビルド
- Artifact Registryにデプロイ
- Artifact Registryのイメージを使用して、Cloud Runサービスを起動
解決方法
x86_64アーキテクチャ向けのビルド
マルチアーキテクチャビルドを行うことで、この問題を解決しました。以下は、x86_64アーキテクチャをターゲットにしたビルドの参考コマンドです。
docker buildx create --name mybuilder --use
docker buildx build --platform linux/amd64 -t asia-northeast1-docker.pkg.dev/[PROJECT_ID]/[REPOSITORY_NAME]/[IMAGE]:latest --push .
ビルド環境の使用
そもそもApple Siliconチップのマシンでビルドしない。一般的なCI/CD環境を構築していると、こういうエラーに遭遇しにくいと思います。
余談
解決までやったこと
- エラーメッセージをググって同様っぽいものをStackOverflowで見つけ、真似るも解決せず
- ログを読むも初見ではよく分からず(振り返ると「Application failed to start: failed to load /bin/sh: exec format error」はヒントだった)
- ローカルでコンテナが正常動作することを確認
- Terraformで構築していたため、Terraformコードの間違いを疑い、コンソールからCloud Runサービスを立ち上げるも、同様のエラー
- エラーメッセージの「PORT=8080 environment variable」が気になったので、コンテナでListenするPORTとCloudRunパラメータを変更しても変わらず
- リンクされている troubleshooting guidanceを見ると、「注: ARM ベースのマシンでコンテナ イメージを作成した場合、Cloud Run で意図したとおりに動作しないことがあります。」と記載があり、気づく
感想
たまに思うのですが、Google Cloud の troubleshooting guidance は優秀だなと。気づけばそりゃそうだろというミスですが、私は30分以上溶かしてしまいました。戒めとしてもこういう覚書を残していきたい。
世界のラストワンマイルを最適化する、OPTIMINDのテックブログです。「どの車両が、どの訪問先を、どの順に、どういうルートで回ると最適か」というラストワンマイルの配車最適化サービス、Loogiaを展開しています。recruit.optimind.tech/
Discussion