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의 오류 처리 및 자동 재시도 단원을 참조하십시오.

함수 오류 처리

사용자 지정 오류 처리를 생성하여 Lambda 함수에서 직접 예외를 발생시키고 AWS Step Functions 상태 시스템 내에서 직접 처리(Retry 또는 Catch)할 수 있습니다. 자세한 내용은 상태 시스템을 사용하여 오류 조건 처리를 참조하십시오.

CreateAccount 상태가 Lambda 함수를 사용하여 고객의 세부 정보를 데이터베이스에 기록하는 작업인 경우를 생각해 보십시오.

  • 작업이 성공하면 계정이 만들어지고 환영 이메일이 전송됩니다.

  • 사용자가 이미 존재하는 사용자 이름에 대해 계정을 만들려고 시도하면 Lambda 함수는 오류를 발생시켜 상태 시스템이 다른 사용자 이름을 제안하고 계정 생성 프로세스를 재시도하도록 만듭니다.

다음 코드 샘플은 이 작업을 수행하는 방법을 보여줍니다. C#의 사용자 지정 오류는 Exception 클래스를 확장해야 합니다.

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 규칙을 사용하여 오류를 파악하도록 Step Functions를 구성할 수 있습니다. Lambda는 런타임에 오류 이름을 예외의 간단한 클래스 이름으로 자동 설정합니다.

{ "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를 참조하십시오.

이 페이지에서: