Java の AWS Lambda 関数エラー - AWS Lambda

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

Java の AWS Lambda 関数エラー

コードが原因でエラーが発生すると、Lambda によって、エラーの JSON 表現が生成されます。このエラードキュメントは、呼び出しログ (同期呼び出しの場合は出力) で確認できます。

このページでは、Lambda コンソールと AWS CLI を使用して、Java ランタイムの Lambda 関数の呼び出しエラーを表示する方法について説明します。

Syntax

以下の例では、ランタイムはイベントをオブジェクトに逆シリアル化できません。入力は有効な JSON タイプですが、ハンドラーメソッドの予期するタイプと一致しません。

例 Lambda ランタイムエラー
{ "errorMessage": "An error occurred during JSON parsing", "errorType": "java.lang.RuntimeException", "stackTrace": [], "cause": { "errorMessage": "com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not construct instance of java.lang.Integer from String value '1000,10': not a valid Integer value\n at [Source: lambdainternal.util.NativeMemoryAsInputStream@35fc6dc4; line: 1, column: 1] (through reference chain: java.lang.Object[0])", "errorType": "java.io.UncheckedIOException", "stackTrace": [], "cause": { "errorMessage": "Can not construct instance of java.lang.Integer from String value '1000,10': not a valid Integer value\n at [Source: lambdainternal.util.NativeMemoryAsInputStream@35fc6dc4; line: 1, column: 1] (through reference chain: java.lang.Object[0])", "errorType": "com.fasterxml.jackson.databind.exc.InvalidFormatException", "stackTrace": [ "com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:55)", "com.fasterxml.jackson.databind.DeserializationContext.weirdStringException(DeserializationContext.java:907)", ... ] } } }

仕組み

Lambda 関数を呼び出すと、Lambda は呼び出しリクエストを受け取り、実行ロールのアクセス許可を検証し、イベントドキュメントが有効な JSON ドキュメントであることを確認し、パラメータ値をチェックします。

リクエストが検証に合格した場合、Lambda は関数インスタンスにリクエストを送信します。Lambda ランタイム環境は、イベントドキュメントをオブジェクトに変換して、関数ハンドラーに渡します。

Lambda がエラーを検出した場合、例外のタイプ、メッセージ、およびエラーの原因を示す HTTP ステータスコードを返します。Lambda 関数を呼び出したクライアントまたはサービスは、エラーを処理するか、エラーをエンドユーザーに渡すことができます。正しいエラー処理動作は、アプリケーションの種類、対象ユーザー、エラーの原因によって異なります。

次の一覧は、Lambda から受信できるステータスコードの範囲を示したものです。

2xx

応答に X-Amz-Function-Error ヘッダーのある 2xx 番台のエラーは、Lambda ランタイムまたは関数エラーを示します。2xx シリーズステータスコードは、Lambda がリクエストを受け入れたことを示しますが、エラーコードの代わりに、Lambda は、レスポンスに X-Amz-Function-Error ヘッダーを含めることでエラーを示します。

4xx

4xx一連のエラーは、呼び出し元のクライアントまたはサービスが、要求を変更したり、許可を要求したり、要求を再試行したりすることによって修正できるエラーを示します。4xx以外の一連のエラーは、429 通常、リクエストのエラーを示します。

5xx

5xx シリーズエラーは、Lambda の問題、または関数の構成やリソースの問題を示します。5xx シリーズエラーは、ユーザーの操作なしで解決できる一時的な状態を示す場合があります。これらの問題は、呼び出し側のクライアントやサービスでは対処できませんが、Lambda 関数の所有者によって問題を解決できる場合があります。

呼び出しエラーの完全なリストについては、「エラーInvokeFunction 」を参照してください。

例外を返す関数の作成

人間が読み取れるエラーメッセージをユーザーに表示する Lambda 関数を作成できます。

注記

このコードをテストするには、プロジェクト src フォルダに InputLengthException.java を含める必要があります。

