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

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • AWS のサービス - AWS のサービスでは、同期的または非同期的に関数を呼び出す場合があります。同期呼び出しの場合、サービスは再試行するかどうかを決定します。例えば、Amazon S3 バッチオペレーションは、Lambda 関数が TemporaryFailure 応答コードを返す場合、オペレーションを再試行します。プロキシがアップストリームユーザーまたはクライアントからリクエストするサービスは、再試行戦略を持っているか、またはリクエスタにエラー応答をリレーする場合があります。例えば、API Gateway は常にエラー応答をリクエスタにリレーします。

    非同期呼び出しの場合、動作は関数を非同期的に呼び出した場合と同じです。詳細については、他のサービスで AWS Lambda を使用する のサービス固有のトピックおよび呼び出しサービスのドキュメントを参照してください。

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

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

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