C# の AWS Lambda 関数エラー - AWS Lambda

C# の AWS Lambda 関数エラー

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

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

Syntax

初期化フェーズでは、無効なハンドラー文字列、ルール違反の型およびメソッド (Lambda 関数ハンドラーの制限 を参照)、またはその他の検証メソッド (シリアライザ属性を忘れる、入力または出力タイプとして POCO を持つなど) の例外がスローされる場合があります。これらの例外は、LambdaException 型です。次に例を示します。

{ "errorType": "LambdaException", "errorMessage": "Invalid lambda function handler: 'http://this.is.not.a.valid.handler/'. The valid format is 'ASSEMBLY::TYPE::METHOD'." }

コンストラクタが例外をスローすると、エラータイプも LambdaException 型になりますが、構築中にスローされる例外は、それ自体がモデル化された例外オブジェクトの cause プロパティで提供されます。

{ "errorType": "LambdaException", "errorMessage": "An exception was thrown when the constructor for type 'LambdaExceptionTestFunction.ThrowExceptionInConstructor' was invoked. Check inner exception for more details.", "cause": { "errorType": "TargetInvocationException", "errorMessage": "Exception has been thrown by the target of an invocation.", "stackTrace": [ "at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean&canBeCached, RuntimeMethodHandleInternal&ctor, Boolean& bNeedSecurityCheck)", "at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)", "at System.Activator.CreateInstance(Type type, Boolean nonPublic)", "at System.Activator.CreateInstance(Type type)" ], "cause": { "errorType": "ArithmeticException", "errorMessage": "Sorry, 2 + 2 = 5", "stackTrace": [ "at LambdaExceptionTestFunction.ThrowExceptionInConstructor..ctor()" ] } } }

例に示すように、内部例外は常に保持され (cause プロパティとして)、深い入れ子になる場合があります。

例外は、呼び出し中にも発生することがあります。この場合、例外のタイプが保持され、例外はペイロードとして直接 CloudWatch Logs で返されます。次に例を示します。

{ "errorType": "AggregateException", "errorMessage": "One or more errors occurred. (An unknown web exception occurred!)", "stackTrace": [ "at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)", "at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)", "at lambda_method(Closure , Stream , Stream , ContextInfo )" ], "cause": { "errorType": "UnknownWebException", "errorMessage": "An unknown web exception occurred!", "stackTrace": [ "at LambdaDemo107.LambdaEntryPoint.<GetUriResponse>d__1.MoveNext()", "--- End of stack trace from previous location where exception was thrown ---", "at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()", "at LambdaDemo107.LambdaEntryPoint.<CheckWebsiteStatus>d__0.MoveNext()" ], "cause": { "errorType": "WebException", "errorMessage": "An error occurred while sending the request. SSL peer certificate or SSH remote key was not OK", "stackTrace": [ "at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)", "at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)", "--- End of stack trace from previous location where exception was thrown ---", "at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()", "at LambdaDemo107.LambdaEntryPoint.<GetUriResponse>d__1.MoveNext()" ], "cause": { "errorType": "HttpRequestException", "errorMessage": "An error occurred while sending the request.", "stackTrace": [ "at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)", "at System.Net.Http.HttpClient.<FinishSendAsync>d__58.MoveNext()", "--- End of stack trace from previous location where exception was thrown ---", "at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)", "at System.Net.HttpWebRequest.<SendRequest>d__63.MoveNext()", "--- End of stack trace from previous location where exception was thrown ---", "at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)", "at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)" ], "cause": { "errorType": "CurlException", "errorMessage": "SSL peer certificate or SSH remote key was not OK", "stackTrace": [ "at System.Net.Http.CurlHandler.ThrowIfCURLEError(CURLcode error)", "at System.Net.Http.CurlHandler.MultiAgent.FinishRequest(StrongToWeakReference`1 easyWrapper, CURLcode messageResult)" ] } } } } }

エラー情報が表示される方法は、その呼び出し型によって決まります。

  • RequestResponse 呼び出し型 (同期実行) : この場合、エラーメッセージを取得します。

    例えば、Lambda コンソールを使用して Lambda 関数を呼び出す場合、RequestResponse は常に呼び出し型であり、コンソールには AWS Lambda により返されるエラー情報が [Execution result] (実行結果) セクションに表示されます。

  • Event 呼び出し型(非同期実行): この場合、AWS Lambda は何も返しません。代わりに、エラー情報が CloudWatch Logs および CloudWatch メトリクスに記録されます。

仕組み

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 コンソールの使用

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

Lambda コンソールで関数を呼び出すには

  1. Lambda コンソールの [Functions (関数)] ページを開きます。

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

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

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

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

  6. [Save changes] (変更を保存) をクリックします。

  7. [Test] を選択します。

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 CLI設定ファイルで設定することもできます。

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

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

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

cat output.txt

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

また、Lambda は、関数のログに最大 256 KB のエラーオブジェクトを記録します。詳細については、「」を参照してくださいC# の 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 での C# コードの作成」を参照してください。

次のステップ