AWS Lambda 함수와 함께 작동하도록 Amazon API Gateway 프록시 통합을 구성했습니다. 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를 사용하여 함수를 호출할 수 있도록 액세스를 허용하는지 확인합니다.
- 패키지 권한 문제로 인해 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으로 반환하는 경우 문자열로 변환되어야 합니다.
참조: 이 작업은 JSON.stringify를 사용하여 Node.js 함수에서 처리할 수 있습니다. 다른 런타임에는 서로 다른 솔루션이 필요하지만 개념은 동일합니다.
- isBase64Encoded 필드는 바이너리 데이터로 작업하는 경우 필수 필드입니다. 이 필드를 사용하지 않는 경우 값을 FALSE로 설정하는 것이 모범 사례입니다.
관련 정보
API Gateway에서 REST API에 대한 CloudWatch 로깅 설정
Amazon CloudWatch 지표를 사용하여 REST API 모니터링