PR

AWS SAM × FastAPI × Stripe × Cognito で作るミニマルSaaS構築ガイド

AWS SAM × FastAPI × Stripe × Cognito で作るミニマルSaaS構築ガイド

この記事では、AWS SAM(Serverless Application Model)と FastAPI を用いた「SaaSスターターキット」の構築手順を詳しく解説します。Stripeによる課金機能、Cognitoによるユーザー認証を組み合わせ、最小構成で立ち上げ・収益化可能なSaaSの基盤を作成します。


✅ 概要

本構成は以下の技術スタックで構成されています:

要素使用技術
APIバックエンドFastAPI(Python)
認証AWS Cognito
課金Stripe(Subscription)
インフラ構築/デプロイAWS SAM(Lambda + API Gateway)

このスターターキットは以下のニーズを満たすことを目的としています:

  • 初期コストを抑えて高速に立ち上げたい
  • 認証・課金を自動化したSaaSを作りたい
  • ローカル開発と本番環境を統一したい

📁 ディレクトリ構成とファイル説明

.
├── README.md                # 概要説明
├── template.yaml            # SAMテンプレート
├── src
│   ├── app
│   │   ├── main.py          # FastAPI エントリポイント
│   │   ├── auth.py          # 認証(Cognito JWT検証)
│   │   └── billing.py       # Stripe課金処理
│   └── requirements.txt     # 依存パッケージ
├── events
│   └── event.json           # ローカルテスト用
├── tests
│   └── test_main.py         # テストコード(未実装)

🚀 ステップバイステップ解説

① 環境準備

  • Python 3.9+
  • AWS CLI, AWS SAM CLI
  • Stripeアカウント(テスト用でも可)

インストール:

brew install aws-sam-cli
pip install fastapi uvicorn stripe

② FastAPIアプリの作成(src/app/main.py

from fastapi import FastAPI, Depends
from .auth import verify_token
from .billing import create_checkout_session

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello from SaaS Starter"}

@app.get("/secure")
def secure_endpoint(user=Depends(verify_token)):
    return {"message": f"Authenticated as {user['email']}"}

@app.post("/billing")
def billing():
    session_url = create_checkout_session()
    return {"url": session_url}

③ Stripe課金の実装(billing.py

import stripe
import os

stripe.api_key = os.environ.get("STRIPE_SECRET_KEY", "sk_test_...")

def create_checkout_session():
    session = stripe.checkout.Session.create(
        payment_method_types=["card"],
        mode="subscription",
        line_items=[{
            "price": "price_1234567890abcdef",
            "quantity": 1
        }],
        success_url="https://example.com/success",
        cancel_url="https://example.com/cancel",
    )
    return session.url

ここでの price_1234567890abcdef は Stripe ダッシュボードで事前に作成したサブスクリプション価格IDです。


④ 認証処理(auth.py

# 仮の認証(開発中はモック)
def verify_token():
    return {"email": "test@example.com"}  # 開発中は固定で返す

本番では Cognito JWTトークンを pycognitopython-jose を使って検証します。


⑤ SAM テンプレート(template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  AppFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/
      Handler: app.main.app
      Runtime: python3.9
      Events:
        ApiRoot:
          Type: Api
          Properties:
            Path: /
            Method: get
        Secure:
          Type: Api
          Properties:
            Path: /secure
            Method: get
        Billing:
          Type: Api
          Properties:
            Path: /billing
            Method: post

✅ デプロイ手順

sam build
sam deploy --guided

テスト:

sam local invoke "AppFunction" -e events/event.json

💰 マネタイズ戦略に組み込むには?

このスターターは以下の応用が可能です:

  • レポート生成API(CSV → PDF)
  • データ分析結果の月額課金提供
  • API呼び出し回数での従量課金

Stripeの webhook を連携させれば、ユーザー解約検知や課金失敗対応も自動化可能です。


📚 参考文献


🔁 まとめ

このスターターをもとに「最小構成 → MVP → 自動化・課金 → 拡張展開」という成長パスを辿ることができます。テンプレ化・再利用しやすい構成なので、次のSaaSも簡単に派生可能です。


コメント

タイトルとURLをコピーしました