3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

こんにちは。株式会社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に入れないのか?

  1. データサイズが大きい

    • 問題文だけじゃなくて画像付きの問題とかもあるので、DBに入れると重くなる
  2. アクセス頻度が高い

    • 複数のユーザーが同じ問題にアクセスすることが多い。Storage経由だとCDNのキャッシュが効く
  3. ファイル管理しやすい

    • 問題をバージョン管理したいときに、オブジェクト単位で扱える方が都合良い
  4. 料金が安い

    • Cloud SQLに入れてストレージが膨らむより、Storageに置いた方が圧倒的に安い
  5. 静的配信できる

    • 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
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?