くりにっき

フルスタックキュアエンジニアです

Cloud FunctionsにRubyのスクリプトをデプロイする時の裏側

前置き

個人ツールをCloud Functionsで動かしてるのですがある日突然デプロイできなくなりました。

事象は下記のStack Overflowに書いて解決済みです。

stackoverflow.com

英語読みたくない人用に簡単に説明書くと、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.google.com

デプロイ時のログの場所

デプロイ時のログにCloud Loggingへのリンクが表示され、Cloud Loggingで詳細なログが見れます。

f:id:sue445:20210312220834p:plain

Cloud Functionsのデプロイで使われるビルド環境

f:id:sue445:20210312221239p:plain

ここで注目してほしいのはフォーカスしている箇所です。

Cloud Functionsデプロイ時のビルド環境はDockerコンテナのようです。

実際のDockerイメージは下記にあります。

実際に 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のデプロイ時の処理

色々ググッた結果、デプロイ時の処理は下記にあるのを見つけました。

https://github.com/GoogleCloudPlatform/buildpacks/blob/54f3b59da3ac1fc7f9f1236bb0a6c8b1fb055e00/cmd/ruby/bundle/main.go

これを見れば gcloud functions deploy 実行時に実際にGCP側でどんな処理が実行されるのか分かると思います。

*1:Rubyのdefault gemで入ってるbundlerを使ってない