API Gateway를 Lambda 함수와 통합할 때 발생하는 오류를 해결하려면 어떻게 해야 합니까?

5분 분량
0

Amazon API Gateway를 AWS Lambda 함수와 통합할 때 발생하는 오류를 해결하려고 합니다.

해결 방법

API 및 스테이지에 대한 로깅 활성화

1.    API Gateway 콘솔에서 API에 대한 [스테이지 편집기(Stage Editor)]를 찾습니다.

2.    [스테이지 편집기(Stage Editor)] 창에서 [로그/추적(Logs/Tracing)] 탭을 선택합니다.

3.    [로그/추적(Logs/Tracing)] 탭의 [CloudWatch 설정(CloudWatch Settings)]에서 다음을 수행하여 로깅을 활성화합니다.
[CloudWatch Logs 활성화(Enable CloudWatch Logs)] 확인란을 선택합니다.
[로그 수준(Log level)]에서 [정보(INFO)]를 선택하여 모든 요청에 대한 로그를 생성합니다. 또는 오류를 발생시키는 API에 대한 요청에 대해서만 로그를 생성하려면 [오류(ERROR)]를 선택합니다.
REST API에 대해 [전체 요청/응답 데이터 로깅(Log full requests/responses data)] 확인란을 선택합니다. 또는 WebSocket API에 대해 [전체 메시지 데이터 로깅(Log full message data)] 확인란을 선택합니다.

4.    [사용자 지정 액세스 로깅(Custom Access Logging)]에서 다음을 수행하여 액세스 로깅을 활성화합니다.
[액세스 로깅 활성화(Enable Access Logging)] 확인란을 선택합니다.
[액세스 로그 대상 ARN(Access Log Destination ARN)]에 CloudWatch 로그 그룹 또는 Amazon Kinesis Data Firehose 스트림의 Amazon 리소스 이름(ARN)을 입력합니다.
[로그 형식(Log Format)]을 입력합니다. 지침의 경우 CLF, JSON, XML 또는 CSV를 선택하여 해당 형식의 예제를 볼 수 있습니다.

5.    Save Changes(변경 사항 저장)를 선택합니다.
참고: 콘솔은 설정이 저장되었는지 확인하지 않습니다.

자세한 내용은 API Gateway 콘솔을 사용하여 CloudWatch API 로깅 설정을 참조하세요.

통합 유형 결정, 오류 확인 및 다음 단계 수행

1.    API Gateway에서 Lambda 프록시 통합 또는 Lambda 사용자 지정 통합이 설정되어 있는지 여부를 결정합니다. Lambda 함수 출력을 검토하거나 get-integration 명령을 실행하여 통합 유형을 확인할 수 있습니다.

2.    API Gateway의 오류가 Lambda의 오류와 일치하는지 확인합니다. 다음 CloudWatch Logs Insights 쿼리를 실행하여 지정 기간 동안의 오류 상태 코드를 찾으십시오.

parse @message '(*) *' as reqId, message
    | filter message like /Method completed with status: \d\d\d/
    | parse message 'Method completed with status: *' as status
    | filter status != 200
    | sort @timestamp asc
    | limit 50

그리고 다음 CloudWatch Logs Insights 쿼리를 실행하여 동기간의 Lambda 오류 로그를 검색합니다.

fields @timestamp, @message
    | filter @message like /(?i)(Exception|error|fail)/
    | sort @timestamp desc
    | limit 20

3.    로그에서 식별하는 오류 유형에 따라 다음 중 하나를 선택합니다.

다음 오류가 발생하면 동시성 문제 해결 섹션의 단계를 완료합니다.

(XXXXX) Lambda invocation failed with status: 429. Lambda request id: XXXXXXXXXX
(XXXXX) Execution failed due to configuration error: Rate Exceeded.
(XXXXX) Method completed with status: 500

다음 오류 중 하나가 발생하면 시간 초과 문제 해결 섹션의 단계를 완료합니다.

Lambda 사용자 지정 통합의 경우:

< 29 sec:
(XXXXX) Method response body after transformations: {"errorMessage":"2019-08-14T02:45:14.133Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Task timed out after xx.01 seconds"}
> 29 sec:
(XXXXX) Execution failed due to a timeout error

Lambda 프록시 통합의 경우:

< 29 sec:
(XXXXX) Endpoint response body before transformations: {"errorMessage":"2019-08-14T02:50:25.865Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Task timed out after xx.01 seconds"}
> 29 sec:
(XXXXX) Execution failed due to a timeout error

다음 오류가 발생하면 함수 오류 해결 섹션의 단계를 완료합니다.

(XXXXX) Execution failed due to configuration error: Malformed Lambda proxy response
(XXXXX) Method response body after transformations: {"errorMessage": "Syntax error in module 'lambda_function'"}

동시성 문제 해결

Lambda 함수를 확장할 수 있는 것보다 빠르게 API Gateway에서 추가 요청이 들어오면 429 조절 오류 또는 500 오류가 발생합니다.

