내용으로 건너뛰기

Lambda 함수의 API Gateway 통합 문제를 해결하려면 어떻게 해야 합니까?

7분 분량
0

AWS Lambda 함수의 Amazon API Gateway 통합 문제를 해결하고 싶습니다.

해결 방법

API 로깅 활성화

다음 단계를 완료하십시오.

  1. API Gateway 콘솔을 엽니다.
  2. 탐색 창에서 API를 선택한 다음, 해당 API를 선택합니다.
  3. 탐색 창에서 스테이지을 선택한 다음, 해당 스테이지를 선택합니다.
  4. 로그 및 추적에서 편집을 선택합니다.
  5. CloudWatch 로그의 드롭다운 메뉴에서 수준을 선택합니다.
    참고: 전체 요청 및 응답 로그의 경우 로깅 수준이 오류 및 정보 로그로 설정된 데이터 추적 옵션을 선택합니다. 데이터 추적은 민감한 데이터를 기록할 수 있으므로 프로덕션 API에 대해서는 데이터 추적을 활성화하지 않는 것이 좋습니다.
  6. 세부 지표를 선택합니다.
  7. 사용자 지정 액세스 로깅에서 다음 단계를 완료합니다.
    액세스 로깅 사용을 선택합니다.
    액세스 로그 대상 ARNAmazon Data Firehose 또는 CloudWatch 로그 그룹의 ARN을 입력합니다.
    참고: REST API만 Firehose ARN을 지원합니다.
  8. 로그 형식을 입력합니다.
  9. 저장을 선택합니다.

통합 유형 결정, 오류 확인, 해결을 위한 다음 단계 수행

