前置き
個人ツールをCloud Functionsで動かしてるのですがある日突然デプロイできなくなりました。
事象は下記のStack Overflowに書いて解決済みです。
英語読みたくない人用に簡単に説明書くと、Cloud Functionsのデプロイで使われているDockerイメージにインストールされてるbundlerがバグってるバージョンにいきなり上がった *1 せいでデプロイできなかった感じです。
調べたけど gcloud functions deploy
からだとデプロイ時に使うbundlerのバージョンをどうやっても変えられませんでした。
で、その調査の過程でCloud Functionsのデプロイの裏側を調べたのでメモ。
注意点
このエントリに書いてる内容は実際の処理やログを参考に調べた結果をまとめてるだけなので注意してください。公式ドキュメントのどこにも載っていなかったので公式ドキュメントへのリンクも書いてません。
Cloud Functionsのデプロイ方法
下記のように gcloud functions deploy
を実行するだけで bundle install
やら諸々実行されます。
gcloud functions deploy my_func --region=us-central1 --memory=128MB --runtime=ruby27
デプロイ時のログの場所
デプロイ時のログにCloud Loggingへのリンクが表示され、Cloud Loggingで詳細なログが見れます。
Cloud Functionsのデプロイで使われるビルド環境
ここで注目してほしいのはフォーカスしている箇所です。
Cloud Functionsデプロイ時のビルド環境はDockerコンテナのようです。
実際のDockerイメージは下記にあります。
- Ruby 2.7: https://console.cloud.google.com/gcr/images/fn-img/US/buildpacks/ruby27/builder
- Ruby 2.6: https://console.cloud.google.com/gcr/images/fn-img/US/buildpacks/ruby26/builder
実際に docker run --rm -it us.gcr.io/fn-img/buildpacks/ruby27/builder:latest bash
のようにすることでCloud Functionsのビルド環境に入ることができますが、イメージ1つ2.5GBあるのでpullする時の帯域と空きストレージには注意してください。
$ docker images | grep us.gcr.io/fn-img/buildpacks us.gcr.io/fn-img/buildpacks/ruby26/builder ruby26_20210228_2_6_6_RC00 3546787b4c87 41 years ago 2.48GB us.gcr.io/fn-img/buildpacks/ruby27/builder ruby27_20210308_2_7_2_RC00 4eb6206a7245 41 years ago 2.44GB
Cloud Functionsのデプロイ時の処理
色々ググッた結果、デプロイ時の処理は下記にあるのを見つけました。
これを見れば gcloud functions deploy
実行時に実際にGCP側でどんな処理が実行されるのか分かると思います。