メンテモエンジニアリング

Engineering at Mentemo Inc.

メンテモが Vercel を剥がすまで (経緯編)

採用関連のエントリーを何本か上げてきましたが、あれからメンテモのプロダクトもガラッと変わりました。これは絶好のチャンス、ということで今回はよりエンジニアリングらしい記事を書いていこうと思います。タイトルの通り、メンテモは Vercel を剥がしました。近い規模のスタートアップが同様に Vercel を剥がそう、といった事例もあるかと思いますので、メンテモ社が Vercel を剥がすまでの経緯をご紹介できたらと思います。

メンテモの技術スタック

こちらが旧来の技術スタックです。基本的には Next.js がすべての責務 (ウェブ/API) を持っており、Firestore へのアクセスも Next.js の API Routes 経由で行われるといったものでした。選定の経緯として非常にシンプルで、

  • インフラ構築に割く工数が無い
  • CI/CD 周りで楽をしたい
  • SSR/SSG がある都合、利用可能な IaaS が限られている

というものです。Next.js/Nuxt.js を使う多くのチームが同様の経緯で Vercel を利用しているのではないでしょうか。

移行までの経緯

メンテモが Vercel を剥がすことになった理由は複数個あり、具体的には以下のとおりです。

  • 固定課金費用/従量課金費用が高い
  • SSG が増えることにより、ビルド時間が膨大になる
  • 通知の送信等をバッチ処理的に行う際に timeout してしまう

一点ずつ、それぞれ解説していきます。

固定課金費用/従量課金費用が高い

Vercel には 2022/02/17 時点で 3つのプランが用意されており、商用利用する場合は必然的に Pro Plan を選択することになります($20/mo per member)。固定費用という面では開発に参加するメンバー全員の権限が必要となるので、$20 * メンバー数が必ず毎月のランニングコストとして発生します。トラフィックが増えてきたとはいえ、業務委託メンバーにも権限を付与しなければならないのでなかなかの負担です。

また、一定の時期から Vercel Alert という不穏なメールが届くようになりました。これは Serverless Function の Limit (1,000GB-Hours/mo) を超えてしまいそうだという内容のものです。

Vercel Alert という不穏なメール

2021/10 の Vercel 料金プラン改定までは、これを突き抜けると Enterprise Plan に移行するしか道がないため、本当に不安でした (噂では相当な金額らしい)。改定後は突き抜けても Pro Plan の契約を続けられるようになりましたが、100GB-Hours 超過ごとに $55 の課金が発生するため、ピーク時の月額費用はとんでもないことに。

ピーク時の Vercel 課金額

当たり前ですが、サービスが成長するに従って課金額も増えていくので困っていました。山梨本社の家賃よりも高くなってしまう未来が容易に想像できる状態に...。

SSG が増えることにより、ビルド時間が膨大になる

メンテモはメンテモ ノートというメディアを運営しており、この実装は SSG 領域から Notion API を叩いて静的ページを作成するというものです。記事の本数は右肩上がりに伸び続けますが、同時にビルド時間もぐんぐん伸びていきました。ピーク時には Production 環境へのデプロイに40分程度かかることに。開発速度を最大化したい現在のフェーズにおいて、致命的なボトルネックとなっておりました。

ビルド時に SSG せずに、ISR で記事を作成するという方針も可能性としてはありましたが、

  • 初回アクセス時の遅延が想定されること
  • Notion API が Beta であることから不安定 (502, 504 エラーが一定量発生する) で、初回アクセス時にこれらのエラーが出るとレンダリングされない

という理由で却下されました。よって、初回ページはビルド時の SSG で生成し、記事の更新に追いつかせるために ISR でフレッシュな状態を保つという実装になっておりました。

遅すぎるビルドに対する悲痛の声

通知の送信等をバッチ処理的に行う際に timeout してしまう

Vercel の Serverless Function は 15秒間でタイムアウトする仕様があります。

For Teams, the execution timeout is 15 seconds (Pro plan) -- Serverless Function Execution Timeout

基本的にはこのタイムアウトで問題ないのですが、通知の送信やメンテモ ノートの記事集計をバッチ処理的に行う際に、どうしても突き抜けてしまうことがありました。こちらは仕様上の問題で、こちらができることとしては1ハンドラをタイムアウトまでに終了させる改善をすることしかありません。こちらも移行プロジェクトを前に進めた要因の1つです。

新体制移行まで

こんな経緯で、遂に Vercel を剥がそうという話が現実味を帯びました。環境が丸っと載っているメインのサーバを移行するということで、気合を入れて取組むプロジェクトです。今回は長くなってしまいましたので、ここまで。次回移行、実際に移行作業を計画 => 実行したエンジニアからのエントリーをお待ちください!

いつもの...

\ メンテモは絶賛メンバー募集中です /

open.talentio.com

次回作

engineering.mentemo.com