[AWS] API Gateway + Lambda 사용하다가 생긴 502에러 'Internal server error' 트러블슈팅 with Terraform
0. 개발환경
Terraform : 1.7.3
Python : 3.12.x
1. 문제의 발생
Lambda로 크롤링 함수를 만들어서 서비스에 이용하고 있는데, 특정 parameter에 대해서 5XX에러를 띄우는 현상이 발생했습니다. 호출되는 과정은 NestJS Backend -> API Gateway -> Lambda(python) 순서로 호출됩니다.
Postman에서 API Gateway를 호출하였을 때, 502 Bad Gateway와 함께 다음과 같은 에러 메시지를 return 했습니다.
{
"message": "Internal server error"
}
2. 문제의 원인 및 해결
처음에는 단순한 크롤링 과정의 문제인줄 알았습니다. 하지만 로컬에서 lambda에서 사용하는 python 함수를 돌려본 결과 문제없이 크롤링에 성공했습니다. AWS Console에서 lambda의 로그를 확인해보았습니다.
정상적으로 statusCode 200을 뱉는 모습입니다.
결론부터 말하자면 이 로그가 미궁으로 끌고갔는데, 실질적으로 lambda에서 문제가 있었지만 lambda를 CloudWatch로 봤을 땐 문제가 없었습니다.
API Gateway의 '테스트' 기능을 이용해서 세부로그를 확인해보았습니다.
Sat Feb 17 14:51:27 UTC 2024 : Sending request to https://lambda.ap-northeast-2.amazonaws.com/2015-03-31/functions/arn:aws:lambda:ap-northeast-2:489811481379:function:python-crawling-global/invocations
Sat Feb 17 14:51:31 UTC 2024 : Received response. Status: 200, Integration latency: 4411 ms
Sat Feb 17 14:51:31 UTC 2024 : Endpoint response headers: {Date=Sat, 17 Feb 2024 14:51:31 GMT, Content-Type=application/json, Content-Length=114, Connection=keep-alive, x-amzn-RequestId=13673bc9-c740-4ee2-ab30-24baad1c9f27, X-Amz-Function-Error=Unhandled, x-amzn-Remapped-Content-Length=0, X-Amz-Executed-Version=$LATEST, X-Amzn-Trace-Id=root=1-65d0c7ef-2404217f4088292e1c26f92b;parent=0539563ad3bd6674;sampled=0;lineage=44aac153:0}
Sat Feb 17 14:51:31 UTC 2024 : Endpoint response body before transformations: {"errorMessage":"2024-02-17T14:51:31.794Z 13673bc9-c740-4ee2-ab30-24baad1c9f27 Task timed out after 3.05 seconds"}
Sat Feb 17 14:51:31 UTC 2024 : Lambda execution failed with status 200 due to customer function error: 2024-02-17T14:51:31.794Z 13673bc9-c740-4ee2-ab30-24baad1c9f27 Task timed out after 3.05 seconds. Lambda request id: 13673bc9-c740-4ee2-ab30-24baad1c9f27
Sat Feb 17 14:51:31 UTC 2024 : Method completed with status: 502
위와 같은 로그를 볼 수 있었는데 lambda에서 200 response를 받고도 timeout error가 나서 502를 던지는 모습입니다.
리서치를 해본 결과 API Gateway와 Lambda 각각에 timeout 시간이 정해져있었습니다. Default값을 확인해보니 API Gateway는 29000ms, Lambda는 3s로 설정되어있었습니다.
즉, Lambda가 크롤링과정에서 3초이상 돌아가면서 timeout으로 죽어버리는 상황이었습니다.
resource "aws_lambda_function" "lambda_function" {
count = length(var.symbols)
function_name = "python-crawling-${var.symbols[count.index]}"
role = aws_iam_role.iam_for_lambda.arn
s3_bucket = var.s3_bucket_name
s3_key = "${var.symbols[count.index]}.zip"
handler = "lambda_function.lambda_handler"
runtime = "python3.12"
timeout = 10 // Timeout 10초로 설정
}
terraform에서 lambda_function의 timeout 시간을 늘려줌으로서 해결할 수 있었습니다.
' Lambda execution failed with status 200 due to customer function ' 로그가 인상적입니다...
3. 참고문서
* https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function#timeout
* https://repost.aws/knowledge-center/malformed-502-api-gateway