

# Lambda ベースのアプリケーションのデータベースサービスを選択する
<a name="ddb-rds-database-decision"></a>

多くのサーバーレスアプリケーションは、データを保存および取得する必要があります。AWS には、Lambda 関数で動作する複数のデータベースオプションが用意されています。最も一般的な選択肢は、NoSQL データベースサービスである Amazon DynamoDB と、従来のリレーショナルデータベースソリューションである Amazon RDS の 2 つです。以下のセクションでは、Lambda で使用する際のこれらのサービスの主な違いについて説明します。これは、サーバーレスアプリケーションに適したデータベースサービスを選択するのに役立ちます。

AWS が提供する他のデータベースサービスの詳細を確認し、そのユースケースとトレードオフをより一般的に理解するには、「[Choosing an AWS database service](https://docs.aws.amazon.com/decision-guides/latest/databases-on-aws-how-to-choose/databases-on-aws-how-to-choose.html)」を参照してください。すべての AWS データベースサービスは Lambda と互換性がありますが、すべてのサービスが特定のユースケースに適しているとは限りません。

## Lambda を使用するデータベースサービスを選択する場合、どのような選択肢がありますか。
<a name="w2aac15c59d101c19b9"></a>

AWS は、複数のデータベースサービスを提供しています。サーバーレスアプリケーションの場合、最も一般的な選択肢は DynamoDB と Amazon RDS の 2 つです。
+ **DynamoDB** は、サーバーレスアプリケーション用に最適化されたフルマネージド NoSQL データベースサービスです。シームレスなスケーリングと 1 桁ミリ秒の安定したパフォーマンスをあらゆる規模で提供します。
+ **Amazon RDS** は、MySQL や PostgreSQL などの複数のデータベースエンジンをサポートするマネージドリレーショナルデータベースサービスです。マネージドインフラストラクチャで使い慣れた SQL 機能を提供します。

## 要件が既にわかっている場合の推奨事項
<a name="w2aac15c59d101c19c11"></a>

要件が既に明確な場合は、基本的な推奨事項を以下に示します。

一貫した低レイテンシーのパフォーマンスや自動スケーリングが必要で、複雑な結合やトランザクションが不要なサーバーレスアプリケーションには、[DynamoDB](with-ddb.md) をお勧めします。サーバーレスであるため、特に Lambda ベースのアプリケーションに適しています。

[Amazon RDS](services-rds.md) は、複雑な SQL クエリや結合が必要な場合、またはリレーショナルデータベースを使用する既存のアプリケーションがある場合に適しています。ただし、Lambda 関数を Amazon RDS に接続するには追加の設定が必要であり、コールドスタート時間に影響する可能性があることに注意してください。

## データベースサービスを選択する際の考慮事項
<a name="w2aac15c59d101c19c13"></a>

Lambda アプリケーション用に DynamoDB または Amazon RDS を選択するときは、次の要素を考慮してください。
+ 接続管理とコールドスタート
+ データアクセスパターン
+ クエリの複雑さ
+ データ整合性の要件
+ スケーリング特性
+ コストモデル

これらの要因を理解することで、特定のユースケースのニーズに最適なオプションを選択できます。

### 接続管理とコールドスタート
<a name="w2aac15c59d101c19c13b9b1"></a>
+ DynamoDB は、すべてのオペレーションに HTTP API を使用します。Lambda 関数は、接続を維持せずに即時リクエストを行うことができ、コールドスタートのパフォーマンスが向上します。各リクエストは、接続オーバーヘッドなしで AWS 認証情報を使用して認証されます。
+ Amazon RDS では、従来のデータベース接続を使用するため、接続プールの管理が必要です。新しい Lambda インスタンスが接続を確立する必要があるため、コールドスタートに影響する可能性があります。接続プーリング戦略を実装し、場合によっては [Amazon RDS Proxy](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.html) を使用して接続を効果的に管理する必要があります。Amazon RDS Proxy を使用すると追加料金が発生することに注意してください。

### データアクセスパターン
<a name="w2aac15c59d101c19c13b9b3"></a>
+ DynamoDB は、既知のアクセスパターンと単一テーブルの設計に最適です。これは、プライマリキーまたはセカンダリインデックスに基づいたデータへの一貫した低レイテンシーアクセスを必要とする Lambda アプリケーションに最適です。
+ Amazon RDS は、複雑なクエリやアクセスパターンの変更に柔軟に対応します。Lambda 関数が複数のテーブルに対して一意のカスタマイズされたクエリまたは複雑な結合を実行する必要がある場合に適しています。

### クエリの複雑さ
<a name="w2aac15c59d101c19c13b9b5"></a>
+ DynamoDB は、シンプルなキーベースのオペレーションや事前定義されたアクセスパターンにおいて優れた力を発揮します。複雑なクエリはインデックス構造を中心に設計する必要があり、結合はアプリケーションコードで処理する必要があります。
+ Amazon RDS は、結合、サブクエリ、集計を含む複雑な SQL クエリをサポートします。これにより、複雑なデータオペレーションが必要な場合に Lambda 関数コードを簡素化できます。

### データ整合性の要件
<a name="w2aac15c59d101c19c13b9b7"></a>
+ DynamoDB は、結果整合性オプションと強力な整合性オプションの両方を提供し、1 つの項目の読み取りで強力な整合性を利用できます。トランザクションはサポートされていますが、いくつかの制限があります。
+ Amazon RDS は、完全なアトミック性、一貫性、分離性、耐久性 (ACID) コンプライアンスと複雑なトランザクションのサポートを提供します。Lambda 関数で複雑なトランザクションが必要な場合や、複数のレコード間で強力な整合性が必要な場合は、Amazon RDS の方が適していることがあります。

### スケーリング特性
<a name="w2aac15c59d101c19c13b9b9"></a>
+ DynamoDB はワークロードに合わせて自動的にスケーリングされます。事前プロビジョニングなしで Lambda 関数からのトラフィックの急増に対処できます。オンデマンドキャパシティモードを使用すると、Lambda のスケーリングモデルと完全に一致させて、使用した分のみの支払いにできます。
+ Amazon RDS には、選択したインスタンスサイズに基づいた固定容量があります。複数の Lambda 関数が同時に接続しようとすると、接続クォータを超える可能性があります。接続プールを慎重に管理し、場合によっては再試行ロジックを実装する必要があります。

### コストモデル
<a name="w2aac15c59d101c19c13b9c11"></a>
+ DynamoDB の料金体系は、サーバーレスアプリケーションに適しています。オンデマンド容量では、Lambda 関数によって実行された実際の読み取りと書き込みに対してのみ料金が発生します。アイドル時間には料金はかかりません。
+ Amazon RDS では、使用状況に関係なく、実行中のインスタンスに対して課金されます。これは、サーバーレスアプリケーションで一般的な散発的なワークロードではコスト効率が低下する可能性があります。ただし、使用量が一貫している高スループットのワークロードでは、より経済的になる可能性があります。

## 選択したデータベースサービスの開始方法
<a name="w2aac15c59d101c19c15"></a>

DynamoDB と Amazon RDS の選択基準とその主な違いについて確認した後は、ニーズに最適なオプションを選択し、以下のリソースを使用して利用を開始できます。

------
#### [ DynamoDB ]

**以下のリソースを使用して DynamoDB の使用を開始する**
+ DynamoDB サービスの概要については、「*Amazon DynamoDB デベロッパーガイド*」の「[DynamoDB とは](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)」を参照してください。
+ 「[チュートリアル: API Gateway で Lambda を使用する](services-apigateway-tutorial.md)」に従って、Lambda 関数を使用して、API リクエストに応答して DynamoDB テーブルで CRUD オペレーションを実行する例を確認してください。
+ AWS SDK のいずれかを使用して Lambda 関数内から DynamoDB にアクセスする方法の詳細については、「*Amazon DynamoDB デベロッパーガイド*」の「[DynamoDB と AWS SDK を使用したプログラミング](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.html)」を参照してください。

------
#### [ Amazon RDS ]

**以下のリソースを使用して Amazon RDS の使用を開始する**
+ Amazon RDS サービスの概要については、「*Amazon Relational Database Service ユーザーガイド*」の「[Amazon Relational Database Service (Amazon RDS) とは](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html)」を参照してください。
+ 「*Amazon Relational Database Service ユーザーガイド*」の「[チュートリアル: Lambda 関数を使用して Amazon RDS にアクセスする](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-lambda-tutorial.html)」に従ってください。
+ Amazon RDS での Lambda の使用の詳細については、「[Amazon RDS で AWS Lambda 使用する](services-rds.md)」を参照してください。

------