

# Lambda での DynamoDB ストリームの使用に関するベストプラクティス
<a name="Streams.Lambda.BestPracticesWithDynamoDB"></a>

AWS Lambda 関数は、他の関数から分離された実行環境である*コンテナ*内で実行されます。この関数を初めて実行すると、AWS Lambda は新しいコンテナを作成し、関数のコードを実行し始めます。

Lambda 関数には、コールごとに 1 回実行される*ハンドラ*があります。ハンドラには、関数用の主要なビジネスロジックが含まれます。たとえば、[ステップ 4: Lambda 関数を作成してテストする](Streams.Lambda.Tutorial.md#Streams.Lambda.Tutorial.LambdaFunction) に示す Lambda 関数には、DynamoDB Streams のレコードを処理できるハンドラがあります。

コンテナの作成後、AWS Lambda が初めてハンドラーを実行する前に、1 回だけ実行される初期化コードを提供することもできます。[ステップ 4: Lambda 関数を作成してテストする](Streams.Lambda.Tutorial.md#Streams.Lambda.Tutorial.LambdaFunction) に示す Lambda 関数には、SDK for JavaScript in Node をインポートし、Amazon SNS 用のクライアントを作成する初期化コードがあります。これらのオブジェクトはハンドラの外部で 1 回のみ定義します。

関数の実行後、AWS Lambda は関数のそれ以降の呼び出しに対してコンテナを再利用する場合があります。この場合、関数ハンドラは、初期化コードで定義したリソースを再利用できる可能性があります (AWS Lambda がコンテナを保持する期間や、コンテナを再利用するかどうかを制御することはできません)。

AWS Lambda を使用した DynamoDB トリガーの場合は、次のことをお勧めします。
+ AWS のサービスのクライアントは、ハンドラではなく初期化コードでインスタンス化する必要があります。これにより、AWS Lambda コンテナは、コンテナの有効期間中は既存の接続を再利用することができます。
+ 通常、お客様が明示的に接続を管理したり、接続プールを実装したりする必要はありません。これは AWS Lambda によって自動的に管理されます。

DynamoDB ストリームの Lambda コンシューマーは、正確に一度だけ配信されることを保証するものではなく、時折重複が発生する可能性があります。重複処理が原因で予期しない問題が発生しないように、Lambda 関数コードは必ずべき等性にしてください。

詳細については、「*AWS Lambda デベロッパーガイド*」の「[AWS Lambda 関数を操作するためのベストプラクティス](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)」を参照してください。