

# Lambda プログラミングモデルの概要
<a name="foundation-progmodel"></a>

Lambda には、最大 15 分間実行される標準関数と、最大 1 年間実行できる Durable Functions の 2 つのプログラミングモデルがあります。どちらも主要概念を共有しますが、Durable Functions は長時間実行されるステートフルワークフローを実現する機能を追加します。

Lambda では、すべてのランタイムに共通のプログラミングモデルを提供しています。プログラミングモデルとは、コードと Lambda システムとの間のインターフェイスを定義するものです。関数設定の*ハンドラ*を定義して、関数へのエントリポイントを Lambda に伝えます。ランタイムは、呼び出し*イベント*、および関数名やリクエスト ID などの*コンテキスト*を含むオブジェクトをハンドラーに渡します。

**Durable Functions の場合、ハンドラーは以下を提供する DurableContext オブジェクトも受信します。**
+ step() によるチェックポイント機能
+ wait() と waitForCallback() による待機状態管理
+ 呼び出し間の状態の自動保持

ハンドラーが最初のイベントの処理を終了すると、ランタイムは別のイベントを送信します。Durable Functions の場合、ハンドラーはステップ間で実行を一時停止でき、関数が再開すると Lambda は自動的に状態を保存および復元します。関数のクラスはメモリ内にとどまるため、*初期化コード*において、ハンドラーメソッドの外部で宣言されたクライアントおよび変数は再利用が可能です。後続のイベントの処理時間を短縮するには、初期化中に AWS SDK クライアントなどの再利用可能なリソースを作成します。初期化されると、関数の各インスタンスは数千件のリクエストを処理できます。

関数は、`/tmp` ディレクトリのローカルストレージにもアクセスできます。これは複数の呼び出しに使用できる一時的なキャッシュです。詳細については、「[実行環境](lambda-runtime-environment.md)」を参照してください。

[AWS X-Ray トレース](services-xray.md)が有効な場合、ランタイムは初期化と実行のために、別個のサブセグメントを記録します。

ランタイムは、関数からのログ出力をキャプチャし、Amazon CloudWatch Logs に送信します。ランタイムは、関数の出力をログに記録するだけでなく、関数の呼び出しの開始時と終了時にエントリも記録します。これには、リクエスト ID、請求期間、初期化期間、およびその他の詳細を含むレポートログが含まれます。関数によりエラーがスローされた場合、そのエラーは、ランタイムにより呼び出し元に返信されます。

**注記**  
ログ記録は、[CloudWatch Logs クォータ](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html)の対象となります。ログデータは、スロットリングが原因で失われることがあります。また、場合によっては、関数のインスタンス停止時に失われることがあります。

**Durable Functions の主な違い:**
+ 状態はステップ間で自動的に保持されます
+ 関数はリソースを消費せずに実行を一時停止できます
+ ステップは失敗すると自動的に再試行される
+ チェックポイントを通じて進行状況を追跡する

Lambda は、需要の増加に応じて追加のインスタンスを実行し、需要の減少に応じてインスタンスを停止することで関数をスケーリングします。このモデルは、次のようなアプリケーションアーキテクチャにおいてばらつきが生じます。
+ 特に明記されていない限り、受信リクエストは、順不同または同時に処理されます。
+ 関数のインスタンスが長く存続することを想定せず、アプリケーションの状態を別の場所に保存します。
+ ローカルストレージとクラスレベルのオブジェクトを使用することで、パフォーマンスを向上させられます。その場合でも、デプロイパッケージのサイズと実行環境に転送するデータの量は最小限に抑えてください。

プログラミング言語別のプログラミングモデルの実践的な入門ガイドについては、以下の章を参照してください。
+ [Node.js による Lambda 関数の構築](lambda-nodejs.md)
+ [Python による Lambda 関数の構築](lambda-python.md)
+ [Ruby による Lambda 関数の構築](lambda-ruby.md)
+ [Java による Lambda 関数の構築](lambda-java.md)
+ [Go による Lambda 関数の構築](lambda-golang.md)
+ [C\$1 による Lambda 関数の構築](lambda-csharp.md)
+ [PowerShell による Lambda 関数の構築](lambda-powershell.md)