src/main/java/example/HandlerDivide.java – ランタイム例外
import java.util.List; // Handler value: example.HandlerDivide public class HandlerDivide implements RequestHandler<List<Integer>, Integer>{ Gson gson = new GsonBuilder().setPrettyPrinting().create(); @Override public Integer handleRequest(List<Integer> event, Context context) { LambdaLogger logger = context.getLogger(); // process event if ( event.size() != 2 ) { throw new InputLengthException("Input must be a list that contains 2 numbers."); } int numerator = event.get(0); int denominator = event.get(1); logger.log("EVENT: " + gson.toJson(event)); logger.log("EVENT TYPE: " + event.getClass().toString()); return numerator/denominator; } }

関数が InputLengthException をスローすると、Java ランタイムはそれを以下のドキュメントにシリアル化します。

例 エラードキュメント (空白を追加)
{ "errorMessage":"Input must be a list that contains 2 numbers.", "errorType":"java.lang.InputLengthException", "stackTrace": [ "example.HandlerDivide.handleRequest(HandlerDivide.java:23)", "example.HandlerDivide.handleRequest(HandlerDivide.java:14)" ] }

この例では、 InputLengthExceptionは ですRuntimeExceptionRequestHandlerインターフェイスはチェック済み例外を許可しません。RequestStreamHandler インターフェイスは IOException エラーのスローをサポートしています。

前の例の return ステートメントは、ランタイムの例外をスローすることもあります。

return numerator/denominator;

このコードは、算術エラーを返す可能性があります。

{"errorMessage":"/ by zero","errorType":"java.lang.ArithmeticException","stackTrace":["example.HandlerDivide.handleRequest(HandlerDivide.java:28)","example.HandlerDivide.handleRequest(HandlerDivide.java:13)"]}

Lambda コンソールの使用

テストイベントを設定し、出力を表示することで、Lambda コンソールで関数を呼び出すことができます。出力は関数の実行ログにも記録され、トレースが有効になっている場合は AWS X-Ray にも記録されます。

Lambda コンソールで関数を呼び出すには
  1. Lambda コンソールの [関数ページ] を開きます。

  2. テストする関数を選択し、[Test] (テスト) を選択します。

  3. [Test event] (テストイベント) で、[New event] (新しいイベント) を選択します。

  4. テンプレートを選択します。

  5. [Name] (名前) にテストの名前を入力します。テキスト入力ボックスに、JSON テストイベントを入力します。

  6. [変更の保存] をクリックします。

  7. [テスト] を選択します。

Lambda コンソールで、関数が同期的に呼び出され、結果が表示されます。レスポンス、ログ、その他の情報を表示するには、[Details (詳細)] セクションを展開します。

AWS Command Line Interface (AWS CLI) を使用する

AWS CLI は、コマンドラインシェルでコマンドを使用して AWS サービスとやり取りするためのオープンソースツールです。このセクションの手順を完了するには、以下が必要です。

AWS CLI で Lambda 関数を呼び出すと、AWS CLI はレスポンスを 2 つのドキュメントに分割します。AWS CLIのレスポンスがコマンドプロンプトに表示されます。エラーが発生した場合は、レスポンスにはFunctionErrorフィールドが含まれます。関数によって返されたレスポンスまたはエラーは、出力ファイルに書き込まれます。例えば、output.jsonoutput.txt などです。

次の 読み出し コマンドの例は、関数を呼び出し、 呼び出し応答をoutput.txtファイルに書き込む方法を示しています。

aws lambda invoke \ --function-name my-function \ --cli-binary-format raw-in-base64-out \ --payload '{"key1": "value1", "key2": "value2", "key3": "value3"}' output.txt

AWS CLI バージョン 2 を使用している場合、cli-binary-format オプションは必須です。これをデフォルト設定にするには、aws configure set cli-binary-format raw-in-base64-out を実行します。詳細については、バージョン 2 の AWS Command Line Interface ユーザーガイドの「AWS CLI でサポートされているグローバルコマンドラインオプション」を参照してください。

