daily

23.03.31. JWT, aws Elastic Beanstalk 배포 실패

Juhyuck 2023. 4. 1. 10:45
728x90

Issue

로컬에서 잘 작동하는 것을 확인하고, Elastic beanstalk으로 배포를 했다. 기대한건 아니지만,

역시 나오는 심각 메세지. 한번에 될 일은 없다고 생각하긴 했는데.


Try&Error

우선 Elastic Beanstalk의 로그를 살펴보니, AttributeError: module 'jwt' has no attribute 'ExpiredSignatureError' 에러가 났다. 로컬에서는 안생기던 에러인데...

 

위 에러 메세지와 aws elastic beanstalk으로 검색을 하니, 두가지 원인과 솔루션을 확인할 수 있었다.

1. pyjwt 라이브러리 호환성 문제

2. jwt와 pyjwt 두개의 라이브러리를 모두 설치했을 때 생기는 문제.

 

우선 jwt와 pyjwt 두개 설치하는 문제일 가능성이 높아 보여서, jwt를 requirement.txt에서 지우고, 다시 deploy했으나, 같은 문제가 반복되었다. 그럼 이건 pass.

 

그 다음, 무슨 호환성 문제인지는 명확하지 않았지만 django 프로젝트에서 발생한 글을 많이 발견했고 해당 이슈를 해결하려면 pyjwt를 1.7.1로 다운그레이드 하면 된다는 글을 봤다. 우선 따라 해보자. 근데 안된다. 

 

로그를 따라가봤더니, 버전을 낮췄더니 AttributeError는 없지만, pyjwt로 encode한 토큰이 byte로 출력되어 jsonify가 안되는 에러였다. 이게 맞나 싶었지만, 코드에 .decode('utf-8')을 추가해서 string으로 바꿔주니 문제없이 배포되긴 했는데... 여전히 이게 맞나 싶은 찜찜함.


Solution

이 글에 쓸 캡쳐를 뜨려고 새로운 프로젝트를 만들고 deploy 했는데 문제없이 배포된다. ??

 

그렇다는 것은... pyjwt와 jwt 라이브러리 충돌 문제가 맞는 것 같다. 다만, requirement에서 삭제하는 것만으로는 이미 서버에 설치된 것이 없어지지 않는 것이라는 추측.

다만, aws EB에 재배포 할 때 requirements.txt에서 지우고 추가하는 것만으로 라이브러리 설치와 삭제가 가능한지 아닌지에 대해서는 확실히 모르겠다. 그러니까 배포할 때마다 환경을 초기화 하는건 아닐 것 같아서.

 

단순히 requirements.txt내용을 pip install에 붙이기만 한다면, requirements.txt에서 지웠다가 라이브러리가 삭제되진 않았을 거니까....어제 환경을 한번 지웠다 다시 배포를 해서 그때 jwt 라이브러리가 삭제되었고, 오늘 아침에 다시 하니 된 것이 아닌가? 싶은 생각.

 


Learned

실제 배포할 때 이슈가 엄청나게 다양할 것 같다. 이런 스트레스를 없애기 위해 docker를 쓴다고 어디서 들은 것 같기도 한데..? 천천히 공부해봐야겠다.