Lambda 프록시 통합을 사용하는 API Gateway REST API에서 HTTP 502 오류를 해결하려면 어떻게 해야 하나요?

3분 분량
0

Amazon API Gateway 프록시 통합을 AWS Lambda 함수와 함께 작동하도록 구성했습니다. REST API를 호출하면, 구성 오류와 HTTP 502 상태 코드가 표시됩니다. 이 문제를 해결하려면 어떻게 해야 하나요?

간략한 설명

Lambda 함수 권한이 올바르지 않거나 API 요청의 응답 형식이 올바르지 않은 경우, API Gateway가 HTTP 502 상태 코드를 반환합니다.

Amazon CloudWatch Logs에 나타나는 HTTP 502 오류 메시지 예시

Wed Aug 03 08:10:00 UTC 2022 : Execution failed due to configuration error:
WE Aug 03 09:10:00 UTC 2022 : Method completed with status: 502

-또는-

Wed Aug 03 08:20:33 UTC 2022 : Lambda execution failed with status 200 due to customer function error: [Errno 13] Permission denied: '/var/task/lambda_function.py'. Lambda request id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Wed Aug 03 08:20:33 UTC 2022 : Method completed with status: 502

API Gateway에서 Lambda 함수의 응답을 처리하려면, 함수가 다음 JSON 형식에 따라 출력을 반환해야 합니다.

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}

자세한 내용은, 프록시 통합을 위한 Lambda 함수 출력 형식을 참고하세요.

해결 방법

1.    API Gateway의 API 대시보드를 사용해 REST API의 CloudWatch 지표를 검토하세요.
-또는-
Amazon CloudWatch 콘솔에서 REST API의 로그 이벤트를 검토하세요.

2.    로그에서 API의 Lambda 함수의 응답 형식을 검토하세요. 응답이 필수 JSON 형식이 아닌 경우, 형식을 다시 지정하세요.

3.    Lambda 함수의 리소스 정책이 API Gateway를 통해 함수를 호출할 수 있는 액세스를 허용하는지 확인합니다.

4. 패키지 권한 문제로 인해 Lambda 함수 실행이 실패하는 경우, 권한을 확인하세요. 예를 들어, Lambda 배포 패키지를 업로드할 때 “permission denied” 또는 “unable to import module” 오류를 해결하려면 어떻게 해야 하나요?를 참고하세요.

5.    Lambda 함수 처리기 이름과 구성이 유효한지 확인합니다.

6.    런타임 중에 Lambda 실행이 실패하는 경우, Lambda 함수 로그를 확인하고 코드를 업데이트하세요.

7.    변경 후에는 API Gateway 콘솔에서 REST API 메서드를 테스트할 수 있습니다.

올바른 응답 형식의 Node.js Lambda 함수 예시

참고: Node.js Lambda 함수는 비동기 처리기비동기가 아닌 처리기를 지원합니다. 다음 예제 함수는 비동기 핸들러를 사용합니다.

exports.handler = async (event) => {

    const responseBody = {
        "key3": "value3",
        "key2": "value2",
        "key1": "value1"
    };

    const response = {
        "statusCode": 200,
        "headers": {
            "my_header": "my_value"
        },
        "body": JSON.stringify(responseBody),
        "isBase64Encoded": false
    };

    return response;
};

이 예제 응답에는 필드 네 개가 있습니다.

  • statusCode는 API Gateway가 해석한 정수로, API 메서드 호출자에게 반환됩니다.
  • headers는 수집된 후 API Gateway 응답과 함께 다시 전송됩니다.
  • body의 경우, 데이터를 JSON으로 반환하는 경우 문자열로 변환해야 합니다.
    참고: Node.js 함수에서 JSON.stringify를 사용해 이 문제를 처리할 수 있습니다. 다른 런타임의 경우, 이용하는 솔루션은 다르지만 기본 개념은 동일합니다.
  • isBase64Encoded의 경우, 이진 데이터로 작업하면 필수로 입력해야 하는 필드입니다. 이 필드를 사용하지 않는 경우에는 FALSE로 설정해두는 것이 좋습니다.

관련 정보

API Gateway에서 REST API의 CloudWatch 로깅 설정

Amazon CloudWatch 지표로 REST API 모니터링