Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ZennとCloud Runの歩み - プロダクト開発に全集中できる相棒になるまで
Search
Yusuke Wada
September 25, 2025
Technology
6
870
ZennとCloud Runの歩み - プロダクト開発に全集中できる相棒になるまで
こちらのイベントで Zenn と Cloud Run の事例を紹介しました。
https://offers-jp.connpass.com/event/366307/
Yusuke Wada
September 25, 2025
Tweet
Share
More Decks by Yusuke Wada
See All by Yusuke Wada
Claude Code でアプリ開発をオートパイロットにするためのTips集 Zennの場合 / Claude Code Tips in Zenn
wadayusuke
8
6.1k
Zennの運営完全に理解した #完全に理解したTalk
wadayusuke
1
390
ZennにCloudflare WAFを導入してDDoSを防いだ例 / zenn-cloudflare-waf-blocked-ddos
wadayusuke
1
1k
Google Cloud でシンプルなブログサイト Xenn をつくろう / xenn-google-cloud-handson
wadayusuke
4
290
Google Cloud で プロダクト開発 事業として成長させるZennの例 / grows-zenn-with-google-cloud
wadayusuke
3
850
ZennにみるCloudRunとBigQueryによるアプリケーション構築 / zenn-cloudrun-bigquery-serverless
wadayusuke
16
7.2k
Zennを支える Google Cloud の技術
wadayusuke
5
1.6k
個人ブログサイトを構築して学ぶGraphQL NestJSとNext.js使うよ! / graphql nestjs nextjs bootcamp
wadayusuke
6
4.2k
Step Functions と Lambda Function で組む Athena によるファイル処理 / serverless lightweight etl
wadayusuke
3
4.2k
Other Decks in Technology
See All in Technology
AI Agent Standards and Protocols: a Walkthrough of MCP, A2A, and more...
glaforge
1
520
新規事業 toitta におけるAI 機能評価の話 / AI Feature Evaluation in toitta
pokutuna
0
240
SREの仕事を自動化する際にやっておきたい5つのポイント
jacopen
4
480
【Oracle Cloud ウェビナー】ランサムウェアが突く「侵入の隙」とバックアップの「死角」 ~ 過去の教訓に学ぶ — 侵入前提の防御とデータ保護 ~
oracle4engineer
PRO
2
200
迷わない!AI×MCP連携のリファレンスアーキテクチャ完全ガイド
cdataj
0
680
ファインディにおけるフロントエンド技術選定の歴史
puku0x
2
1.6k
Models vs Bounded Contexts for Domain Modularizati...
ewolff
0
220
SwiftDataを覗き見る
akidon0000
0
300
「AIでできますか?」から「Agentを作ってみました」へ ~「理論上わかる」と「やってみる」の隔たりを埋める方法
applism118
3
3k
Riverpod3.xで実現する実践的UI実装
fumiyasac0921
1
320
Kaggleコンペティション「MABe Challenge - Social Action Recognition in Mice」振り返り
yu4u
1
730
Exadata Database Service ソフトウェアのアップデートとアップグレードの概要
oracle4engineer
PRO
1
1.2k
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
46
7.9k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
620
Docker and Python
trallard
47
3.7k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
100
How to build a perfect <img>
jonoalderson
1
4.9k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
99
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
150
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
0
180
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
130
How GitHub (no longer) Works
holman
316
140k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
1
79
Transcript
Zenn と Cloud Run の歩み プロダクト開発に全集中できる相棒になるまで クラスメソッド株式会社 和田祐介
自己紹介 クラスメソッド株式会社 Zennチーム エンジニア 和田祐介 Zennの開発と運営を担当 Zennチームへ異動 2021年7月 勤務地 生まれ
大学時代 東京 福岡県 北九州市 糸島市(九州大学) Google Developer Experts プログラム認定 Google Cloud / 2024年04月 クラスメソッドへ入社 2016年2月 AWS EC2、Scala、Backend API Cloud Run、Next.js、Ruby on Rails、 Zenn全般
今日お話する内容 Zennでの Cloud Run の使い方をなるべく具体的に紹介 みなさまのサービス開発の手札に加えていただく
Zenn - 技術情報共有コミュニティ 2025年8月時点 1,500 万/月 PV 16万 登録ユーザー 19万
投稿記事数 1,300 組織利用 記事や本を書いて投稿
Zennは2021年にクラスメソッド社が買収しました
2021年当時のおおよその構成 Zennを支える技術とサービス構成 データベース Cloud SQL Analytics 画像など Cloud Storage Assets
Scheduled Tasks Cloud Scheduler タスクAPIへ Monitoring Logging Bulk Tasks Cloud Tasks タスクAPIへ 著者‧読者 管理者 ユーザーAPI App Engine 管理サーバー App Engine タスクAPI App Engine
2022年初頭、Cloud Run へ移行する機運が高まった • 課題1: Vercel のまま利用者が増えるとコストがかさむ ◦ 当時Bandwidth制限が厳しく、Enterprise or
Migration • 課題2: App Engine フレキシブル環境の起動が遅い ◦ スケールアウト時、起動に数分かかっていた… • 課題3: GKEなど管理コストがかかるものは回避 ◦ 3人で開発・運用していたため(今も) アプリケーションをコンテナベースに統一し、Cloud Run へ移行すると決定
現在も Ruby on Rails と Next.js がメイン イベントデータ Cloud Load
Balancing データベース Cloud SQL Analytics 画像など Cloud Storage タスク API Cloud Run 管理用サーバー Cloud Run ユーザーAPI Cloud Run HTML / JS Cloud Run Assets Stats BigQuery Scheduled Tasks Cloud Scheduler タスクAPIへ Monitoring Logging Bulk Tasks Cloud Tasks タスクAPIへ 著者‧読者 管理者 WAF CDN Cloud Armor
いまふりかえって移行はどうだったか? • 成功です。移行してよかったです • 何が良かった? ◦ 課題がほぼ解消できた ◦ Cloud Run
のサービス抽象度がZennと合っていた。ビジネスに集中できる ◦ Cloud Run のアップデートにあやかれる
プロダクトを成長させるとなると… • そうなんです、移行するだけでは不足です • Webアプリをデプロイするのは圧倒的に得意 • 継続的な開発と運用には、いろいろなサービスのちからを借りる必要あり
Cloud Run 活用 具体例 DBマイグレーションしたい キューイングしたい Geminiをアプリに組み込みたい
DBマイグレーションしたい DBマイグレーションはどの現場でも実施されていることと思います ZennのアプリはRuby on Railsの db:migrate コマンドでDBマイグレーションし ている App Engine
時代は SSH ログインして実行していたが、いまは Cloud Run ジョ ブ でDBマイグレーション用のジョブを定義してそれを実行する方式
DBマイグレーションしたい GitHub - mainブランチへマージ ステップ1 Cloud Build - Dockerイメージ作成 ステップ2
Cloud Build - Cloud Run ジョブ 更新 ステップ3 Cloud Build - Cloud Run リビジョン作成 ステップ4 Cloud Shell - DBマイグレーション実行 ステップ5 Cloud Shell - リリース ステップ6
DBマイグレーションしたい GitHub - mainブランチへマージ ステップ1 Cloud Build - Dockerイメージ作成 ステップ2
Cloud Build - Cloud Run ジョブ 更新 ステップ3 Cloud Build - Cloud Run リビジョン作成 ステップ4 Cloud Shell - DBマイグレーション実行 ステップ5 Cloud Shell - リリース ステップ6 - id: deploy-rails-command-job name: gcr.io/google.com/cloudsdktool/cloud-sdk:a lpine entrypoint: gcloud args: - [“run”, “jobs”, “deploy”] - rails-command - --quiet - --image=$IMAGE_NAME - --service-account=$ACCOUNT - --set-cloudsql-instances=$NAME - --command=bundle,exec,rails - --args=db:migrate,db:migrate:status cloudbuild.yaml
DBマイグレーションしたい GitHub - mainブランチへマージ ステップ1 Cloud Build - Dockerイメージ作成 ステップ2
Cloud Build - Cloud Run ジョブ 更新 ステップ3 Cloud Build - Cloud Run リビジョン作成 ステップ4 Cloud Shell - DBマイグレーション実行 ステップ5 Cloud Shell - リリース ステップ6 gcloud run jobs update rails-command \ --project zenn-project \ --region=asia-northeast1 \ --command=bundle,exec,rails \ #なくてもOK --args=db:migrate \ #なくてもOK --execute-now \ --wait
運用してどうか? Cloud Run ジョブ は指定した Docker イメージでコマンドを実行する手段 検証環境ではdb:migrateまでCloud Buildで実行してしまうなど、柔軟性も◯ db:rollback
は本番環境では実質封印 なにか問題が起きた場合は修正を db:migrate したほうが安定すると判断
キューイングしたい Cloud Tasks を使います。ZennではMarkdownの一括変換で利用 Zennでは読み込み速度向上のため変換済みHTMLをDBに保存している Markdown => HTML の変換仕様がかわり、すべての記事を洗いがえるケース
キューイングしたい Cloud Tasks を使います。ZennではMarkdownの一括変換で利用 create_params = { queue: "markdown-convert", target_path:
"/tasks/md_convert/run", payload: { id: new_task.id, item_name: item.class.name, item_id: item.id } } tasks.create(**create_params) enqueue.rb Scheduled Tasks Cloud Scheduler タスクAPIへ 投入側
キューイングしたい Cloud Tasks を使います。ZennではMarkdownの一括変換で利用 create_params = { queue: "markdown-convert", target_path:
"/tasks/md_convert/run", payload: { id: new_task.id, item_name: item.class.name, item_id: item.id } } tasks.create(**create_params) enqueue.rb Scheduled Tasks Cloud Scheduler タスクAPIへ 投入側 post "/tasks/md_convert/run" def run convert(target_item) end markdown.rb 変換側
運用してどうか? 最高です。PUSH型のキューイングサービス • アプリ側の仕事 ◦ エンキュー(パラメータをセットしてリクエストするだけ) ◦ 受け側のエンドポイントと処理を実装(ふだんのWeb APIとかわらない) Markdown
変換処理はユーザー利用のものと共通にできる オフロードしたくなったら Cloud Tasks を第一に考える ステートレス思想なCloud Runがここまで戦えるのは Cloud Tasks のおかげ
Geminiをアプリに組み込みたい 特別なことをせずともRails(Cloud Run)から Vertex AI API で呼び出せる Zenn ではAIレビュー機能、スパムチェック機能で利用中 Cloud
Run の サービスアカウントに “Vertex AIユーザー” がついていればOK
AIレビュー機能 書いた記事をAI(実体は gemini-2.5-flash)にレビューしてもらえる @gemini = VertexAiApi::Gemini.new( model: "gemini-2.5-flash", response_schema: response_schema,
) @gemini.call(“”” ## はじめに あなたはIT技術系ブログプラットフォーム ZennのAIレビュー担当者です。 以下の記事について、品質向上のためのレ ビューを行ってください。 “””) ai_reviewer.rb ユーザー API Cloud Run
スパムチェック機能 明らかな誘導記事などを自動で凍結(強制非公開)措置をとる機能 データベース タスク API Cloud Run Cloud SQL @gemini
= VertexAiApi::Gemini.new( model: "gemini-2.5-flash", response_schema: response_schema, ) @gemini.call(“”” あなたはIT技術系ブログプラットフォームの Zennのスパム検知ロボットです。 次のコンテンツがスパム投稿である確率を判定 してください。 “””) spam_checker.rb
運用してどうか? 他の Google Cloud サービスと同じ手順でGeminiが利用できる点がよい 少ないステップでアプリに生成AIを組み込める リーズナブルに利用できる • 2025年8月 ◦
AIレビュー機能: 611回利用された ◦ スパムチェック: 5550投稿された記事に対して適度に間引いて実行した ◦ __________円
運用してどうか? 他の Google Cloud サービスと同じ手順でGeminiが利用できる点がよい 少ないステップでアプリに生成AIを組み込める リーズナブルに利用できる • 2025年8月 ◦
AIレビュー機能: 611回利用された ◦ スパムチェック: 5550投稿された記事に対して適度に間引いて実行した ◦ 8,846円
Cloud Run だけでアプリ作れるって本当? • 本当です。Zennが作れます • Cloud Run ジョブ や
Cloud Tasks など、手数少なく統合できる • 事業のフェーズやユースケースに合わせて強化できる • Zennにとってはなくてはならない相棒です 年月 プルリクエスト合計 2025年4月 175 2025年5月 198 2025年6月 191 年月 プルリクエスト合計 2021年4月 56 2021年5月 47 2021年6月 25
Zenn と Cloud Run のこれから • SLAやSLOの設定 • 取り扱う個人情報が増えた場合 •
連携するサービスが増えた場合 • コンテンツのパーソナライゼーションとロジック
None