AWS Lambda
開発者ガイド

エラー処理と AWS Lambda での自動再試行

関数を呼び出す場合、2 つのタイプのエラーが発生する可能性があります。関数が呼び出しリクエストを受け取る前にリクエストが拒否されると、呼び出しエラーが発生します。関数エラーは、関数コードまたはランタイムがエラーを返す場合に発生します。エラータイプに応じて、呼び出しのタイプ、関数を呼び出すクライアントまたはサービス、エラーを管理するための方針や再試行動作も異なります。

リクエストや発信者、アカウントに関する問題により、呼び出しエラーが発生する可能性があります。呼び出しエラーには、エラーの原因を示すレスポンス内のエラータイプおよびステータスコードが含まれます。

一般的な呼び出しエラー

  • リクエスト – リクエストイベントが大きすぎるか JSONが有効ではない、関数が存在しない、パラメータ値のタイプが間違っている、のいずれかです。

  • 発信者 – ユーザーまたはサービスに、関数を呼び出すアクセス権限がありません。

  • アカウント – 関数のインスタンスの最大値はすでに実行されているか、リクエストの作成が速すぎます。

AWS SDK や AWS CLI などのようなクライアントは、クライアントタイムアウトやスロットリングエラー (429)、無効なリクエストにより発生しないその他のエラー (500 番台) を再試行します。呼び出しエラーの完全なリストについては、「Invoke API リファレンスドキュメント」参照してください。

関数エラーは、関数コードや関数コードが使用するランタイムがエラーを返した際に発生します。

一般的な関数エラー

  • 関数 – 関数のコードによって例外が生み出されるか、エラーが返されます。

  • ランタイム – 時間切れやシンタックスエラーの検出、または JSON への応答オブジェクトのマーシャリング失敗により、ランタイムが関数を終了しました。関数はエラーコードで終了しました。

呼び出しエラーとは異なり、関数エラーによって Lambda が 400 番台または 500 番台のステータスコードを返すことはありません。関数からエラーが返された場合、Lambda は、X-Amz-Function-Error という名前のヘッダーに加え、エラーメッセージとその他の詳細を含む JSON 形式のレスポンスを含むことでこれを示します。各言語のエラー関数の例については、以下のトピックを参照してください。

関数を直接呼び出す場合は、エラーを処理する方針を決めます。再試行する、デバッグのためにイベントをキューに送信する、またはエラーを無視することができます。関数コードが部分的にまたは完全に実行されている可能性もあれば、全く実行されない可能性もあります。再試行する場合は、関数コードが重複したトランザクションや望ましくない副作用を引き起こすことなく同じイベントを複数回処理できるようにしてください。

関数を間接的に呼び出す際、呼び出し元やリクエストが遭遇するすべてのサービスの再試行動作について把握する必要があります。これには、以下のシナリオが含まれます。

  • 非同期呼び出し – Lambda は、関数エラーを 2 回再試行します。関数にすべての受信リクエストを処理する十分なキャパシティがない場合、関数に送信されるまで、イベントはキューの中に数時間または数日間保持される可能性があります。正常に処理できなかったイベントを把握するために、デッドレターキューを設定できます。詳細については、「非同期呼び出し」を参照してください。

  • イベントソースマッピング – ストリームから読み取るイベントソースマッピングは、項目のバッチ全てに対して再試行を実施します。繰り返されるエラーは、そのエラーが解決されるか、項目が期限切れになるまで、影響を受けるシャードの処理を妨げます。停止しているシャードを検出するには、Iterator Age メトリクスをモニターすることができます。

    キューから読み取るイベントソースマッピングについては、ソースキューの再試行ポリシーおよび可視性タイムアウトを設定することで、失敗したイベントの送信先と再試行の間の時間の長さを決定します。詳細については、AWS Lambda イベントソースマッピング および他のサービスで AWS Lambda を使用する 内のサービス特有のドキュメントを参照してください。

  • AWS Services – AWS サービスは、関数を 同期的または非同期的に呼び出す場合があります。同期呼び出しの場合、サービスが再試行を担います。非同期呼び出しの場合、動作は関数を非同期的に呼び出した場合と同じです。詳細については、他のサービスで AWS Lambda を使用するにあるサービス特有のトピックや、呼び出しサービスのドキュメントを参照してください。

  • 他のアカウントやクライアント – 他のアカウントへのアクセス権限を付与するば場合、関数を呼び出すために設定できるサービスやリソースの制限にリソースベースのポリシーを使用することができます。関数を過負荷から守るためには、Amazon API Gateway を使用して、関数の前に API レイヤーを設定することを考慮してください。

Lambda アプリケーションのエラーに対応できるよう、Lambda では、Amazon CloudWatch および AWS X-Ray のようなサービスを統合しています。ログやメトリクス、アラーム、関数コード内の問題を迅速に検出および特定するトレーシング、API またはアプリケーションをサポートするその他のリソースを組み合わせて使用することができます。詳細については、「Lambda アプリケーションのモニタリングとトラブルシューティング」を参照してください。

エラーを検出して処理するために CloudWatch Logs サブスクリプション、X-Ray トレーシング、Lambda 関数を使用するサンプルアプリケーションについては、「AWS Lambda の Error Processor サンプルアプリケーション」を参照してださい。