Vercelでbuildができなくなった!!! ので→ cloud runに移行した話

どうも小栗旬ことRちゃんこと「ヨネイチレツキ」です！
現在は、でソフトウェアエンジニア兼エンジニア採用をやっています
[Scheeme](https://scheeme.com/)
[Twitter](https://twitter.com/duz_mk)
[Wantedly](https://www.wantedly.com/projects/643861)

## はじめに
この記事はvercel->cloud runに移したことを物凄く雑に書いたものです。
なぜなら、今日は日曜日だからです！！！
なので、もし時間があって心にゆとりのある方であるならば読んでいただくと有難いです。

## 今年の5月にとある問題が、、、

実は、今年の5月ごろからvercelにてbuildができなくなってしまいました。。。

理由は以下のようなもので、

```js
Error! The Serverless Function "api/auth" is 50.55mb which exceeds the maximum size limit of 50mb.
```

上記のエラー自体は[ここから](https://stackoverflow.com/questions/66632218/nextjs-the-serverless-function-exceeds-the-maximum-size-limit-of-50mb)拾ってきたのですが、とりあえず、何かのサイズが50MBを超えたためにbuildができないのだと言われました!!!

![ohmygod](https://media2.giphy.com/media/LfGGW219qNzLP6IzTA/giphy.gif?cid=ecf05e474d0y3yi8lqa0p8o5nazzumcvvn8c0figyop0etco&rid=giphy.gif&ct=g)

## そして僕はどうしたか、、、
ってことで
解決策は無いのかなと考えたところ
そもそもhosting先なんてたくさんあるじゃないか!!!
https://nuxtjs.org/integrations
なので、特に理由はなく、使ってみたいと思っていたcloud runを次なるhosting環境として選定しました。

## 実際に調べて、触れてみて
しかし、そう簡単に行かないのが人生でありました！！
そもそも、vercelでやっていたことをcloud runでも出来ないと不便です。
例えば、
Github連携はもちろん、preview URLの発行やslackの通知などもvercelでは出来ますよね!!!
だけど、cloud runでできるの？？
[nuxtドキュメント](https://nuxtjs.org/integrations/deployments/google-cloud-run)に従ってhostingまでやってみるとcloud run単体では上記の機能は無いことに気づきました。
悲しみの雨が僕をびしょびしょに、、、

## Rちゃんの覚悟と決意
無いものは作るしか無い!!!
男Rちゃん、そう決意してやってみました！！
先に出来上がった全体像を載せますね。
![スクリーンショット 2021-10-03 23.38.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201115/f7f373f6-dc9c-3f4c-d729-7305a795937b.png)

### 使用したもの

- Cloud Build
- Cloud Run
- Secret Manager
- Pub/Sub

## 具体的過ぎない程度で説明
まずは、build環境にcloud buildが必要と分かりました。
#### cloud buildとは


>Cloud Build は、Google Cloud Platform インフラストラクチャでビルドを行うサービスです。Cloud Build は、Cloud Storage、Cloud Source Repositories、GitHub、Bitbucket からソースコードをインポートし、仕様に合わせてビルドを実行して、Docker コンテナや Java アーカイブなどのアーティファクトを生成します
>
>Google Cloudドキュメントより: 

Githubの連携もcloud buildの設定画面でぽちぽちとできます。[詳細](https://cloud.google.com/build/docs/automating-builds/build-repos-from-github?hl=ja)
cloud buildとcloud runはそもそも連携できるので、これでbuildからhostingまではすぐに出来ました！！[詳細](https://cloud.google.com/build/docs/deploying-builds/deploy-cloud-run)

意外と楽かも！！！
っと思ったのも束の間
slack連携とpreview URLの発行が残っている

## 試行錯誤の末
Pub/Subがbuildの経過を監視することができると言うことだったので、やってもらうことにしました。[ビルド通知へのサブスクリプション](https://cloud.google.com/build/docs/subscribe-build-notifications)

それで監視プログラムにslackのwebhookをぶち込みました！！（監視プログラムはpythonで書いてます）
さらにさらにcloud runのサービスAPIも使用すればリビジョンURLも作成できると分かり、なんやかんやで出来ました！！！
[デプロイ プレビューの構成](https://cloud.google.com/run/docs/tutorials/configure-deployment-previews)

中身を端折り過ぎですよねwww

## 無事vercelからcloud runへ引っ越したが、、、
実はcloud runには最低インスタンス数を設定できる機能があります。と言うのもcloud runは一定時間リクエストが無ければインスタンスが自動的に０になります。これはこれで有難いですが、次回のユーザーからのリクエスト時には、インスタンスが０なのでインスタンスを立ち上げる時間が発生し、アプリケーションの表示時間が遅くなることがありました。なので、こちらを防ぐためにproductionは最低インスタンスを１と設定しました。

#### ２ヶ月後
ん？なんか請求額がすごいことになってる？
vercelの時は1万もいかなかったものがcloud runに変わったらなんと請求額が6万になってました！
なぜだ？なぜだ？

原因はインスタンスが立ち上がっているリビジョンが大量にいたことでした。。。
cloud runはデプロイのたびにリビジョンというものを作成します。[詳しくはドキュメントを](https://cloud.google.com/run/docs/resource-model)
つまり、無駄にインスタンスが立ち上がったリビジョンがデプロイの度に誕生したためインスタンスのcpu代金が発生していたのです。

Rちゃん泣きました。
泣いて泣いて泣きまくりました。

## 結局どうしたのか
まずは、使っていないリビジョンは手動で消しました。
一気に請求額が減りました。これで一安心、、、ではないですよね。
ソフトウェアエンジニアとして、この問題を自動で消すプログラムを作成するべきですね。
cloud runのサービスAPIを使用すればすぐに解決できますが、、、
ただ、それよりも新規プロジェクトの開発に時間を食われ
まだ手付かずの状態、、、
まあ、頑張るんばです!!!

## 最後に
はい。Rちゃん。確かにvercelからcloud runに移行した話をしました。

が、、、

そんなことはハッキリ言ってどうでも良いのです。
本当に言いたいことそれは、、、

誰か手を貸してください！！！！！！

もう辛いんです。。。
人が足りないんです。。。
もう限界なんです。。。
先月から一気に売上も立って勢い付いているのに、、、
これ以上開発スピードを上げちゃうとRちゃんそのまま天国へ走って行きそうなんです。。。
だから、誰か一緒にRちゃんと遊びませんか？

お待ちしておりまーす！！

ps:
直近でやることは
金融機関との連携（Auth0あたりとgqlあたり触ります）
nuxt3へ移行（おもしろそうだよね）
実は導入していないtest（知識がないんです。テスト駆動とか教えて、、、cypress使いたいんだー！！）

ほいじゃ
お待ちしておるぞ！！！

[Twitter](https://twitter.com/duz_mk)
[Wantedly](https://www.wantedly.com/projects/643861)