: LambdaからDynamoDB・RDS・EC2(DB)へ接続する際の構成パターンと注意点まとめ
tags: AWS Lambda DynamoDB RDS EC2
AWSでサーバーレスアーキテクチャを構築する際、データベースの選択肢としてDynamoDBとRDS(およびEC2上のDB)が主戦場となります。
しかし、Lambdaからの接続方法やネットワーク構成、コスト特性はそれぞれ大きく異なります。
本記事では、Lambdaから各データベースへ接続する際の仕様と、設計上のポイントを整理して解説します。
1. Lambda × DynamoDB
サーバーレスの「黄金パターン」です。
接続の仕様
- 接続方法: AWS SDK(boto3, AWS SDK for JavaScriptなど)を使用し、HTTPS API経由で操作します。
- 認証: IAMロールによる実行権限管理。DBのパスワード管理やシークレットの保持は不要です。
利点
- 接続管理が不要: ステートレスなHTTP接続のため、RDSのようなコネクションプールの枯渇を気にする必要がありません。
- スケーラビリティ: リクエスト数に応じてシームレスにスケールし、高スループットにも対応可能です。
- VPC不要: 基本的にパブリックなエンドポイントで動作するため、VPC Lambda特有のオーバーヘッドを回避できます。
料金について
- オンデマンド: 読み込み/書き込みリクエスト単位の課金。予測不可能なトラフィックに向いています。
- プロビジョニング済み: 事前に割り当てたキャパシティユニットに対する課金。
- データストレージ: 保存されているデータ容量に対して課金されます。
2. Lambda × RDS (VPC構成)
リレーショナルデータベースが必要な場合、ネットワーク設計が重要になります。
VPC内への配置が必要な理由
RDSインスタンスは通常、セキュリティのためにVPC内のプライベートサブネットに配置されます。これにアクセスするためには、Lambdaも**VPC内で動作するように設定(VPC Lambda)**しなければなりません。
- 仕様: LambdaにENI(Elastic Network Interface)が付与され、VPC内のプライベートIPで通信可能になります。
- RDS Proxyの推奨: Lambdaは大量に並列実行されるため、DBの最大接続数を即座に消費しがちです。マネージドなコネクションプールを提供する「RDS Proxy」を中間に置くのが定石です。
利点
- 厳密な一貫性: 複雑なトランザクション管理やSQLによる分析が可能です。
- セキュリティ: インターネットに露出させず、VPC内に閉じた通信が完結します。
3. Lambda × EC2上のデータベース
自前で構築したDBサーバーに接続する場合です。
構成のポイント
- VPC Lambdaの必須化: RDSと同様、LambdaをVPC内に配置する必要があります。
- セキュリティグループ: EC2側のセキュリティグループで、Lambdaのセキュリティグループ(またはサブネット)からの特定ポート(MySQLなら3306等)の通信を許可します。
- 管理の煩雑さ: RDS Proxyのようなマネージドな仕組みが使えないため、Lambdaのハンドラー外でコネクションを定義するなどの実装上の工夫がより重要になります。
RDSとの比較
| 項目 | RDS | EC2上のDB |
|---|---|---|
| 運用負荷 | 低(AWSにお任せ) | 高(OS/DBの管理が必要) |
| 接続管理 | RDS Proxyが利用可能 | 自前で制御が必要 |
| 柔軟性 | 標準的 | 非常に高い(プラグイン等) |
4. 構成の比較表
| 特徴 | DynamoDB | RDS (VPC) | EC2 DB (VPC) |
|---|---|---|---|
| スケーリング | 自動・高速 | インスタンス拡張 | インスタンス拡張 |
| ネットワーク | VPC外 (エンドポイント可) | VPC内必須 | VPC内必須 |
| 接続方式 | HTTP API | SQL (常時接続) | SQL (常時接続) |
| 認証方法 | IAM | ID/パスワード | ID/パスワード |
5. まとめ:どれを選ぶべきか?
-
運用を楽に、高速にスケールさせたい
→ DynamoDB。まずはここから検討し、NoSQLで要件を満たせるか考えます。 -
複雑なリレーション、トランザクションが必要
→ RDS。RDS Proxyとセットで構築するのが現代のベストプラクティスです。 -
特殊な設定、ライセンス、既存資産の継続利用
→ EC2上のDB。管理コストは上がりますが、VPC設定さえ正しければLambdaからの接続は可能です。
参考資料
: Lambdaを「バッチ」として捉える:API Gateway/CloudFront構成とDB選択による速度・料金の差
tags: AWS Lambda API-Gateway CloudFront DynamoDB RDS
AWS Lambdaは、リクエストに応じて起動する「イベント駆動型のバッチ処理」と考えることができます。
本記事では、LambdaをAPIとして公開する際のフロントエンド構成(API Gateway / CloudFront)と、後続のデータベース(DynamoDB / RDS)の選択が、全体のパフォーマンスと料金にどう影響するかを解説します。
1. Lambdaの実行形態とフロントエンド構成
Lambda単体ではURLを持ちませんが、以下のサービスと組み合わせることで外部から呼び出し可能になります。
API Gateway + Lambda
標準的な構成です。REST APIやHTTP APIとして公開し、認証やスロットリング(流量制限)を管理します。
CloudFront (CDN) + API Gateway + Lambda
さらにパフォーマンスを追求する場合、CloudFront(CDN)をフロントに置きます。
- エッジでのキャッシュ: 静的なレスポンスをエッジサーバーでキャッシュすることで、Lambdaの起動回数を減らし、ユーザーへのレスポンスを高速化します。
- DynamoDBとの親和性: 後述するDynamoDBをデータソースにする場合、グローバルテーブルと組み合わせることで、世界中から低レイテンシでアクセス可能な「グローバルアプリ」を構築しやすくなります。
2. データベース選択による「後続」のボトルネック
Lambdaの実行速度(レスポンス時間)は、呼び出すデータベースの仕様に大きく依存します。
DynamoDBの場合:圧倒的な初動
- 特徴: HTTP APIベースの接続であるため、接続確立のオーバーヘッドが極めて小さいです。
- レイテンシ: 1桁ミリ秒単位での応答が期待でき、Lambdaの実行時間を短く抑えることができます。
- CDNとの相性: データ構造がシンプルなため、CDNでのキャッシュ戦略が立てやすく、全体として非常に高いパフォーマンスを発揮します。
RDSの場合:VPCとコネクションの壁
RDSを選択すると、以下の理由によりDynamoDBよりも「後続の処理」が遅くなる傾向があります。
- VPCオーバーヘッド: VPC Lambdaとして動作するため、ネットワーク層のホップが増えます。
- TCP接続の確立: RDBは永続的な接続(TCP/IP)を必要とします。Lambdaが起動するたびにハンドシェイクが発生するため、これが「チリツモ」で遅延となります。
- リソースの競合: 同時実行数が増えると、DB側のCPUやメモリを消費し、クエリ応答が目に見えて低下します。
3. アーキテクチャごとの料金の考え方
「安く済む」と思われがちなサーバーレスですが、トラフィックの性質によってコスト構造が変わります。
DynamoDB構成(従量課金メイン)
- メリット: 待機料金がほぼゼロ。リクエストがなければ課金されません。
- デメリット: 書き込み頻度が極端に高い場合、プロビジョニング設定によっては高額になる可能性があります。
RDS構成(固定費 + 接続維持費)
- メリット: データ量が多く、複雑なクエリを大量に投げる場合は、リクエスト単価で見るとRDSの方が安くなるケースがあります。
- デメリット: インスタンスの「時間単位」での課金が発生するため、アクセスがなくても料金がかかります。また、コネクション管理のために RDS Proxy を導入すると、その分の追加料金が発生します。
4. パフォーマンスとコストの比較まとめ
| 構成要素 | DynamoDB構成 | RDS構成 |
|---|---|---|
| フロントエンド | API GW / CloudFront | API GW |
| 接続の速さ | ◎ 極めて速い | △ 接続確立に時間がかかる |
| スケーラビリティ | ◎ ほぼ無限 | ○ インスタンスサイズに依存 |
| 料金体系 | 従量課金(リクエスト単位) | 固定費(インスタンス単位) + RDS Proxy |
結論:どちらを選ぶべきか
DynamoDB + CloudFront が向いているケース
- 読み取りが多く、世界中から高速なレスポンスが求められるAPI。
- アクセスの増減が激しく、インフラを自動でスケールさせたい場合。
- 料金を「使った分だけ」に抑えたいプロジェクト。
RDS が向いているケース
- 複雑な集計やテーブル結合(JOIN)が必須な業務システム。
- 一定以上の常時アクセスがあり、固定のインスタンス費用を払った方が安上がりになる大規模システム。
- ただし、Lambdaからの接続遅延を許容するか、RDS Proxyによる緩和策を講じる必要があります。
: Lambda × FastAPI で構築する高速APIと、CloudFrontによるエッジ最適化戦略
tags: AWS Lambda FastAPI CloudFront Python Serverless
モダンなPythonエンジニアの間で人気の高い FastAPI をAWS Lambdaで動かす構成は、開発効率とパフォーマンスのバランスが非常に優れています。
本記事では、この構成をさらに加速させるための CloudFront (CDN) エッジ構成 との組み合わせについて解説します。
1. Lambda × FastAPI (Mangum) の基本構成
Lambdaは本来、単一の関数を実行するものですが、アダプターライブラリである Mangum を使用することで、FastAPI(ASGIアプリ)をそのまま動かすことができます。
構成のメリット
- 型安全とバリデーション: Pydanticによる強力な型定義と自動バリデーションが利用可能。
-
自動ドキュメント生成:
/docsにアクセスするだけで Swagger UI が利用できる。 -
ローカル開発:
uvicornを使ってローカルで高速にデバックが可能。
実装イメージ
from fastapi import FastAPI
from mangum import Mangum
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello from FastAPI on Lambda!"}
# Lambdaが理解できる形式に変換
handler = Mangum(app)
## 【補足】Mangum(app) の内部動作と実行パフォーマンス
`handler = Mangum(app)` と記述した際、Lambda のランタイムで実際に何が起きているのか、処理のステップと推定されるレイテンシ(参考値)をコメントで解説します。
### 内部処理のフローと実行時間の目安
```python
from fastapi import FastAPI
from mangum import Mangum
import time
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int):
# ここは純粋なロジック処理
return {"item_id": item_id}
# 1. アダプターの初期化(Cold Start時に1回実行)
# 内部でFastAPIのASGImiddlewareをラップします
handler = Mangum(app)
def lambda_handler(event, context):
"""
AWS Lambdaがイベントを受け取った際の内部挙動イメージ
"""
# [Step 1] API Gateway/ALB イベントのパース (約 0.1ms - 0.5ms)
# MangumがAWS独自のイベント形式をASGIスコープに変換します。
# [Step 2] FastAPI(ASGI) アプリの呼び出し (約 1ms - 5ms *ロジック除く)
# Mangumが変換したスコープをFastAPIに渡し、ルーティングを開始します。
# [Step 3] FastAPI 内の処理 (item_idのバリデーション等) (約 0.5ms - 2ms)
# Pydanticによる型チェックなどのオーバーヘッドです。
# [Step 4] レスポンスの逆変換 (約 0.1ms - 0.5ms)
# FastAPIのレスポンスをAPI Gatewayが解釈できるJSON形式にMangumが戻します。
return handler(event, context)
AWS Lambda データベース接続 & アーキテクチャ最適化ガイド
本ドキュメントでは、Lambdaを用いたサーバーレス開発において、DynamoDB/RDSの選択基準から、FastAPIを利用したモダンな実装、CloudFront(CDN)によるエッジ最適化までを体系的にまとめています。
1. データベース接続パターンと仕様
Lambdaからデータベースに接続する際、選択肢によってネットワーク構成とスケーラビリティが大きく異なります。
1-1. Lambda × DynamoDB
- 接続仕様: AWS SDKを使用したHTTPS API経由。
-
メリット: * VPC不要。コールドスタートの影響を最小限に抑えられる。
- IAMによる権限管理でパスワード不要。
- 接続管理(コネクションプール)を気にする必要がない。
- 料金: 読み書きユニット(RCU/WCU)による従量課金。
1-2. Lambda × RDS (VPC構成)
- 接続仕様: VPC内への配置が必須。RDS Proxyの使用を強く推奨。
- メリット: 複雑なトランザクション、SQLによる分析が可能。
-
注意点: * VPC LambdaによるENI作成のオーバーヘッド。
- DBの最大接続数を消費しやすいため、スケーリング時に注意が必要。
1-3. Lambda × EC2上のデータベース
- 接続仕様: RDSと同様にVPC内配置。セキュリティグループでポート開放が必要。
- 注意点: マネージドなRDS Proxyが使えないため、アプリケーション側でのコネクション管理がよりシビアになります。
2. API構成:FastAPI × Mangum
Pythonで高速なWeb APIを構築する場合、FastAPI とアダプターの Mangum を組み合わせるのがデファクトスタンダードです。
実装例
from fastapi import FastAPI
from mangum import Mangum
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello from FastAPI on Lambda!"}
# AWSイベントをASGIプロトコルに変換するハンドラー
handler = Mangum(app)
実行時の内部オーバーヘッド(参考値)
| 処理フェーズ | 推定時間 | 内容 |
|---|---|---|
| イベントパース | ~0.5ms | AWSイベント ⇄ ASGIスコープ変換 |
| Mangum 変換 | ~1ms | フレームワークへの橋渡し |
| FastAPI 処理 | ~2ms | ルーティング・バリデーション |
| 合計 | 数ms程度 | ウォームスタート時の増分 |
3. CloudFrontによるエッジ構成の導入
フロントにCloudFrontを置くことで、エッジロケーションでの最適化が可能になります。
なぜCDN(CloudFront)を置くのか?
-
静的キャッシュ
頻繁に変わらないレスポンスをキャッシュし、Lambdaの起動をスキップ -
TLS終端の高速化
ユーザーに近いエッジでSSLハンドシェイクを完了 -
セキュリティ
AWS ShieldによるDDoS保護
【重要】後続処理による速度低下の罠
CDNを導入しても、後続のDB処理(特にRDSなど)で時間がかかってしまうと、
エッジでの高速化メリットは完全に相殺されます。
バックエンドに遅延がある場合、CDNのキャッシュヒット率が低いと導入効果が激減します。
4. パフォーマンス最大化のポイント
コールドスタート対策
- Provisioned Concurrency
常にインスタンスをウォームアップしておき、即時起動を実現
データベースの最適化
- DynamoDBが最適
- VPC接続の待ち時間がない
- HTTP接続で即座にデータを取得できる
- エッジでの低レイテンシを維持
5. 料金とトレードオフまとめ
| 構成 | パフォーマンス | コスト | 管理負荷 |
|---|---|---|---|
| API Gateway + Lambda | 標準 | 低(使った分だけ) | 低 |
| CF + API GW + Lambda | 高(キャッシュ時) | 中(CF費用追加) | 中 |
| + Provisioned Concurrency | 最高(即時起動) | 高(固定費発生) | 中 |
6. 結論:アーキテクチャ選定指針
爆速・グローバル配信を目指すなら
CloudFront + API Gateway + Lambda (FastAPI) + DynamoDB
- 接続レイテンシをミリ秒単位で削減
- サーバーレスの最強構成
複雑な業務ロジック・RDBが必要なら
API Gateway + Lambda (VPC) + RDS Proxy + RDS
- CDNは主に静的ファイル配信に使用
- API自体の高速化は以下で対応
- DBインデックス最適化
- キャッシュ層(ElastiCacheなど)