メニュー
AWS Lambda
開発者ガイド

関数エラー (C#)

Lambda 関数に例外が発生した場合は、Lambda によって例外の情報が返されます。例外は 2 つの異なる場所に発生する場合があります。

  • 初期化 (Lambda によるコードのロード、ハンドラー文字列の検証、静的でない場合はクラスのインスタンスの作成)。

  • Lambda 関数の呼び出し。

シリアル化された例外情報はモデル化された JSON オブジェクトとしてペイロードとして返され、CloudWatch ログに出力されます。

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

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

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

Copy
{ "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 ログで返されます。(例:

Copy
{ "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 メトリクスに記録されます。

イベントソースに応じて、AWS Lambda はエラーになった Lambda 関数を返す場合があります。詳細については、「エラー時の再試行」を参照してください。

関数エラーの処理

カスタムエラー処理を作成して、Lambda 関数から直接例外をスローさせ、AWS Step Functions State Machine 内で直接処理 (再試行またはキャッチ) できます。詳細については、ステートマシンを使用したエラー条件の処理を参照してください。

CreateAccount ステートは、Lambda 関数を使用してお客様の詳細をデータベースに書き込むタスクと考えてください。

  • タスクが成功した場合は、アカウントが作成され、ようこそ E メールが送信されます。

  • 既に存在するユーザー名でアカウントを作成しようとすると、Lambda 関数はエラーを発生させ、ステートマシンによって別のユーザー名を使用してアカウント作成プロセスを再試行するように促されます。

次のコード例はそれを行う方法を示しています。C# のカスタムエラーは Exception クラスを拡張する必要があることに注意してください。

Copy
namespace Example { public class AccountAlreadyExistsException : Exception { public AccountAlreadyExistsException(String message) : base(message) { } } } namespace Example { public class Handler { public static void CreateAccount() { throw new AccountAlreadyExistsException("Account is in use!"); } } }

Catch ルールを使用してエラーをキャッチするように ステップ関数 を設定できます。Lambda は実行時にエラー名を例外のシンプルなクラス名に自動的に設定します。

Copy
{ "StartAt": "CreateAccount", "States": { "CreateAccount": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:CreateAccount", "Next": "SendWelcomeEmail", "Catch": [ { "ErrorEquals": ["AccountAlreadyExistsException"], "Next": "SuggestAccountName" } ] }, … } }

実行時、AWS Step Functions はエラーをキャッチし、Next 移行に指定されているとおり SuggestAccountName 状態に移行します。

カスタムエラー処理によって、サーバーレスアプリケーションの作成がより簡単になります。この機能は、Lambda プログラミングモデル でサポートされているすべての言語に統合できるため、選択したプログラミング言語でアプリケーションを設計したり、作業途中で混用したり組み合わせたりできます。

AWS Step Functions および AWS Lambda を使用した独自のサーバーレスアプリケーション作成の詳細については、AWS Step Functions を参照してください。

このページの内容: