コスパ最強の 開発構成|DB・サーバー・ LLMまで 運用費を 抑える 選び方
「予算は限られているけれど、ちゃんと動くものを作りたい」。中小企業や個人事業の方から最も多くいただく相談です。開発費だけでなく、公開後に毎月かかる運用費をどう抑えるかが、長く使えるシステムにできるかどうかの分かれ目になります。
この記事では、配信・処理・データベース・サーバー・LLMの要素ごとに、運用費を抑える選び方を解説します。
運用費を 抑える 基本の 考え方は?
結論は、使われた分だけ払うサービスを組み合わせ、常時稼働のサーバーを持たないことです。
従来は、Webサーバーとデータベースサーバーを24時間動かし続けるのが一般的でした。しかし中小規模のシステムは、ほとんどの時間アクセスがありません。それでも常時稼働のサーバーは、使われていない時間の分まで費用がかかります。
そこで次の3原則で考えます。
- 常時動かさない:リクエストがあったときだけ動く仕組み(サーバーレス)にする
- 既存サービスに任せる:認証・決済・メール・DBの運用は、専門のマネージドサービスを使う
- 上限を決める:従量課金は青天井になりうるため、利用上限と請求アラートを必ず設定する
規模ごとの おすすめ構成は?
| 規模・用途 | 構成例 | 運用費の目安 |
|---|---|---|
| 会社サイト・LP・ブログ | Cloudflare Pages(静的配信のみ) | 無料枠に収まることが多い |
| 小規模な業務システム・予約・フォーム | Cloudflare Workers + D1 + R2 | 無料枠〜少額 |
| 中規模のWebサービス | Workers または AWS Lambda + Supabase / Neon(PostgreSQL) | 少額〜数万円程度 |
| 常時処理・長時間処理がある | Cloud Run / ECS などのコンテナ + マネージドDB | 処理量に応じて増える |
料金と無料枠はサービスごとに頻繁に変わるため、採用前に必ず公式の料金ページで試算してください。
画面の 配信は どうするか?
会社案内やサービス紹介のように、アクセスのたびに内容が変わらないページは、HTMLを事前に作っておく静的サイトにします。配信先は次のような選択肢があります。
| 配信先 | 特徴 |
|---|---|
| Cloudflare Pages | 静的配信は無料枠が大きく、CDNも標準。Workersとの連携がしやすい |
| Vercel | Next.jsとの相性がよい。商用利用は有料プランが前提 |
| AWS S3 + CloudFront | AWSで統一したい場合に。転送量に応じた従量課金 |
どれを選んでも静的配信の費用は小さいため、処理やDBをどこに置くかに合わせて選ぶのがおすすめです。
処理 (API)はどこで 動かすか?
フォームの受付、予約の登録、外部サービスとの連携など、データを処理する部分はサーバーレスで動かします。
| サービス | 向いている用途 | 注意点 |
|---|---|---|
| Cloudflare Workers | 軽いAPI、認証の前処理、Webhookの受信 | 1回あたりのCPU時間に制限がある。重い計算には向かない |
| AWS Lambda | AWSの他サービス(S3・DynamoDB・SQS)と連携する処理 | API Gateway経由だと応答時間に上限がある |
| Google Cloud Run | 既存のアプリをコンテナのまま動かしたい場合 | アクセスがないときは0台まで縮小できるが、起動に時間がかかることがある |
Cloudflare WorkersとD1を組み合わせると、APIとDBを同じ場所で動かせます。
name = "reservation-api"
main = "src/index.ts"
compatibility_date = "2026-10-01"
[[d1_databases]]
binding = "DB"
database_name = "reservation"
database_id = "<D1のID>"export default {
async fetch(request: Request, env: { DB: D1Database }) {
const { results } = await env.DB
.prepare('SELECT id, name, date FROM reservations WHERE date = ?')
.bind(new URL(request.url).searchParams.get('date'))
.all();
return Response.json(results);
},
};データベースは どうするか?
DBは、常時稼働のDBサーバーを自分で持たないのが基本です。用途に応じて次から選びます。
| DB | 種類 | 向いている用途 |
|---|---|---|
| Cloudflare D1 | SQLiteベースのRDB | Workersと組み合わせた小〜中規模のシステム |
| Supabase | PostgreSQL + 認証・ストレージ | 管理画面や認証もまとめて欲しい場合 |
| Neon | サーバーレスPostgreSQL | 使われていないときは自動で停止し、費用を抑えたい場合 |
| Amazon DynamoDB | NoSQL | AWSで大量の読み書きがある、アクセスパターンが決まっている場合 |
選ぶときのポイントは次の3つです。
- データの関係が複雑ならRDB(D1・Supabase・Neon):予約と会員と店舗のように、データ同士の関係が多い業務システムはRDBが扱いやすい
- バックアップと復元を確認する:自動バックアップの有無と保持期間は、サービスやプランで異なる
- 接続数に注意する:サーバーレスから従来型のDBにつなぐと、同時接続数の上限に当たりやすい。サーバーレス向けの接続方式があるDBを選ぶ
ファイル(画像・PDFなど)は、DBではなくオブジェクトストレージに置きます。Cloudflare R2は外部への転送料金(egress)がかからないため、画像や資料の配信が多いシステムでは費用を大きく抑えられます。
常時稼働の サーバーが 必要な 場合は?
サーバーレスが向かないケースもあります。
- 長時間の処理:数分〜数時間かかる集計・変換・バッチ処理
- 常時接続:WebSocketによるリアルタイム通信、チャット
- 常に負荷がかかる:24時間絶えずリクエストが来る
- 既存のアプリを動かしたい:PHPやRailsなど、すでにあるアプリをそのまま移したい
この場合は、次の順で検討します。
- 処理を分ける:重い処理だけをキュー(Cloudflare QueuesやAmazon SQS)に回し、非同期で実行する。画面側はサーバーレスのまま保てる
- コンテナで動かす:Cloud RunやAWS ECS(Fargate)など、必要な分だけ動くコンテナ実行環境を使う
- 小さなVPSを使う:常時負荷がある場合は、月額固定のVPSの方が安くなることもある。ただしOSの更新・監視・バックアップは自分で行う必要がある
リアルタイム通信だけが目的なら、Cloudflare Durable ObjectsのようにサーバーレスのままWebSocketを扱える仕組みもあります。
LLM (生成AI)を 使う 場合は?
LLMは、最も費用が読みにくい要素です。入力と出力のトークン数に応じた従量課金のため、使われ方次第で費用が大きく変わります。
自前で GPUを 持たない
自社でLLMを動かすには高価なGPUサーバーが必要で、中小規模では割に合いません。OpenAI・Anthropic・GoogleなどのAPIを従量課金で使うのが基本です。
費用を 抑える 工夫
| 工夫 | 内容 |
|---|---|
| モデルの使い分け | 分類や要約などの簡単な処理は小型で安いモデル、難しい推論だけ高性能モデルを使う |
| プロンプトキャッシュ | 毎回同じ長い指示文や資料を送る場合、APIのキャッシュ機能で入力の費用を下げる |
| 回答のキャッシュ | よくある質問への回答は保存して使い回す |
| 出力の上限 | 最大出力トークン数を設定し、長すぎる回答を防ぐ |
| 利用制限 | 利用者ごとの回数制限を設ける |
Cloudflare AI Gatewayを経由させると、複数のLLMへの呼び出しを一か所で記録し、キャッシュや回数制限をかけられます。
const cached = await cache.get(questionKey);
if (cached) return cached; // 同じ質問はLLMを呼ばない
const model = isSimpleTask(question) ? SMALL_MODEL : LARGE_MODEL;
const answer = await callLlm({ model, prompt: question, maxTokens: 800 });
await cache.set(questionKey, answer, { ttl: 60 * 60 * 24 });
return answer;必ず 上限と アラートを 設定する
LLMのAPIは、不正利用やバグによる無限ループで一晩で想定外の請求になることがあります。APIキーは必ずサーバー側に置き、各サービスの利用上限と請求アラートを最初に設定しておきましょう。
安さを 優先してはいけない 部分は?
| 削ってよい | 削ってはいけない |
|---|---|
| 常時稼働のサーバー | データ設計 |
| 使われない機能 | セキュリティ対策(入力チェック・権限・APIキーの管理) |
| 手作業のデプロイ・運用 | バックアップと復元の確認 |
| 自作の認証・決済 | 個人情報の取り扱い |
特に認証と決済は自作しないことが大切です。LINEログイン、Supabase Auth、決済代行サービスなど、実績のある仕組みを使う方が安全で、結果的に安くなります。
費用の 落とし穴は?
- 転送量(egress):ファイル配信が多いと、ストレージ代より転送料金が高くなることがある
- 無料プランの条件:一定期間使われないと停止する、商用利用に制限があるなどの条件がある
- 従量課金の青天井:アクセス急増やバグで費用が跳ね上がる。上限とアラートで防ぐ
- 乗り換えにくさ:特定サービス独自の機能に依存しすぎると、移行が難しくなる。データは標準的な形式で持っておく
データベースの費用をさらに詳しく知りたい方は、データベース構築の費用相場とデータベースを無料で運用する方法|Supabase無料プランの制限と注意点もあわせてご覧ください。
まとめ
- 運用費を抑える基本は、使われた分だけ払うサービスを組み合わせること
- 小規模ならCloudflare(Workers・D1・R2)で、配信からDB・ファイルまで安くまとめられる
- 常時処理はキューやコンテナに分け、LLMはモデルの使い分け・キャッシュ・上限設定で費用を管理する
- データ設計・セキュリティ・バックアップには費用をかける
スエキチシステムでは、予算と使われ方に合わせた構成のご提案から承ります。お気軽にご相談ください。
よくある質問
サーバーレスは本当に安いのですか?
アクセスが少ない、または波がある場合は大幅に安くなる傾向があります。一方、24時間絶えず処理が走る場合は、従量課金の合計が常時稼働のサーバーを上回ることがあります。月間のリクエスト数と処理時間から試算して判断します。
データベースは何を選べばよいですか?
小規模でCloudflareを使うならD1、PostgreSQLの機能や管理画面が欲しいならSupabaseやNeon、AWSで大量の読み書きがあるならDynamoDBが候補です。どれも無料枠や使った分だけの料金体系があり、常時稼働のRDBサーバーを持つより安く始められます。
LLMの費用が想定より膨らむのを防ぐには?
用途ごとに安いモデルと高性能モデルを使い分け、同じ質問への回答はキャッシュし、出力トークン数の上限と利用者ごとの回数制限を設けます。さらにAPIの利用上限と請求アラートを設定しておくと、想定外の請求を防げます。
無料枠だけで運用できますか?
社内ツールや小規模サイトなら無料枠に収まることも多いです。ただし無料プランには、一定期間使われないと停止する、商用利用に制限があるなどの条件がある場合があるため、本番運用では各サービスの規約を確認してください。
システム開発の
要件が固まっていなくても大丈夫です。まずはお気軽にご相談ください。