[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)

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 를 통해 해결할 수 있었던 것