Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Zennを支える Google Cloud の技術

Zennを支える Google Cloud の技術

Zennの裏側では、Next.jsとRuby on Rails 2種類のアプリケーションサーバーが動作しており、どちらも Cloud Run で運用しています。

Google Cloud では、Cloud Run をはじめアプリケーションの開発から運用までをワンストップで担えるサービスが充実しています。このセッションでは、Zennのバックエンドに焦点を当て、Google Cloudをどのように活用しているかの他、CI/CDをどのように回しているか、機能開発の是非をどう判断しているかを説明します。

アプリケーション開発のサイクルをZennを例に解説することで、皆様にとって少しでも手を動かすきっかけとなることを期待しています

Yusuke Wada

March 27, 2023
Tweet

More Decks by Yusuke Wada

Other Decks in Technology

Transcript

  1. クラメソZennチームで働いている和田といいます クラスメソッドへ入社 2016年2月 AWS EC2、Scala、Backend API サーバーレス(FaaSベース)アプリ開発 2018年7月 AWS Lambda、Node.js、Backend

    API, React SPA ZennをきっかけにGoogle Cloud の世界へ 2021年7月 Cloud Run、Next.js、Ruby on Rails、Zenn全般 北九州市出身です! みんなでアプリたくさんつくろう
  2. Zennは、いろいろなサービスに支えられています 決済: Stripe メール送信: SendGrid CDNとOG画像: Cloudinary 出金: Amazonギフト券 屋台骨は

    Google Cloud AWS に比べるとアプリ開発のファーストチョイスになりにくいイメージ が、蓋を開けてみるとスタンダードなWebアプリを作るのに最適まである(感想)
  3. ピックアップ: Cloud Run 超絶優秀 アプリを早く市場投入する vs アプリをスケールする はトレードオフになりがち Cloud Run

    はコンテナイメージからデプロイでき、デフォルト設定でも勝手にス ケールしてくれる 開発者が気をつけること: アプリをステートレスに保つ データベースのコネクションプール枯渇と外部サービスのレートに気をつける コストに気をつける
  4. 利用例: Cloud Scheduler Amazonギフト券の発行 - 毎月15日に実行 - 15 of month

    xx:00 販売した本やバッジの売上をユーザーごとに集計し、ギフト券を発行する
  5. 応用例: Cloud Scheduler + Cloud Tasks 年に一度の Recap メール送信 =>

    大量のバッチ処理を、任意のタイミングで実行する 出典: https://en.wikipedia.org/wiki/Scheduling_(computing)#task_queue Cloud Scheduler エンキュー処理
  6. ここが好きだよ Cloud Tasks 開発者としては API エンドポイントを用意すれば良い(デキュー処理は不要) 少量のタスクを処理する実装を行う その少量のタスクに対しての冪等な処理が求められる 大きなタスクを部分タスクに分解する処理が求められる(エンキュー) =>

    ここまでやるとどんなサイズの問題も分解して対応可能 => 外部サービスの負荷に考慮して スループットの調整が可能 サービスを使うように実装したら、様々なワークロードに応用できる
  7. Zenn は GitHub Actions + Cloud Build lint + fomat

    RSpec vitest Cypress Rails 用トリガー Next.js 用トリガー DBマイグレーション用 トリガー Cloud Run Cloud Run Cloud Shell Cloud Shell Cloud Shell Cloud SQL
  8. 利用例: Cloud Build で Cloud Run へのデプロイ Ruby on Rails

    の 場合 起動条件 => GitHub リポジトリ のmainブランチへのpush/merge YAML ⇒ コンテナイメージのビルド(dockerコマンド) => Cloud Run の新しいリビジョンの作成(gcloudコマンド) ⇒ 新しいリビジョンへトラフィックを流すためのコマンドをSlackに送信 ⇒ そのコマンドを Cloud Shell で手動実行
  9. ピックアップ: 改善アドバイス 要約: 手作業を徹底的になくせ CI/CDに人の手が絡むとデプロイのボトルネックになるので全自動が望ましい 例えば… - Cloud Shell でコマンドを実行するステップを組み込んでしまう

    - 新しいバージョンに30%だけトラフィックを流す - メトリクスを収集し、10分間500エラーが発生していなければ100%にする - リリース完了 ⇒ 課題はあるが(レイアウトの変更など)、さらに人の手を減らしていきたい