GAEのデプロイが失敗する: ERROR: (gcloud.app.deploy) Error Response: [9] Cloud build xxxxx status: FAILURE
問題
趣味として、所属している社会人アメフト部の出欠確認・備品管理アプリをスクラッチで書いているのだけれど、あるときGitHub Actionsで動いている自動化デプロイが、以下のエラーを出して失敗していた。
# 前略 Beginning deployment of service [dev]... ╔════════════════════════════════════════════════════════════╗ ╠═ Uploading 44 files to Google Cloud Storage ═╣ ╚════════════════════════════════════════════════════════════╝ File upload done. Updating service [dev]...failed. ERROR: (gcloud.app.deploy) Error Response: [9] Cloud build xxxxxxx status: FAILURE An unexpected error occurred. Refer to build logs: https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/xxxxxxx?project=1111111111 Full build logs: https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/xxxxxxx?project=1111111111
調査
このログから分かることは
- ソースコードを Cloud Storage に上げるところまでは成功している
- Cloud Build で何らかのエラーが出ているが、詳しくはログを見ろ
ということなので、提示されているURLのログを Cloud Console で見に行くと、
Step #2 - "build": Status: Downloaded newer image for asia.gcr.io/gae-runtimes/buildpacks/google-gae-22/go/builder:go_20230305_RC00 Step #2 - "build": asia.gcr.io/gae-runtimes/buildpacks/google-gae-22/go/builder:go_20230305_RC00 Step #2 - "build": ===> ANALYZING Step #2 - "build": ERROR: failed to initialize analyzer: getting previous image: getting config file for image "asia.gcr.io/triax-football/app-engine-tmp/app/dev/ttl-18h:latest": GET https://storage.googleapis.com/asia.artifacts.triax-football.appspot.com/containers/images/sha256:xxxxxxx?access_token=REDACTED: unexpected status code 404 Not Found: <?xml version='1.0' encoding='UTF-8'?><Error><Code>NoSuchKey</Code><Message>The specified key does not exist.</Message><Details>No such object: asia.artifacts.triax-football.appspot.com/containers/images/sha256:xxxxxxx</Details></Error> Finished Step #2 - "build" ERROR ERROR: build step 2 "asia.gcr.io/gae-runtimes/buildpacks/google-gae-22/go/builder:go_20230305_RC00" failed: step exited with non-zero status: 1
Cloud Storage に格納されているはずの「previous image」が無くてコケているように見える。 で、該当する Cloud Storage のbucketを見に行くと、確かに何も無いので、そりゃコケるわな、という気持ち。
原因
- 年末大掃除のときに「まあ大丈夫やろ」という気持ちで14日以上のエンティティは全部削除されるようにした気がする。
対処
- Previous Image を削除しちゃっているので、同じCDを回してももちろん同様の理由で失敗する。
- 原理的には、base image(GAEなので "runtime")とソースコードさえあれば、previous image を参照せずともアプリケーションのイメージをbuildできるはずである。
- したがって、
gcloud app deploy
で、previous image を参照しないオプションが無いか、調査し、--no-cache
というオプションを発見した。
--cache
Enable caching mechanisms involved in the deployment process, particularly in the build step. Enabled by default, use
--no-cache
to disable.
ビンゴ
なので、いったん手元で
gcloud app deploy ./app.yaml --no-cache # 以下もろもろ略
としたらデプロイはできた。
原因に対する解決
- 上記と同様に、GitHub Actions 上の CD においても
--no-cache
を指定すれば、Cloud Storage で何が起きてもデプロイできるのは想像がつく --no-cache
のdownsideとしてはもちろん時間がかかることがあるはずなので、logを確認すると、このプロジェクトは軽いので、--cache
= 1分30秒--no-cache
= 2分00
- Pricingは、$0.003/分、なおかつ無料枠は120分/日 Cloud Build pricing | Cloud Build Documentation | Google Cloud
ということで、このプロジェクトに関しては --no-cache
の対応 + Cloud Storage ではもっと早期に自動削除しちゃってよさそう。(7日削除にした)
以上
DRYな備忘録として
Club TRIAX では、メンバー/スポンサーを募集しております!
ちなみに私の役割は「デジタル担当」で、練習場にはほとんど行きません。そういう多種多様な関わりを通じて、仕事や人生そのものを充実させられる、魅力的なチームです。ご興味ある方は、ぜひお声がけください!