AWS Lambda 함수 오류(C#) - AWS Lambda

AWS Lambda 함수 오류(C#)

Lambda 함수에서 예외가 발생하면 Lambda는 예외 정보를 사용자에게 보고합니다. 두 가지 경우에 예외가 발생할 수 있습니다.

  • 초기화(Lambda가 코드를 로딩하고 핸들러 문자열을 검증한 다음, 정적 객체가 아닐 경우 클래스의 인스턴스를 생성).

  • Lambda 함수 호출.

직렬화된 예외 정보는 모델링된 JSON 객체로서 페이로드 형태로 반환되고 CloudWatch 로그에 출력됩니다.

초기화 단계에서 유효하지 않은 핸들러 문자열, 규칙 위반 유형 또는 메서드(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 로그에서 페이로드 형태로 직접 반환됩니다. 예:

{ "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가 반환한 오류 정보가 표시됩니다.

  • Event 호출 유형(즉, 비동기식 실행): 이 경우 AWS Lambda가 어떤 값도 반환하지 않습니다. 대신에 CloudWatch Logs 및 CloudWatch 측정치의 오류 정보를 로깅합니다.

이벤트 소스에 따라 AWS Lambda는 실패한 Lambda 함수를 다시 시도할 수 있습니다. 자세한 내용은 AWS Lambda의 오류 처리 및 자동 재시도 단원을 참조하십시오.