물에 살고싶은 개발자

[API Gateway] 리소스를 추가했음에도 정상적으로 동작하지 않는 경우 본문

AWS

[API Gateway] 리소스를 추가했음에도 정상적으로 동작하지 않는 경우

돼지사랑 2021. 6. 23. 18:05

언제나 그랫듯 앞뒤맥락 다 제껴놓고 일단 선결론부터

그리고 이 글은 내가 겪은것 위주로 작성하기때문에 모두에게 해당하는 문제라고 보장할순 없다는걸 미리 밝힘.

이 글은 AWS 구조설계에 대한 가이드 글이 아니고 특정 구조에서 생길 수 있는 원인의 해결법에 대한 글임을 밝힌다.

 

 

해결법 !

404에러가 뜰 경우 -> 네트워크 로드밸런서(NLB)가 엉뚱한 EC2 인스턴스를 호출하는게 원인이므로 API GateWay의 통합요청에서 VPC_PROXY가 아닌 HTTP_PROXY로 변경하고 엔드포인트를 원하는 EC2 인스턴스의 퍼블릭DNS나 탄력적IP로 지정해주자. 

 

Auth 관련 에러가 뜰 경우 -> 원인은 크게 두가지.

1. 리소스추가 후 해당 리소스의 경로가 잘못된경우

해결법 : 단순하다. 리소스를 만들때 자동완성 되는 경로를 믿지말자. 예를들어 /myRes 라는 이름의 리소스를 만들면 경로에는 -myres 라고 나오게 된다. 하이픈(-)을 제거 한다고 하더라도 전부 소문자라서 문제가 생기는것. 즉, 나는 http:server:3000/api/myRes 를 호출했는데  API Gateway에 추가된건 http:server:3000/api/myres 인것이다.

=> 이 경우에는 그냥 프록시 리소스로 구성하면 간단하게 해결되기도 한다. 

 

2. 보안그룹에 막히거나 로드밸런서에 포트를 안뚫어둔 경우

해결법 : 보안그룹은 그냥 보안그룹가서 열어주면 된다. 이 글의 3번을 참고하면 된다. 로드밸런서 같은경우는 EC2에 들어가면 아래에서 두번째에 로드밸런싱에 로드밸런서에 가서 세팅해둔 로드밸런서의 리스너에 사용하려는 포트를 뚫어주고 그 바로아래 대상그룹에서 Registered targets을 추가해주면 된다.

 

 

이번 글은 어쩐지 선결론이 길어졌는데..아무튼 시작한다

일단 아래 그림을 먼저 보자 AWS 공식홈페이지의 한국블로그에 나와있는 구조 이미지이다.

API Gateway를 이용한 아키텍처 구조

이 구조에서 API 게이트웨이에 리소스를 생성하면 이미지처럼 VPC 링크를 통해 NLB(네트워크 로드 밸런서)가 호출되고 타겟그룹에 있는 인스턴스를 호출할 수 있도록 게이트를 열어주게 된다. 

 

문제는 여기서 생기는데 위에 선결론에 404에러가 뜨는 경우가 생긴다. 

선결론에서 말했듯 NLB가 위 이미지에서 타겟그룹A를 호출해줘야 하는데 타겟그룹N을 호출하게 되는것이다.

자세한 원인까지는 필자가 NLB의 구조파악이 다 안되어있기때문에 더 설명할수는 없고(ㅠㅠ) NLB를 더 비싼걸 쓰면 해결된다는 소문은 들어본적이 있다..ㅎ;

아무튼! 필자의 경우 분명 API Gateway에서 설정도 잘 되어있고, 백앤드도 문제가 없는데 백앤드에서 로그도 안찍히고 API Gateway의 로그도 안찍히고 해서 매우 답답하던 찰나 팀원들 중 한명이 테스트 중이었는지 필자가 개발중이었던 A 백앤드서버에 팀원이 호출한 B백앤드서버를 호출했다는 로그가 찍혀 정말 우연히 발견하게 되었다. 그래서 확인해보니 포스트맨으로 A를 호출할때 대충 10번중 4~5번정도는 404가 뜨는데, 그때마다 B의 백앤드로그가 찍히는걸 확인할수있었다. (추가하자면 백앤드서버의 로그가 별게 아니고 그냥 노드서버에 console.log()로 찍은 로그를 pm2 logs 로 본것뿐이다) 

덕분에 원인을 밝히게 되어 개발이사님(CTO)에게 자문을 구했더니, 그냥 니가 하는 A 인스턴스를 바로 호출하라는 조언(?!)을 듣게되어 해봣더니 정말 얼탱이없게 해결된 것이다 -_-;; 

 

아무튼 그렇게 문제가 해결되어도 NLB에 리스너와 타겟그룹에 포트뚫어두는걸 깜박하거나 보안그룹에서 허용을 안하거나 하면 마찬가지로 막힐 수가있다. 어느쪽이든 잘 확인해보면서 하면 안될건 없지만 404에러가 나는 케이스는 정말 예상치 못했기에 이렇게 글을 남긴다 

(사실 Auth 관련 에러는 뽀나스임. 핵심은 404를 기록 및 공유하기 위한 글임ㅋ!)

 

Comments