👏

Cloud Run デプロイ時のアーキテクチャ不一致エラーの解決覚書

2024/07/15に公開

本稿の内容は、「コンテナは実行環境に合うようにビルドが必要。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環境を構築していると、こういうエラーに遭遇しにくいと思います。

余談

解決までやったこと

  1. エラーメッセージをググって同様っぽいものをStackOverflowで見つけ、真似るも解決せず
  2. ログを読むも初見ではよく分からず(振り返ると「Application failed to start: failed to load /bin/sh: exec format error」はヒントだった)
  3. ローカルでコンテナが正常動作することを確認
  4. Terraformで構築していたため、Terraformコードの間違いを疑い、コンソールからCloud Runサービスを立ち上げるも、同様のエラー
  5. エラーメッセージの「PORT=8080 environment variable」が気になったので、コンテナでListenするPORTとCloudRunパラメータを変更しても変わらず
  6. リンクされている troubleshooting guidanceを見ると、「注: ARM ベースのマシンでコンテナ イメージを作成した場合、Cloud Run で意図したとおりに動作しないことがあります。」と記載があり、気づく

感想

たまに思うのですが、Google Cloud の troubleshooting guidance は優秀だなと。気づけばそりゃそうだろというミスですが、私は30分以上溶かしてしまいました。戒めとしてもこういう覚書を残していきたい。

OPTIMINDテックブログ

Discussion