ひとことで言うと#
サーバーのプロビジョニングや管理をクラウドに任せ、関数(Function)単位でコードを実行するアーキテクチャ。使った分だけ課金され、リクエストに応じて自動スケールする。
押さえておきたい用語#
- FaaS(Function as a Service)
- コードを関数単位でデプロイし、イベントをトリガーに実行するサービス形態。AWS Lambda、Google Cloud Functions、Azure Functionsが代表的。
- コールドスタート
- 一定時間リクエストがなかった関数を再起動する際に発生する初期化の遅延。数百ms〜数秒かかることがある。
- イベントソース
- 関数の実行をトリガーするサービスやイベント。API Gateway、S3、SQS、スケジュールイベントなど。
- Provisioned Concurrency
- コールドスタートを回避するために、関数のインスタンスを事前にウォーム状態で待機させる設定。レイテンシ要件が厳しい場面で使用。
- Lambda Layer
- 複数の関数で共有するライブラリや共通コードをレイヤーとして切り出す仕組み。デプロイサイズの削減と再利用性を向上させる。
サーバーレスアーキテクチャの全体像#
こんな悩みに効く#
- サーバーの管理(パッチ適用、スケーリング、監視)に工数を取られている
- トラフィックの変動が大きく、常時稼働のサーバーではコスト効率が悪い
- MVPを素早く作ってリリースしたいが、インフラ構築に時間をかけたくない
基本の使い方#
サーバーレスが得意な領域を理解する。
- イベント駆動処理(ファイルアップロード、メッセージキュー、Webhook)
- 非同期のバッチ処理(画像変換、データ集計)
- API バックエンド(REST / GraphQL)
- 逆に不向き:長時間実行、常時接続(WebSocket)、低レイテンシ必須
ポイント: サーバーレスは万能ではない。向き不向きを見極めてから採用する。
1つの関数=1つの責務で設計する。
- 関数はできる限り小さく、単一の処理に集中させる
- コールドスタートを考慮し、初期化処理を最小限にする
- 共通処理はレイヤー(Lambda Layer等)に切り出す
ポイント: 「マイクロサービスよりさらに小さい単位」で考える。
何をきっかけに関数が実行されるかを定義する。
- API Gateway → HTTP リクエストで起動
- S3 → ファイルアップロードで起動
- SQS/SNS → メッセージ受信で起動
- CloudWatch Events → スケジュール実行
ポイント: イベントソースの選択がアーキテクチャ全体の設計を左右する。
サーバーレス特有の運用課題に対応する。
- 分散トレーシング(X-Ray等)でリクエストの流れを可視化する
- コールドスタートの頻度とレイテンシを監視する
- コスト監視を設定し、予想外の課金を防ぐ
ポイント: サーバーがなくても運用はなくならない。監視の仕方が変わるだけ。
具体例#
要件: ユーザーがアップロードした画像を、サムネイル・中サイズ・大サイズの3種類にリサイズする。
構成:
- ユーザーが S3 バケットに画像をアップロード
- S3 イベントが Lambda 関数をトリガー
- Lambda 関数が画像を3サイズにリサイズし、別の S3 バケットに保存
- リサイズ完了後、SNS で通知を発行
結果: EC2で常時稼働させていた場合と比較して、月額コストが85%削減(月$420→$63)。ピーク時に1,000枚が同時アップロードされても処理遅延なし。インフラ管理の工数が月20時間→ほぼゼロに。
状況: 3人のエンジニアチームでBtoB SaaSのMVPを最速でリリースしたい。インフラ専任者はいない。
構成:
- API Gateway + Lambda(TypeScript)でRESTful API
- DynamoDBでデータ保存
- Cognito でユーザー認証
- Serverless Framework でIaC管理
開発タイムライン:
- 1週目: 認証 + CRUD API(Lambda 12関数)
- 2週目: フロントエンド連携 + デプロイパイプライン構築
結果: 14日間でMVPをリリース。初月のインフラコストは**$8.50**。ユーザー数が100→5,000に増加しても設定変更なしで自動スケール。EC2構成だと見積もり月$350以上。
状況: 毎日深夜に実行するデータ集計バッチが、EC2 m5.xlarge(月$140)で24時間稼働。実際の処理時間は45分。
移行:
- バッチ処理をLambda関数に分割(データ取得・変換・集計・通知の4関数)
- Step Functionsでワークフローを制御
- EventBridge で毎日AM2:00に起動
結果: 月額コストが**$140→$4.20**に削減(97%減)。処理時間も45分→22分に短縮(Lambda並列実行のおかげ)。サーバーのパッチ適用作業が不要になり、年間約30時間の運用工数を削減。
やりがちな失敗パターン#
- コールドスタートを無視する — 一定時間リクエストがないと関数が破棄され、次回起動時に数百ms〜数秒の遅延が発生する。レイテンシが重要な場面ではProvisioned Concurrencyを検討すること
- 関数間の依存を複雑にしすぎる — 関数が別の関数を直接呼び出す連鎖が長くなると、デバッグが困難になる。イベントキューを介して疎結合にすること
- ベンダーロックインを軽視する — AWS Lambda固有のAPIに依存しすぎると、他のクラウドに移行できなくなる。ビジネスロジックはクラウド固有APIから分離すること
- コスト監視を怠る — 無限ループやリトライストームで予想外の課金が発生するケースがある。コストアラートを設定し、同時実行数の上限を必ず設けること
まとめ#
サーバーレスはインフラ管理の負担を大幅に削減し、イベント駆動で自動スケールする強力なアーキテクチャ。ただし、コールドスタートやベンダーロックインなどの課題も理解した上で採用すべき。向いているユースケースを見極め、小さく始めて効果を実感しよう。