こんにちは。株式会社LiemPiaのtampopo256です。
普段は教育系のWebサービス「clemy」を作ったりしています。
はじめに
構成自体はシンプルだけど、実際に運用してみて感じたポイントや、Cloud Storageを使っている理由、CI/CDの構築についても紹介する。
インフラ選定の要件としては以下のような感じ。
- サーバーレスでスケーラビリティが欲しい
- 運用コストは低く抑えたい
- セキュリティと可用性は犠牲にしない
- 構成が複雑になりすぎない
- GitHubと連携してCI/CDを自動化したい
clemyのアーキテクチャ概要
clemyは、学習者が問題を解いたり進捗を管理したりできるWebアプリ。構成としては以下の通り。
- フロントエンド / バックエンド:Cloud Run
- リレーショナルDB:Cloud SQL(PostgreSQL)
- 問題データの保存:Cloud Storage
全体像はこんな感じ👇
[ Client ]
|
v
[ Cloud Run (FE/BE) ] <--> [ Cloud SQL ]
|
v
[ Cloud Storage ]
Cloud Runを使ってる理由
Cloud RunはコンテナをデプロイするだけでWebサービスが動く、サーバーレスな実行環境。
採用理由
- Dockerベースでアプリを動かせる → ローカルと同じ環境をそのまま本番に
- オートスケーリングがめちゃくちゃ楽 → 負荷がかかっても勝手に伸縮
- Cloud SQLやStorageとの統合が強い → 権限まわりもIAMで完結
ローカルでDocker動くなら、それをgcloud run deploy
するだけ。すごくシンプル。
Cloud SQLを使ってる理由
ユーザーのプロフィール、解答履歴、進捗などを管理するためにCloud SQL(PostgreSQL)を使ってる。
採用理由
- GCPのマネージドDB → バックアップ、自動フェイルオーバー、全部やってくれる
- Cloud Runと連携しやすい → 接続情報をIAMで管理できて安心
- SQLが書ける → クエリで複雑な集計や分析もできる
Cloud Storageを使ってる理由(←ここが重要)
問題データ(問題文、画像、補足資料など)はCloud Storageに置いてる。Cloud SQLに入れないのは理由がある。
なぜCloud SQLに入れないのか?
-
データサイズが大きい
- 問題文だけじゃなくて画像付きの問題とかもあるので、DBに入れると重くなる
-
アクセス頻度が高い
- 複数のユーザーが同じ問題にアクセスすることが多い。Storage経由だとCDNのキャッシュが効く
-
ファイル管理しやすい
- 問題をバージョン管理したいときに、オブジェクト単位で扱える方が都合良い
-
料金が安い
- Cloud SQLに入れてストレージが膨らむより、Storageに置いた方が圧倒的に安い
-
静的配信できる
- Cloud RunからSigned URLを発行して、クライアント側で直接取得させる設計にしてる
GitHubと連携した自動デプロイ(CI/CD)
ブランチ運用と自動更新
clemyでは、GitHubのprod
ブランチにpushされると自動的にCloud Runへデプロイが走るようにしている。CI/CDはGitHub Actionsを使っていて、以下のような構成。
# .github/workflows/deploy.yml
name: Deploy to Cloud Run
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Google Cloud SDK
uses: google-github-actions/setup-gcloud@v1
with:
project_id: ${{ secrets.GCP_PROJECT }}
service_account_key: ${{ secrets.GCP_SA_KEY }}
- name: Deploy to Cloud Run
run: |
gcloud run deploy clemy-app \
--source=. \
--region=asia-northeast1 \
--platform=managed \
--allow-unauthenticated
実運用のメリット
- デプロイ作業の属人化がなくなる
- 間違った状態でデプロイする事故が減る(lint/testも事前に入れてる)
- 開発者がpushするだけで本番に反映される → めちゃくちゃ楽
おわりに
こんな感じで、clemyはGCPのサービスをいい感じに組み合わせて運用してます。あえて言うなら、Cloud Run × Cloud SQL × Cloud Storage + GitHub Actions の組み合わせは中小規模のSaaSにはちょうどいいと思ってる。
機能 | サービス | 理由 |
---|---|---|
アプリのホスティング | Cloud Run | スケーラブルで簡単 |
DB | Cloud SQL | 信頼性・整合性重視 |
問題データ配信 | Cloud Storage | サイズ・キャッシュ・コストに強い |
CI/CD | GitHub Actions | 自動デプロイで開発効率UP |