コマンドプロンプトにAWS CLIレスポンスが表示されるはずです:

{ "StatusCode": 200, "FunctionError": "Unhandled", "ExecutedVersion": "$LATEST" }

output.txtファイル内に関数呼び出しレスポンスが表示されるはずです。同じコマンドプロンプトで、次のコマンドを使用してコマンドプロンプトに出力を表示することもできます。

cat output.txt

コマンドプロンプトに呼び出し応答が表示されます。

{"errorMessage":"Input must contain 2 numbers.","errorType":"java.lang.InputLengthException","stackTrace": ["example.HandlerDivide.handleRequest(HandlerDivide.java:23)","example.HandlerDivide.handleRequest(HandlerDivide.java:14)"]}

また、Lambda は、関数のログに最大 256 KB のエラーオブジェクトを記録します。詳細については、「Java の AWS Lambda 関数ログ作成」を参照してください。

他の AWS サービスでのエラー処理

別の AWS のサービスが関数を呼び出すと、サービスは呼び出しの種類と再試行動作を選択します。AWS のサービスは、スケジュールに従って、リソースのライフサイクルイベントに応答して、またはユーザーからのリクエストを処理するために、関数を呼び出すことができます。サービスによっては、関数を非同期に呼び出し、Lambda でエラーを処理する場合もあれば、再試行するか、ユーザーにエラーを返す場合もあります。

例えば、API Gateway はすべての呼び出しエラーと関数エラーを内部エラーとして扱います。Lambda API が呼び出しリクエストを拒否した場合、API Gateway は 500 エラーコードを返します。関数が実行されてもエラーが返された場合、または誤った形式でレスポンスが返された場合、API Gateway は 502 エラーコードを返します。エラーレスポンスをカスタマイズするには、コードでエラーをキャッチし、レスポンスを必要な形式に加工する必要があります。

エラーの発生元とその原因を特定するには、AWS X-Ray を使用することをお勧めします。X-Ray を使用すると、エラーが発生したコンポーネントを特定し、そのエラーの詳細を確認することができます。次の例は、API Gateway から 502 応答が返された関数エラーを示しています。


          API Gateway での関数エラーのトレースマップ。

詳細については、「AWS Lambda での Java コードの作成」を参照してください。

サンプルアプリケーション

このガイドの GitHub リポジトリには、エラーの使用方法を示すサンプルアプリケーションが含まれています。各サンプルアプリケーションには、簡易のデプロイとクリーンアップ用のスクリプト、AWS Serverless Application Model (AWS SAM) テンプレート、サポートリソースが含まれています。

Java のサンプル Lambda アプリケーション
  • [java17-examples] — Java レコードを使用して入力イベントデータオブジェクトを表現する方法を示す Java 関数。

  • java-basic - 単位テストと変数ログ記録設定を使用する、最小限の Java 関数のコレクション。

  • java-events - Amazon API Gateway、Amazon SQS、Amazon Kinesis などのさまざまなサービスからのイベントを処理する方法のスケルトンコードを含む Java 関数のコレクション。これらの関数は、最新バージョンのaws-lambda-java-eventsライブラリ (3.0.0 以降) を使用します。これらの例では、依存関係としての AWS SDK が不要です。

  • s3-java - Amazon S3 からの通知イベントを処理し、Java Class Library (JCL) を使用して、アップロードされたイメージファイルからサムネイルを作成する Java 関数。

  • API Gateway を使用して Lambda 関数を呼び出す - 従業員情報を含む Amazon DynamoDB テーブルをスキャンする Java 関数。次に、Amazon Simple Notification Service を使用して、仕事の記念日を祝うテキストメッセージを従業員に送信します。この例では、API ゲートウェイを使用して関数を呼び出します。

java-basic 関数には、カスタムランタイム例外を返すハンドラー (HandlerDivide) が含まれています。HandlerStream ハンドラーは RequestStreamHandler を実装し、IOException チェック済み例外をスローできます。

次のステップ