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
1
140
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
4.4k
Zennの運営完全に理解した #完全に理解したTalk
wadayusuke
1
300
ZennにCloudflare WAFを導入してDDoSを防いだ例 / zenn-cloudflare-waf-blocked-ddos
wadayusuke
1
670
Google Cloud でシンプルなブログサイト Xenn をつくろう / xenn-google-cloud-handson
wadayusuke
4
250
Google Cloud で プロダクト開発 事業として成長させるZennの例 / grows-zenn-with-google-cloud
wadayusuke
3
790
ZennにみるCloudRunとBigQueryによるアプリケーション構築 / zenn-cloudrun-bigquery-serverless
wadayusuke
16
7k
Zennを支える Google Cloud の技術
wadayusuke
5
1.4k
個人ブログサイトを構築して学ぶGraphQL NestJSとNext.js使うよ! / graphql nestjs nextjs bootcamp
wadayusuke
6
4.1k
Step Functions と Lambda Function で組む Athena によるファイル処理 / serverless lightweight etl
wadayusuke
3
4.1k
Other Decks in Technology
See All in Technology
テストコードすら書けなかったレガシーアプリがAIと上手に協働できるようになるまでの軌跡
dip_tech
PRO
0
210
経営の意思決定を加速する 「事業KPIダッシュボード」構築の全貌
recruitengineers
PRO
3
150
【デブサミ2025関西】つくる力をうちから、ダイキンのアジャイル内製改革
morinibu
0
110
論文紹介「Evaluation gaps in machine learning practice」と、効果検証入門に関する昔話
stakaya
0
260
メディアカンパニー LINE NEWS QA採用
lycorptech_jp
PRO
0
200
金融サービスの成長を支える “本人確認フロー” の改善と取り巻く環境の変化 / iOSDC Japan 2025
nakamuuu
1
110
空間再現力の鍵、APMPを読み解く
ridwy
1
100
Wantedlyの開発組織における生成AIの浸透プロジェクトについて
kotominaga
2
190
組織を巻き込む大規模プラットフォーム移行戦略 〜50+サービスのマルチリージョン・マルチプロダクト化で学んだステークホルダー協働の実践〜 / Platform migration strategy engaging all stakeholders
toshi0607
2
440
ブラウザのAPIで色々なデバイスをあれこれ扱ってみた話(主にWeb HID API) / IoTLT @JLCPCB オープンハードカンファレンス
you
PRO
0
100
業務でAIの力を最大限に発揮するために #弁護士ドットコム
bengo4com
0
180
AI時代に活躍できるエンジニアとは #弁護士ドットコム
bengo4com
0
170
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
3k
Raft: Consensus for Rubyists
vanstee
140
7.1k
Faster Mobile Websites
deanohume
310
31k
A better future with KSS
kneath
239
17k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
45
2.5k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
[RailsConf 2023] Rails as a piece of cake
palkan
57
5.8k
The Cult of Friendly URLs
andyhume
79
6.6k
Navigating Team Friction
lara
189
15k
Learning to Love Humans: Emotional Interface Design
aarron
274
40k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Docker and Python
trallard
46
3.6k
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