Error: /app/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node: invalid ELF header

2023. 8. 14. 01:31에러대응

Nest.js 를 EC2 도커 인스턴스 환경에서 사용하려고 했을때 발생했던 오류이다.

 

에러 코드

 

Error: /app/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node: invalid ELF header
    at Object.Module._extensions..node (node:internal/modules/cjs/loader:1340:18)
    at Module.load (node:internal/modules/cjs/loader:1119:32)
    at Function.Module._load (node:internal/modules/cjs/loader:960:12)
    at Module.require (node:internal/modules/cjs/loader:1143:19)
    at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:101:39)
    at require (node:internal/modules/cjs/helpers:121:18)
    at Object.<anonymous> (/app/node_modules/bcrypt/bcrypt.js:6:16)
    at Module._compile (node:internal/modules/cjs/loader:1256:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
    at Module.load (node:internal/modules/cjs/loader:1119:32)

 


SOLVE

 

bcrypt 를 제거하고 bcryptjs 로 바꿔주니 해결되었다.

 

앱에서 bcrypt 대신 bcryptjs 를 사용하며 문제가 해결된 이유는 bcryptjs 가 네이티브 바인딩을 필요로 하지 않기 때문이라고 한다.

이때문에 바이너리 호환성 문제로부터 자유로워 졌다.

 

bcrypt 는 암호 해싱을 더 빠르게 수행하기 위해 C++ 로 작성된 코드가 포함되어있다. 이 C++ 코드를 직접 호출할 수 있게 해주는 것이 네이티브 바인딩의 역할이다. 이 네이티브 모듈(bcrypt)은 특정 환경에서 컴파일 되었을 때 그 환경에 특화된 바이너리를 생성한다. 이 바이너리는 다른 환경에서는 제대로 동작하지 않는다. 이래서 바이너리 호환성 문제가 발생했던 것이다.