2023. 8. 14. 02:38ㆍ에러대응
문제 상황
EC2 인스턴스에 nest.js 앱과 rds 를 연결하던 중 발생했던 오류이다.
[Nest] 35 - 08/12/2023, 3:47:41 PM ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)...
Error: connect ETIMEDOUT <아이피:포트>
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1495:16)
첫번째 SOLVE
rds 의 인바운드 규칙(0.0.0.0 & ::/0)을 모두 허용했더니 성공했다.
하지만 정확한 원인을 모르겠다.
로그에 적힌 IP 를 규칙 허용 했음에도 불구하고 이런 현상이 발생한 원인을 찾아보자
저 IP 가 어디에서 왔는지 찾아보았다.
sudo docker inspect 2f763e238f96 | grep IPAddress
도커의 게이트웨이 IP 와 컨테이너 Ipv4 내부 주소를 알 수 있었는데
172.17.0.1 과 172.17.0.2 가 있었다.
이를 rds 인바운드 규칙에 추가해보았다. 하지만 역시 내부주소여서 그런지 작동하지 않았다.
rds 의 엔드포인트 주소 확인
nslookup <RDS 엔드포인트>
오류에서 나오는 주소는 RDS 엔드포인트의 IP 주소였다.
이 주소를 인바운드 규칙에 설정해보았지만 왜 접근할 수 없었는지 물음표였다.
RDS 에 나의 EC2 인스턴스 퍼블릭 주소에 대한 허용을 넣어보았다.
왜인지 작동하지 않았다.
다시 세팅
다시 인바운드 규칙을 처음부터 적용해보았다.
RDS instance ~ 인바운드 규칙 설정 (4개)
- docker Gateway
- docker container ipv4
- RDS localRDStest ( 논외 )
- ticketnestApp EC2 instance ( = ticketnestApp EC2 instance 의 퍼블릭 ipc4 )
이 상태에서 해보았을때 작동하지 않았음
SOLVE
나의 app 에 이미지 세팅 값을 변경해보자
- p 명령어를 통해 나의 app EC2 instance 의 프라이빗 ipv4 로 설정했다.
sudo docker run --name ticketnest -d -p <프라이빗 IP>:8080:8080 munyeolyoon/ticketnest
결과는 연결 성공이었다.
도출해낸 결론
1. 지금까지 사용한 인바운드 규칙에 사용되는 것은 퍼블릭 ipv4 다.
퍼블릭 ipv4 는 인터넷에서 EC2 instance 에 접근할 수 있는 주소이다.
2. 연결을 성공한 ipv4 는 프라이빗이다.
프라이빗 ipv4는 인스턴스 간 통신이나 내부 네트워크에서 사용된다.
즉, 내부 네트워크 안에서 작업한 내용의 문제이기 때문에 프라이빗 ipv4 를 통해 해결할 수 있었던 것