Closed9

GCP 初心者の M1 Mac ユーザーが Cloud Run にデプロイするときにドツボにはまったこと

mskmsk

概要

表題の通りです。
エラーログの追い方と GCP の経験がなかったため、ハマったことがありました。
M1Mac ユーザーで GCP を使っている人からすると当たり前の解決だと思います。
備忘録としてまとめます。

mskmsk

tl;dr

docker を build するときに --platform linux/amd64 をつける。

docker build --platform linux/amd64 -t イメージ名 .
mskmsk

経緯

以下の記事を参考にして、zenn の限定公開をしたかった。

https://zenn.dev/e_koma/articles/20210104-zenn-preview

しかし、コピペして実行しても、以下のようなエラーが発生した。

ERROR: (gcloud.run.deploy) The user-provided container failed to start and listen on the port defined provided by the PORT=8000 environment variable. Logs for this revision might contain more information.
mskmsk

調査

mskmsk

docker image が動作するか確認

動いた

> docker run -it  イメージ名
👀 Preview: http://localhost:8000

mskmsk

PORT 8000 にアクセスできるか確認

-pオプションを追加して、ブラウザからアクセスできることを確認。

> docker run -it -p 8000:8000 イメージ名
👀 Preview: http://localhost:8000

mskmsk

gcp 側の環境変数を確認

PORT と認可周りも問題なさそう。
GCP のコンソールからみても問題なかった。

gcloud run deploy "サービス名" \
  --image "イメージ名" \
  --port 8000 \
  --platform managed \
  --allow-unauthenticated \
  --region asia-northeast1

mskmsk

ログを確認

コンソールに出力されたエラー以外に以下のエラーがあることに気がついた。

 "terminated: Application failed to start: Failed to create init process: failed to load /usr/local/bin/npx: exec format error"

調べたら以下の記事がヒット。

https://stackoverflow.com/questions/66127933/cloud-run-failed-to-start-and-then-listen-on-the-port-defined-by-the-port-envi

ビルドするときには、--platform linux/amd64 をつけないといけないとのこと。
これで動いた。

ちゃんと公式にも書いてあった。

https://cloud.google.com/code/docs/intellij/arm?hl=ja

mskmsk

振り返り

  • 最初は PORT 周りのエラーだと思った
  • PORT のエラーメッセージは PORT そのものではなくて、アプリが起動できていないからヘルスチェックで起動できなかった
  • ローカルだと起動できるから挙動を再現できなかった。GCP の仕様に気がつくまで時間がかかった
  • ローカルで GCP をエミュレートする方法があるらしいが、試せなかった
このスクラップは2022/12/02にクローズされました