Node.js
dotenv 호출시 같은 환경변수명의 값을 변경시에 발생하는 문제
Dev갱이
2024. 9. 12. 15:58
728x90
dotenv 사용시에 똑같은 환경변수에 값만 바뀌었을때 제대로 바뀌지 않는 문제가 있다.
- S3 업로드 키의 환경변수값을 변경 했을때 애플리케이션 상에서 log를 출력하면 정상적으로 바뀐것으로 나오나 실제로는 제대로 변경 되지 않아서 AWS Access Key Id you provided does not exist in our records 에러가 발생한다.
해당 문제가 발생하는 원인을 나는 캐싱 문제라고 생각 했다. 아마도 이전 AWS key값이 캐싱되어 환경변수의 값이 변경되었음에도 이전 캐싱된값을 계속 가져오는것이라고 생각했다.
해결을 위한 조치
- node_modules 삭제와 dist 파일 삭제
- docker 이미지 전체 삭제 및 다시 빌드
$ docker-compose -f docker-compose-dev.yml build --no-cache
$ docker-compose -f docker-compose-dev.yml up
생각 해보니까 docker로 백엔드 어플리케이션을 돌리는데 애플리케이션에서 로그를 출력 했을때는 정상적으로 환경변수 값이 변경 되어 있지만 사용자가 api 요청해서 환경변수를 불러와서 실행하는곳에서 제대로 반영 되지 않았으니까 docker환경에서 돌아가는 백엔드 어플리케이션의 캐시를 초기화 해주어야 될것 같다.
해결을 위한 조치대로 해도 해결은 안되었지만 원인은 어느정도 찾은것 같았다. docker-compose를 이용해서 backend 애플리케이션을 띄웠을때는 여전히 환경변수를 변경해도 반영이 되지 않았지만 npm run start:dev 명령어로 backend 서버만 띄웠을때는 제대로 환경변수가 적용 되었다!!! 즉, docker 환경에서 돌아가는 backend 이미지에 뭔가 환경변수가 계속 이전값으로 캐싱 되어 있다는것이다.
Docker-desktop에서 확인
backend image 클릭 -> Inspect -> Cmd -> Conifg -> Env에서 환경변수들을 확인 할 수 있었고 수정한 환경변수가 반영이 되지 않았다는것을 알 수 있었다.
원인은 허무하게도 env 중첩이 문제였다
- docker.compose-dev.yml
- docker-compose-stage.yml
- docker-compose.yml
- backend
- frontend
- nginx
이것게 구성되어 있는데 state 즉 배포 상태와 같은 환경을 테스트 하기 위한 docker-compose에서 env 파일을 사용하는데 해당 env 파일에 이전 환경변수 값들이 저장되어 있다보니까 계속해서 .env 파일을 호출했다 복붙 하면서 실수가 있었던건지 docker-compose-dev 에서는 env가 아닌 backend에서 생성한 dev env를 불러오게끔 수정했다.
Inspect -> Cmd -> Conifg -> Env에서 환경변수를 확인 할 수 있다는것을 알게 되었다.
728x90