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

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS Lambda 함수 오류(C#)

코드에서 오류가 발생하면 Lambda는 해당 오류의 JSON 표현을 생성합니다. 이 오류 문서는 호출 로그에 표시되며 동기 호출 시 출력에 표시됩니다.

이 페이지에서는 Lambda 콘솔과 AWS CLI를 사용하여 C# 런타임에 대한 Lambda 함수 호출 오류를 보는 방법에 대해 설명합니다.

명령문

초기화 단계에서 유효하지 않은 핸들러 문자열, 규칙 위반 유형 또는 메서드(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 로그 및 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 콘솔의 함수 페이지를 엽니다.

  2. 테스트할 함수를 선택하고 테스트를 선택합니다.

  3. 테스트 이벤트에서 새 이벤트를 선택합니다.

  4. 템플릿을 선택합니다.

  5. 이름에 테스트의 이름을 입력합니다. 텍스트 입력 상자에 JSON 테스트 이벤트를 입력합니다.

  6. 변경 사항 저장을 선택합니다.

  7. 테스트를 선택합니다.

Lambda 콘솔은 함수를 동기식으로 호출하고 결과를 표시합니다. 응답, 로그 및 기타 정보를 보려면 세부 정보 섹션을 확장합니다.

AWS Command Line Interface(AWS CLI) 사용

AWS CLI은(는) 명령줄 셸의 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구입니다. 이 섹션의 단계를 완료하려면 다음이 필요합니다.

AWS CLI에서 Lambda 함수를 호출하면 AWS CLI가 응답을 두 개의 문서로 나눕니다. 명령 프롬프트에 AWS CLI 응답이 표시됩니다. 오류가 발생한 경우 응답에 FunctionError 필드가 포함됩니다. 함수가 반환한 호출 응답 또는 오류가 출력 파일에 기록됩니다. 예: output.json 또는 output.txt.

다음 invoke 명령 예제는 함수를 호출하고 호출 응답을 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

cli-binary-format 옵션은 AWS CLI 버전 2를 사용할 때 필요합니다. 이 설정을 기본 설정으로 지정하려면 aws configure set cli-binary-format raw-in-base64-out을(를) 실행하세요. 자세한 내용은 AWS CLI 지원되는 글로벌 명령줄 옵션을 AWS Command Line Interface 사용 설명서 버전 2에서 참조하세요.

명령 프롬프트에 AWS CLI 응답이 표시되어야 합니다.

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

output.txt 파일에 함수 호출 응답이 표시되어야 합니다. 동일한 명령 프롬프트에서 다음을 사용하여 명령 프롬프트에 출력을 표시할 수도 있습니다.

cat output.txt

명령 프롬프트에 호출 응답이 표시되어야 합니다.

또한 Lambda는 함수의 로그에 최대 256KB의 오류 객체를 기록합니다. 자세한 내용은 Lambda 함수 로깅(C#) 섹션을 참조하세요.

다른 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# 코드 계측 섹션을 참조하세요.

다음 단계

  • Lambda 함수 로깅(C#) 페이지에서 Lambda 함수에 대한 로깅 이벤트를 표시하는 방법에 대해 알아보세요.