프로젝트/단기 프로젝트

[Node.js] 도메인 접속 오류 / Typescript Declare Global 오류 / EAI_AGAIN getaddrinfo 오류 해결 방법

Chipmunks 2024. 1. 25.
728x90

어제 잠깐 조수로(?) 도와주고 있는 사이드 프로젝트에서 오류가 발생했다.

분명 얼마 전 까지 잘 되었는데 갑자기 도메인이 먹통되는 등 tsconfig 설정이 말을 안듣는 등 하더니, 이번엔 RDB 연결까지 안 되더라...

그만 죄 없는 노드를 탓해버리고 말았다.

 

도메인 문제도 역대급이었는데... 잘 되던 서버가 갑자기 안되었다.

무료로 SSL 인증서를 발급해주는 LetsEncrypt(Certbot) 이 이상이 생겼나 싶어서 제한 걸릴 때 까지 셋팅해보고,

NginX 재설치도 해보고, 별의 별 거 다 해봤는데 해결이 안되었는데...

혹시나 싶어서 구매한 도메인 문젠가 싶어서 AWS Route 53 에 들어갔더니 인증 메일 기간이 지나서 다시 메일 요청하라는 메시지가 보였다...🤣🤣 덤으로 도메인은 중지되었다고 친절히 알려주고 있었다. 3시간 삽질은 그렇게 막이 내렸다.

자정에 메일 다시 받아서 인증해서 풀었다.

 

프로젝트는 Node.js Express 환경의 TypeScript 를 쓰고 있다.

프론트엔드 개발자인 형이 데이터랑 백엔드까지 맡다보니 멘탈이 나가있었는데...

암튼 그래서 백엔드도 자바스크립트 계열이다.

 

JWT 토큰을 복호화해서 Request 객체에 새로운 userId 속성을 만들어주려고 아래처럼 타입을 확장했다.

// src/types/express/index.d.ts

export {};

declare global {
  namespace Express {
    interface Request {
      userId?: number;
    }
  }
}

 

분명 인터넷에선 모두가 된다고 했는데, 나만 안된다니... 세상에 이런 억까가 없다.

원인을 모르겠기도 하고, 메인으로 진입하는 app.ts 상위에 넣으면 또 되어서 당장은 그렇게 해두었다.

 

app.ts 에 넣으면 되는 걸 보면, src/types/express.index.d.ts 를 부팅할 때 인식하지 못하는 것 같은데...

계속 구글링하다가 우리 코드와 다른 점을 찾았다.

다름 아니라 tsconfig.json 이었다.

{
  "compilerOptions": {
    "target": "ES6",
    "module": "CommonJS",
    "typeRoots": ["./node_modules/@types", "./src/types"],
    ...
    "paths": {
      "@/*": ["./src/*"]
    }
  },
  "include": ["./src/**/*"],
  "exclude": ["node_modules"]
}

 

typeRoots 에서 ./src/types 부분이 인식이 안되는건가 싶어서, 저것만 계속 건드렸다가 안돼서 아닌가 보다 했는데.

./node_modules/@types 이 놈이 문제였다....

나도 내가 설정한 게 아니고 중간에 받은 거였어서 더 발견하기가 어려웠다;;;

저 경로를 아래처럼 바꾸면 해결 된다.

"typeRoots": ["./node_modules/", "./src/types"],
// 또는 "typeRoots": ["./node_modules/*", "./src/types"],

 

타입 루트 디렉토리가 잘못 걸려있어서 기본으로 Express 의 타입을 못 받아온 게 아닌가 싶다.

그래서 인터페이스 확장도 안됐던거고!

실제 빌드할 때나 IDE 에선 직접 코드단에서 임포트해서 그런지 전혀 문제가 없었어서 눈치를 못챘다. 🤨🤨

어쨌든 해결!!!!

 

그런데 이게 웬 걸, 저게 해결되니깐 module-alias 도 해결됐다!?

import { myDataSource } from "@/data-source";
import { Gender, User } from "@/entity/user";

 

처럼 "@/" 으로 경로를 대체할 수 있는데 yarn dev 에 있는 nodemon 으론 실행시킬 순 있는데, 빌드가 안되는 문제가 있었다.

원인을 전혀 몰랐었는데, 하나를 해결하니깐 자동으로 해결이 되었다..!?

소 뒷걸음질치다 쥐 잡았다. 😁

 

마지막은 RDS 접속이 안되는 이슈다.

인증서도 해결됐고 안풀릴 것만 같았던 타입 이슈도 해결 되었는데, 갑자기 DB 접속이 안된다니!?

너무 당황스런 일이다..

처음엔 Nginx 문제가 다시 발발한건가 싶었다.

그런데 요리보고 저리봐도 Nginx 는 정상적으로 실행되고 있었고,

서버도 꺼지지 않고 잘 실행되고 있었다.

서버 로그를 보기 전까지는...

 

서버 로그를 봤더니 데이터 소스를 찾을 수 없다는 메시지와, 데이터베이스에 접속할 수 없다는 메시지가 있었다.

Error during Data Source initialization: Error: getaddrinfo EAI_AGAIN rds.xxxx.ap-northeast-2.rds.amazonaws.com
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:107:26) {
  errno: -3001,
  code: 'EAI_AGAIN',
  syscall: 'getaddrinfo',
  hostname: 'rds.xxxx.ap-northeast-2.rds.amazonaws.com'
}

 

생전 처음보는 오류였는데...

RDB 인스턴스도 정상적이고, 접속도 로컬에서 잘 되고 있고,

node:dns:107:26 에서 오류 발생한 것도 그렇고, EAI_AGAIN 을 쳤더니 DNS 쪽에서 이슈가 있는 걸로 파악했다.

 

더 웃긴 건 EC2 에서 직접 실행했을 땐 잘 되는데, 도커로 실행하면 RDB 연결이 안되는거다...

잘 조회하던 DNS 를 갑자기 왜 못 찾는다는건지... 손이 많이 가는 인스턴스다.

점심 시간이랑 저녁 시간에 잠깐 삽질하다가 아래 블로그로 해결했다.

 

[EAI_AGAIN 오류] getaddrinfo 오류 해결 방법 (+ ping DNS 테스트)

⚠️Error:getaddrinfo EAI_AGAIN 아침 출근부터 오류 발생 처음 보는 오류인데, 일단 아마존 DB가 접속이 안된다. 로그인이 안 되는 대형사고 발생!! EAI_AGAIN이란? EAI_AGAIN은 DNS 조회시간 초과 오류이다.

ordinary-code.tistory.com

 

sudo vi /etc/systemd/resolved.conf


설정을 열어서 #DNS=8.8.8.8 으로 적은 다음, 인스턴스를 재부팅했더니 해결됐다!

지금 생각해보면 DNS 를 명시 안하고 그냥 재부팅만 했어도 되지 않았을까 싶긴 한데...

답은 결국 재부팅이었다.

다음엔 또 무슨 사고를 칠까 심히 두렵다. 🥲

 

밤 11시에 먹는 저녁... 끼니를 거르지 맙시다...

댓글