본문 바로가기

오류해결

[AWS EC2 배포] ERROR [TypeOrmModule] Unable to connect to the database. Retrying... 오류 해결

(이 오류는 로컬서버 오류가 아니고 EC2에서 나서 해결한 오류 입니다.)

 

문제 발생


AWS EC2에서 Docker + Git Action을 써서 CI/CD환경을 구축하고 있었다. git action에 ci/cd가 성공하고 이제 서버가 돌아가나 확인할려는 순간...

 

엥? url..연결할 수 없습니다. 가 떳다. 분명 git action에 ci/cd 문제 없이 성공했는데..

aws ec2에 직접 접속해서 docker logs를 찍어보니.. 에러가 났다 ㅋㅋ..

 ERROR [TypeOrmModule] Unable to connect to the database. Retrying...(1) ...

Error: connect ECONNREFUSED 127.0.0.1:3306

 ERROR [TypeOrmModule] Unable to connect to the database. Retrying...(2) ...

Error: connect ECONNREFUSED 127.0.0.1:3306

 ERROR [TypeOrmModule] Unable to connect to the database. Retrying...(3) ...

Error: connect ECONNREFUSED 127.0.0.1:3306

(사진을 준비 할려 했는데 캡처를 못했다.)

 

DB연결이 안된다는건 알겠는데 도저히 알 수가 없었다.

 

 

문제 해결


단순한 문제였다. 환경변수 파일을 읽을 수 없었던 것이다.

CI/CD 깃허브 레포지토리 기준으로 docker containr를 생성하고 그 containr을 EC2에 실행 시키는데

git repository에는 .env 파일이 없다.(.gitignore에 명시해놓기 때문에)

 

에러를 해결하기 위해선 docker가 알 수 있도록 환경변수 파일을 명시해놓아야 한다.

 

 

1. ec2 접속(SSH)

 

2. 환경변수 파일 생성

sudo vim woaud.env

(woaud.env는 임의로 지었음)

 

3. 환경변수 저장

vim화면

vim에 들어오면 위와 같은 화면일텐데 여기에 본인에 환경변수 파일을 넣어주면 된다.

주의할 점 : 환경변수 파일에 띄어쓰기가 있으면 안된다

ex) PORT = 8080 X

       PORT=8080 O

 

다 적었으면 :wq를 적고 저장하고 나온다

 

4. 경로 확인

pwd

본인이 어디에 .env 파일을 저장해뒀는지 경로를 확인하고 기억해둔다.

 

5. docker 환경변수 파일 명시

sudo docker run -d -p 8080:8080 --name ducademi-container --env-file /app/woaud.env woaud/ducademi

 docker을 run 할 때 환경변수 파일을 지정하여 ec2에 우리가 저장해둔 env 파일과 연결 시켜준다.

--env-file 뒤에 내가 아까 pwd로 확인한 환경변수 경로를 기입해두면 된다.

(본인은 최상단 디렉토리에서 app을 만들고 거기에 환경변수 파일을 만들었음)

 

 

 

 

 

 

성공하면서 알게된 점

 

성공!

 

한 3일 정도 걸려서 드디어 해결하게 됐다.. 이 오류를 고치기 위해 많은 노력들을 하였다. 구글링도 해보고 Chat GPT에게도 물어보았다. 그런데 내가 원하는 답변은 찾을 수 없었고 로컬 서버에서 DB연결이 안되는 이유 같은 것들 밖에 나오지 않았다. 그리고 수많은 테스트를 해보았다. EC2에서 네트워크 보안을 잘못 설정했나 싶어서 인바운드 규칙도 모두 허용하였고 로컬 DB라서 접속이 안되는 건가 싶어서 Mysql Docker Container를 만들어서도 확인해보았는데 답은 찾을 수 없었다. 그래서 로컬말고 Cloud DB를 활용해보면 될까 싶어서 Amazon Rds도 사용해보았다. 하지만 똑같은 에러일 뿐이였다.

 

하지만 여기서 알게 된 점이 환경변수 파일을 읽지 못한다는 것이었다. docker에 build할 때 git repository기준으로 코드를 build하는데 gitignore파일에 환경변수 파일이 추가되있어서 repository에는 환경변수 파일이 없었다.

 

나는 git action을 쓰니깐 git action secret을 추가하면 되는가 싶어서 환경변수를 모두 거기다 등록했는데 똑같은 오류만 되돌아 올 뿐이었다. 도대체 뭐가 문제일까 생각을 해보니 Error: connect ECONNREFUSED 127.0.0.1:3306이 에러에서 호스트가 바뀌지 않던 것이다. 나는 분명 환경변수 파일에서도 호스트를 바꿨고 git action secret에서도 host를 바꿨는데 계속 이 host로 연결을 시도 하는 거 보면 host가 명시 되지 않았다는 것을 알 수 있었다. 그렇게 ec2에 docker을 배포할 때 환경변수 파일을 지정하는 방법을 알아보았고 드디어 해결을 할 수 있었다.

 

이 과정에서 EC2 Linux에 많은 접근을 하다보니 리눅스 명령어와 좀 친해졌고 Docker mysql container를 만들 때 docker에 대해서 알아보았다. 또 EC2에 네트워크에서도 많은 공부를 하게 된 계기가 되었다.

 

뭔가 3일동안 아깝지 않았던 디버깅이 된 것 같다. 해결이 되었을 때 뿌듯함이 오히려 시간에 비례해서 느껴진 것 같았다.