Case 03In production

SubMa

気づいたら払い続けていたサブスクを、 全部見えるところに集める個人向けサブスクリプション管理アプリ。 Google Cloud をフル活用した本番運用構成です。

Year
2026
Role
企画/AI と協働で設計・開発・運用
Type
個人プロジェクト
Platform
Web / GCP

払うか、止めるかを
ちゃんと選べる状態に。

Netflix、Spotify、Amazon Prime、ChatGPT Plus、Notion、iCloud—— 気づくと10件、20件と積み重なるサブスクリプション。 クレカ明細を見るまで思い出せず、解約するタイミングを逃したまま、 毎月静かに引き落とされていく状況を変えたかったのが出発点です。

SubMaは、サブスクをすべて1つのダッシュボードにまとめます。 手動で登録するだけでなく、クレジットカードのCSV明細をアップロードすると、 AIが「これはサブスクっぽい」と判定して候補を提案。 月額・年額の合計、カテゴリ別の内訳、引落日カレンダーを一目で確認できます。

Google Cloud を本気で使う。

SubMaは「個人プロダクトとしての規模感」と「本番運用相当のインフラ品質」を両立させた構成です。 Cloud Run / Cloud SQL / Firestore / Cloud Tasks / Secret Manager / Cloud Storage / Cloud Scheduler を組み合わせ、 すべての構成情報を Terraform で IaC 化。GitHub Actions と Workload Identity Federation 経由で キーレス自動デプロイを実現しています。

01
Cloud Run
Rails 8 アプリ本体。min_instance=0 でアイドル時は完全にスケールゼロ。 Cloud SQL とは Unix socket 経由で接続します。
02
Cloud SQL + Firestore
永続データは MySQL(Cloud SQL)、リアルタイム通知や CSV 処理進捗は Firestore。 ハイブリッド構成で適材適所に。
03
Cloud Tasks + Scheduler
重い CSV 処理は Cloud Tasks で非同期化。Cloud Scheduler で 引落日リマインドの定期実行を組みました。
04
Workload Identity Federation
GitHub Actions から GCP への認証は WIF + OIDC で完結。 長期サービスアカウントキー(JSON)を CI に置かない設計です。

三段階のサブスク判定。

CSVアップロード時のサブスク抽出は、コストとレイテンシを抑えるために三層のパイプラインを通します。 まず正規表現ベースの規則マッチでよく知られたサービス名(Netflix、Spotify等)を即時判定。 次に過去の取引データから「同店名・同金額の定期出現」をパターン検出。 最後に残った曖昧な取引だけを Claude API に投げて判定します。

この設計により、API コール数を最小限に抑えつつ、未知のサービスや表記揺れにも対応できる仕組みになっています。 Claude API に送る前には PII(個人情報)をマスキング処理し、CSV ファイル自体は処理後に Cloud Storage から自動削除されるよう Lifecycle Rule を設定しています。

セキュリティは多層で。

01
Firebase Auth + 自前 JWT 検証
Google SSO は Firebase Auth に委譲。サーバ側では公開証明書を 1 時間キャッシュしつつ、 RS256 で iss / aud / exp / iat / sub を自前検証しています。
02
Secret Manager 集中管理
Rails master key、Anthropic API キー、Firebase API キー、DB パスワードを すべて Secret Manager に集約。コードへの直書きを完全排除しました。
03
AuditLog + Rack::Attack
全書き込み操作で監査ログを記録。ログインや CSV アップロードのエンドポイントには Rack::Attack でレート制限をかけています。
04
CI に Brakeman / bundler-audit
静的解析と依存関係の脆弱性スキャンを GitHub Actions の必須チェックに。 main マージ時点で「警告ゼロ」を保証しています。

使った道具。

Backend
Ruby on Rails 8MySQL 8.0Hotwire (Turbo + Stimulus)Tailwind CSS
AI / Auth
Claude APIFirebase Auth
Google Cloud
Cloud RunCloud SQLFirestoreCloud StorageSecret ManagerCloud TasksCloud SchedulerArtifact Registry
DevOps
TerraformGitHub ActionsWorkload Identity FederationDocker
Quality
RSpecCapybaraBrakemanbundler-auditLograge

担当したこと。

Planning
プロダクト企画/要件整理/差別化ポイント(CSV → AI 抽出)の意思決定
Design (AI と協働)
画面設計/脅威モデルとセキュリティ要件の整理/ADR 形式での意思決定記録。 設計案は Claude Code とペアで検討し、最終的な採否はプロダクト要件に 照らして自分で判断。
Development (AI と協働)
Rails バックエンド/Firebase Auth + 自前 JWT 検証/ 3 段階(規則・パターン・Claude API)のサブスク判定パイプライン/Hotwire UI。 実装は AI 主導の出力を、自分でレビューしながら積み上げる進め方。
Infrastructure (AI と協働)
GCP 構成検討/Terraform で全リソースを定義/ GitHub Actions と Workload Identity Federation によるキーレス自動デプロイ/ Cloud Run・Cloud SQL・Cloud Tasks の構築と運用。

AI と組んで作る。

このプロジェクトでは Claude Code を「ペアエンジニア」として位置付け、 要件の整理・設計案の比較検討・実装・コードレビュー・運用トラブルシュートまでを 通して協働しました。AI が提示する複数の選択肢を評価し、自分のプロダクトに 合うかを判断する責任は最後まで自分で持つことを意識しています。

01
役割分担
プロダクトの方向性・要件・撤退基準は自分が決める。 設計案の比較検討と実装ドラフトは AI 主導、最終判断とレビューは自分。
02
学習量
個人開発で短期間に Firebase Auth、GCP 7 サービス、Terraform、 Cloud Tasks、三層 AI 抽出まで踏み込めた。 AI に何をどこまで任せるかの線引きを実プロダクトで体感。
03
責任の取り方
本番デプロイ・課金管理・トラブル対応・セキュリティ判断は すべて自分の責任として進めた。AI 任せで分からないままの場所を 残さない方針。
Back to Portfolio
他の制作物を見る →