다음 단계를 완료하십시오.

  1. Lambda 프록시 통합 또는 Lambda 사용자 지정 통합이 API Gateway에 설정되어 있는지 확인합니다. 통합 유형을 확인하려면 통합 요청에서 Lambda 프록시 통합의 값을 확인합니다.

  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
  3. 다음 CloudWatch Logs Insights 쿼리를 실행하여 동일한 기간 동안 Lambda 오류 로그를 검색합니다.

    fields @timestamp, @message
        | filter @message like /(?i)(Exception|error|fail)/
        | sort @timestamp desc
        | limit 20
  4. 로그에서 식별한 오류 유형에 따라 다음 중 하나를 선택합니다.
    다음 오류가 발생하면 동시성 문제 해결 섹션의 단계를 완료하십시오.

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

    다음 오류 중 하나가 발생하면 시간 초과 문제 해결 섹션의 단계를 완료하십시오.
    Lambda 사용자 지정 통합의 경우:

    < Integration timeout:
    (#####) Method response body after transformations: {"errorMessage":"2019-08-14T02:45:14.133Z ########-####-####-####-############ Task timed out after ##.01 seconds"}
    > Integration timeout:
    (#####) Execution failed due to a timeout error

    Lambda 프록시 통합의 경우:

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

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

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

동시성 문제 해결

Lambda 함수가 규모를 조정할 수 있는 속도보다 빠른 속도로 API Gateway에서 추가 요청이 들어오면 429 스로틀링 오류 또는 500 오류가 발생합니다.

이러한 오류를 해결하려면 다음 CloudWatch 지표를 분석하십시오. Count(API Gateway), Throttles(Lambda), ConcurrentExecutions(Lambda). 다음 사항을 고려해 보십시오.

  • Count(API Gateway)는 지정된 기간 동안의 총 API 요청 수입니다.
  • Throttles(Lambda)는 스로틀된 호출 요청 수입니다. 모든 함수 인스턴스가 요청을 처리하고 스케일 업할 수 있는 동시성이 없는 경우, Lambda는 TooManyRequestsException 오류와 함께 추가 요청을 거부합니다. 스로틀된 요청 및 기타 호출 오류는 호출 또는 오류로 간주되지 않습니다.
  • ConcurrentExecutions(Lambda)는 이벤트를 처리하는 함수 인스턴스의 수입니다. 이 수가 AWS 리전의 동시 실행 할당량에 도달하면 추가 호출 요청이 스로틀됩니다. 또한 Lambda는 함수 인스턴스 수가 함수에 대해 구성한 예약된 동시성 한도에 도달하면 호출 요청을 스로틀합니다.

참고: 자세한 내용은 API Gateway 지표Lambda에서 CloudWatch 지표 사용을 참조하십시오.

Lambda 함수에 예약 동시성을 설정한 경우 예약 동시성 값을 늘리십시오. 또는 Lambda 함수에서 역방향 동시성 값을 제거하십시오. 그러면 함수는 예약되지 않은 동시 실행 풀에서 가져옵니다.

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

시간 초과 문제 해결

모든 API Gateway 통합의 기본 통합 제한 시간은 29초입니다. 할당량 요청을 제출하여 리전 API 및 프라이빗 API의 기본 통합 시간 제한 할당량을 29초 이상으로 늘릴 수 있습니다. 그러나 통합 제한 시간을 늘리려면 AWS 계정의 리전 수준 스로틀 할당량을 줄여야 할 수 있습니다.

참고: 통합 제한 시간을 늘리는 경우 기본 제한 시간 값인 29초를 새 값으로 변경해야 합니다. 예를 들어 증가를 적용하려는 통합에서 기본 제한 시간 값인 29초를 변경하십시오. 그런 다음, API를 재배포하여 새 통합 제한 시간을 적용합니다.

Lambda 통합을 사용하여 API Gateway API를 구축하면 다음 시나리오 중 하나가 발생할 수 있습니다.

  • 제한 시간 값이 통합 제한 시간 값보다 작습니다.
  • 제한 시간 값이 통합 제한 시간 값보다 큽니다.

Lambda 함수 제한 시간이 29초 미만인 경우 Lambda 로그를 확인하여 이 문제를 조사하십시오. Lambda 함수가 29초 후에 실행되어야 하는 경우 Lambda 함수를 비동기식으로 호출하십시오.

Lambda 비동기식 호출 사용자 지정 통합의 경우 다음 단계를 완료하십시오.

  1. API Gateway 콘솔을 엽니다.
  2. 탐색 창에서 API를 선택한 다음, 해당 API를 선택합니다.
  3. 리소스를 선택한 다음, 메서드를 선택합니다.
  4. 통합 요청을 선택합니다.
  5. 메서드 요청을 선택합니다.
  6. HTTP 요청 헤더를 확장합니다.
  7. 헤더 추가를 선택합니다.
  8. 이름에 헤더 이름을 입력합니다. 예: X-Amz-Invocation-Type
    중요: **'Event'**에서 헤더를 매핑해야 합니다. 작은따옴표를 사용해야 합니다.

Lambda 프록시 통합의 경우 두 개의 Lambda 함수, 즉 함수 A와 함수 B를 사용하십시오. API Gateway는 먼저 함수 A를 동기식으로 호출합니다. 그러면 함수 A가 함수 B를 비동기식으로 호출합니다. 함수 B가 비동기식으로 호출되면 함수 A는 API Gateway에 성공적인 응답을 반환할 수 있습니다.

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

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

함수 오류 해결

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

API Gateway 실행 로그에서 로그의 AWS 통합 엔드포인트 RequestID 값을 검토할 수 있습니다.

(#####) AWS Integration Endpoint RequestId : YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY

그 후 다음 CloudWatch Logs Insights 쿼리를 실행하여 동일한 특정 기간 동안 Lambda 로그를 검색할 수 있습니다.

fields @timestamp, @message, @requestId, @logStream
| filter @requestId = 'YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY'
| sort @timestamp asc

이 오류를 해결하려면 API 및 스테이지 로깅 활성화 섹션의 단계를 완료하십시오.

잘못된 REST API 상태 코드 응답 재정의

API Gateway에서 잘못된 상태 코드를 반환하는 경우 매핑 템플릿을 만들어 잘못된 상태 코드를 올바른 상태 코드로 재정의합니다. REST API를 통한 프록시 이외의 통합에서 상태 코드 응답을 재정의할 수 있습니다.

참고: 이 매핑 템플릿 구성은 REST API에만 적용됩니다. HTTP API의 경우 HTTP API에서 API Gateway 통합을 위한 응답 상태 코드를 매핑하려면 어떻게 해야 합니까?를 참조하십시오.

예를 들어 API Gateway가 Lambda 함수에서 4## 또는 5## 대신 200 상태 코드를 반환하는 경우 다음 단계를 완료하십시오.

  1. API Gateway 콘솔을 열고 탐색 창에서 API를 선택합니다.

  2. REST API를 선택한 다음, 통합 응답 탭을 선택합니다.

  3. 통합 응답 설정에서 편집을 선택합니다.

  4. 매핑 템플릿을 확장한 다음, 매핑 템플릿 추가를 선택합니다.

  5. 콘텐츠 유형application/json을 입력합니다.

  6. 매핑 템플릿 편집기에서 다음 코드를 입력합니다.

    #set($inputRoot = $input.path('$'))
    $input.json("$")
    #if($inputRoot.toString().contains("error"))
    #set($context.responseOverride.status = 400)
    #end
  7. 저장을 선택합니다.

$context.responseOverride.status 파라미터는 통합 응답 창에서 기본 매핑 대신 상태 코드를 400으로 재정의합니다.

자세한 내용은 API Gateway에서 REST API에 대한 API의 요청 및 응답 파라미터와 상태 코드 재정의를 참조하십시오.

필요한 CORS 헤더를 반환하도록 REST API 통합 구성

응답에 필요한 CORS 헤더를 반환하려면 백엔드 Lambda 함수 또는 HTTP 프록시 서버를 구성합니다. Access-Control-Allow-Origin 헤더 값에 허용된 도메인을 목록으로 포함해야 합니다.

프록시 통합의 경우 API 백엔드가 반환하는 응답 파라미터를 수정하기 위해 API Gateway에서 통합 응답을 설정할 수 없습니다. 프록시 통합에서 API Gateway는 백엔드 응답을 클라이언트에 직접 전달합니다. 필요한 CORS 헤더를 반환하도록 Lambda 함수 또는 HTTP 통합을 구성해야 합니다.

프록시 이외의 통합에서는 필요한 CORS 헤더를 반환하도록 API Gateway에서 통합 응답을 수동으로 설정해야 합니다. API Gateway 콘솔을 사용하여 CORS를 구성합니다. 콘솔이 구성된 리소스에 필요한 CORS 헤더를 자동으로 추가합니다.

자세한 내용은 API Gateway API에서 CORS 오류를 해결하려면 어떻게 해야 합니까?를 참조하십시오.

바이너리 페이로드 Lambda 프록시 통합

바이너리 페이로드는 텍스트 페이로드 외의 모든 페이로드입니다. 예를 들어, 바이너리 페이로드는 .jpeg 파일, .gzip 파일 등일 수 있습니다. 여기에는 .pdf 애플리케이션, .jpeg 이미지 또는 .zip 애플리케이션과 같은 일반 바이너리 데이터가 포함됩니다.

Lambda 프록시 통합을 위한 바이너리 페이로드를 처리하려면 함수 응답을 base64로 인코딩하고 API의 binaryMediaTypes를 구성해야 합니다.

프록시 이외의 통합을 위한 바이너리 페이로드를 처리하려면 RestApi 리소스의 binaryMediaTypes 목록에 미디어 유형을 추가해야 합니다.

자세한 내용은 API Gateway의 REST API용 바이너리 미디어 유형을 참조하십시오.

관련 정보

API Gateway에서 표준 Lambda 오류 처리

API Gateway에서 사용자 지정 Lambda 오류 처리