-
[Trouble Shooting] Puppeteer 오류: Protocol Timeout웹/Project 2024. 4. 15. 00:50
오류 내용
- AWS Lambda 내에서 Puppeteer 라이브러리를 활용해 크롤링 할 때 Protocol Timeout 에러 발생
- Puppeteer의 page 객체의 goto() 메서드를 호출하였을 때 이런일이 발생하였다.
트러블슈팅 과정
- 처음에는 Navigation timeout 에러가 발생했고, 해당 에러를 이전에 경험한 적이 있어서 크롤링 대상 홈페이지에 오류가 난것은 아닌지 확인. 정상적으로 접속되는것을 확인
- Navigation timeout을 발생시키는 default timeout limit을 늘려보았으나 Protocol timeout이 발생함.
- Puppeteer 깃허브 페이지의 issue를 확인해보았으나 나와 같은 오류에 대한 정보는 존재하지 않았음.
- 환경의 문제인지 확인하기 위해 로컬에서 동일한 코드를 수행하였더니 정상 동작하는 것을 확인함.
오류 원인
- 크롤링의 대상인 홈페이지의 링크가 AWS RDS에 존재하여 AWS Lambda에서 해당 RDS에 접속하기 위해 해당 RDS의 VPC에 Lambda를 위치시켰다.
- 해당 VPC는 인터넷 게이트웨이가 연결되어있는 VPC였다. AWS 공식 문서를 확인해보니 IG에 연결된 Lambda는 외부 인터넷에 액세스 할 수 없다고 한다.
https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/configuration-vpc.html#vpc-internet
아웃바운드 네트워킹을 VPC의 리소스에 연결 - AWS Lambda
함수에 이전 API 요청의 VPC 구성이 이미 포함되어 있는 경우 VPC 구성 없이 UpdateFunctionConfiguration 요청을 보낼 수 있습니다.
docs.aws.amazon.com
해결 방법
- NAT 게이트웨이를 두는 방법도 있으나, 나는 Lambda를 분리하여 RDS에 연결하는 Lambda와 그것을 가지고 로직을 수행하는 Lambda 두개로 나누고 AWS Step function을 사용해 그 둘의 흐름을 제어하였다.
- 만약 수행하려는 로직이 이렇게 분리 가능하다면 이렇게 하는것이 더 경제적일 수 있다.
'웹 > Project' 카테고리의 다른 글