이러한 오류를 해결하려면 CloudWatch에서 Cound(API Gateway), Throttles(Lambda) 및 ConcurrentExecutions(Lambda) 지표를 분석합니다. 다음을 고려합니다.

  • Count(API Gateway)는 지정된 기간의 총 API 요청 수입니다.
  • Throttles(Lambda)는 조절된 호출 요청 수입니다. 모든 함수 인스턴스가 요청을 처리 중이고 동시성을 확장할 수 없는 경우 Lambda는 TooManyRequestsException 오류로 추가 요청을 거부합니다. 조절된 요청 및 기타 호출 오류는 호출 또는 오류로 계산되지 않습니다.
  • ConcurrentExecutions(Lambda)는 이벤트를 처리하는 함수 인스턴스 수입니다. 이 수가 AWS 리전의 동시 실행 할당량에 도달하면 추가 호출 요청이 제한됩니다. 함수 인스턴스 수가 함수에 구성해놓은 예약된 동시성 한도에 도달하면 호출 요청에도 병목 현상이 발생합니다.

참고: 자세한 내용은 API Gateway 지표Lambda 함수 지표 작업을 참조하십시오.

Lambda 함수에서 동시성 예약을 설정한 경우 Lambda 함수에 대해 더 높은 동시성 예약 값을 설정합니다. 또는 Lambda 함수에서 동시성 예약 값을 제거합니다. 그러면 예약되지 않은 동시 실행 풀에서 함수를 가져옵니다.

Lambda 함수에서 동시성 예약을 설정하지 않은 경우 ConcurrentExecutions 지표를 확인하여 사용량을 확인합니다. 자세한 내용은 Lambda 할당량을 참조하세요.

시간 초과 문제 해결

모든 API Gateway 통합에 대한 통합 제한 시간은 29초(하드 제한)입니다. Lambda 통합을 사용하여 API Gateway API를 구축할 때 두 가지 시나리오가 발생할 수 있습니다. 제한 시간이 29초 미만인 경우 또는 29초를 초과한 경우가 이러한 시나리오에 해당합니다.

Lambda 함수 제한 시간이 29초 미만인 경우 Lambda 로그를 확인하여 이 문제를 조사합니다. Lambda 함수를 29초 후에 실행해야 하는 경우 Lambda 함수를 비동기식으로 호출하는 방법을 고려합니다.

Lambda 사용자 지정 통합의 경우 다음 단계를 완료합니다.

1.    API Gateway 콘솔을 엽니다.

2.    탐색 창에서 [API]를 선택하고 API를 선택합니다.

3.    [리소스(Resources)]를 선택하고 메서드를 선택합니다.

4.    [통합 요청(Integration Request)]을 선택합니다.

5.    **메서드 요청(Method Request)**을 선택합니다.

6.    [HTTP 요청 헤더(HTTP Request Headers)]를 확장합니다.

7.    [헤더 추가(Add header)]를 선택합니다.

8.    [이름(Name)]에 헤더 이름을 입력합니다. 예: X-Amz-Invocation-Type

중요: 'Event'에서 헤더를 매핑해야 합니다(작은 따옴표를 입력해야 함).

Lambda 프록시 통합의 경우:

2개의 Lambda 함수, 함수 A와 함수 B를 사용합니다. API Gateway는 먼저 함수 A를 동기적으로 호출합니다. 그런 다음, 함수 A는 함수 B를 비동기적으로 호출합니다. 함수 B가 비동기적으로 호출되면 함수 A가 API Gateway에 성공적인 응답을 반환할 수 있습니다.

Lambda 프록시 통합을 사용하는 경우 사용자 지정 통합으로 변경하는 방법을 고려합니다. 그러나 요청/응답을 원하는 형식으로 변환하도록 매핑 템플릿을 구성해야 합니다. 자세한 내용은 백엔드 Lambda 함수의 비동기 호출 설정을 참조하세요.

참고: 비동기 Lambda 함수는 백그라운드에서 실행되므로 클라이언트는 Lambda 함수에서 직접 데이터를 수신할 수 없습니다. 영구 데이터를 저장하려면 중간 데이터베이스가 있어야 합니다.

함수 오류 해결

API를 호출할 때 함수 오류가 발생하는 경우 Lambda 함수에서 구문 오류가 있는지 확인합니다. Lambda 함수가 프록시 통합을 위해 API Gateway에서 예상하는 유효한 JSON 객체를 반환하지 않는 경우에도 이 오류가 발생할 수 있습니다.

이 오류를 해결하려면 API 및 스테이지에 대한 로깅 활성화 섹션의 단계를 완료합니다.


관련 정보

API 게이트웨이의 표준 Lambda 오류 처리

API 게이트웨이의 사용자 지정 Lambda 오류 처리

AWS 공식
AWS 공식업데이트됨 일 년 전