AWS Elastic Beanstalk 배포할 때. requirements.txt 생성 시 주의할 점

sig03
8 min readDec 14, 2022

--

AWS Elastic Beanstalk에 배포를 위한 튜토리얼을 작성 중이다. 새롭게 구축한 EC2 개발 서버에서 배포 환경을 구축하며 튜토리얼을 만들고 있었다. Django를 설치, eb cli를 설치하고 eb deploy로 배포를 했는데 에러가 난다. 이미 여러번 해봤던 작업인데 계속 에러가 난다. 에러 메시지에 eb-engine.log를 확인하라는 내용이 있어 로그를 다운받아 확인해 보니 cloud-init 이라는 에러 메시지가 있다.

2022/12/13 01:36:09.906093 [INFO] ERROR: Could not find a version that satisfies the requirement cloud-init==22.3.4 (from versions: none)
ERROR: No matching distribution found for cloud-init==22.3.4

2022/12/13 01:36:09.906134 [ERROR] An error occurred during execution of command [app-deploy] - [InstallDependency]. Stop running the command. Error: fail to install dependencies with requirements.txt file with error Command /bin/sh -c /var/app/venv/staging-LQM1lest/bin/pip install -r requirements.txt failed with error exit status 1. Stderr:ERROR: Could not find a version that satisfies the requirement cloud-init==22.3.4 (from versions: none)
ERROR: No matching distribution found for cloud-init==22.3.4

requirements.txt 버전 관련한 문제인 것 같은데 cloud-init을 다운그레이드 해보고 삭제도 해 봤지만 모듈을 못 찾는다. 안 된다. 구글링 해봐도 뚜렷한 답을 찾을 수 없었다.

새로운 개발 서버에서는 안 됐는데 혹시나 해서 구 개발 서버에서 deploy를 테스트 해 봤다. 잘 된다. 에러없이 잘 배포된다. 계속 구서버와 신서버를 왔다 갔다하며 테스트 해 봐도 구서버는 잘 되는데 신서버는 안 된다. 새 개발 서버를 세팅하면서 뭘 잘 못 설치한 것일까? 너무 귀찮지만 개발 서버를 새로 구축하는 방안까지 고려했다.

개발 서버 구축 전 마지막으로 최소 영역으로 구축해서 테스트 해 보기로 했다. 조건을 단순화 하고 어떻게든 동작하는 방법을 찾고, 거기에 변수를 하나씩 추가하는 방법으로 안 되는 원인을 찾는 것이다. 일단 가장 기본적인 Elastic Beanstalk 환경을 마련했다. 신서버에서도 가장 기초적인 django 프로젝트를 생성했다.

생성 과정도 하나 하나 적어가며 변수가 될 만한 요소를 체크했다. 그랬더니 된다. 가장 기초적인 테스트 과정이 통과된다.

이제 변수를 추가해 가며 테스트 했다. Elastic Beanstalk를 실제 배포 환경과 동일하게 구성하고 다시 테스트 했더니 이번에도 배포된다. 그러다 원인을 찾았다. 바로 requirement.txt 파일.

Elastic Beanstalk에 배포 전

pip freeze > requirement.txt 

명령어로 requirement.txt 파일을 생성해 놔야 한다.

이는 Django 프로젝트에서 사용되는 패키지를 추출해 Elastic Beanstalk에 알려주는 용도이다. 일반적으로 django 프로젝트에서는 가상 환경을 만들어 동작하는걸 추천한다. 그래야 패키지를 설치해도 전역으로 설치 안 되고 가상 환경 상태인 로컬로 설치된다.

작업할 때 django 프로젝트를 만들면서 가상 환경에서 동작을 했는데 배포할 때는 왠지 가상 환경을 끄고 해야만 할 것 같았다. 왜냐면 가상 환경은 django의 환경이고 aws 배포는 다른 영역이니까 다르다고 생각했다. 그래서 가상 환경을 종료하고 requirements.txt를 만들고 배포를 했는데 여기서 문제가 발생한 것이다.

Django 가상 환경 On 모드에서 requirements.txt 추출 => 해당 모드에 설치된 패키지만 추출

Django 가상 환경 Off 모드에서 requirements.txt 추출 => 전체 패키지 추출

Elastic Beanstalk가 필요로 하는건 배포하려는 Django 환경의 패키지인데 업로드 된 건 전체 패키지 리스트였다. 배포하려는 Django 프로젝트와 requirement.txt에서 필요로 하는 패키지가 맞지 않으니 배포가 안 됐던 것이다. 어쩐지 배포가 되는 서버와 안 되는 서버의 requirements.txt 내용의 차이가 크더라.

#배포가 되는 서버의 requirements.txt

asgiref==3.5.2
certifi==2022.12.7
cffi==1.15.1
charset-normalizer==2.1.1
cryptography==38.0.4
Deprecated==1.2.13
Django==4.1.4
django-cors-headers==3.13.0
django-oauth-toolkit==2.2.0
djangorestframework==3.14.0
djongo==1.3.6
dnspython==2.2.1
idna==3.4
jwcrypto==1.4.2
oauthlib==3.2.2ㅅ
pycparser==2.21
pymongo==4.3.3
pytz==2022.6
requests==2.28.1
sqlparse==0.2.4
urllib3==1.26.13
wrapt==1.14.1
#배포가 안 되는 서버의 requirements.txt
#패키지가 엄청 많음

cloud-init==22.4.2
colorama==0.4.4
command-not-found==0.3
configobj==5.0.6
constantly==15.1.0
cryptography==3.4.8
dbus-python==1.2.18
distlib==0.3.6
distro==1.7.0
distro-info===1.1build1
Django==3.2.12
ec2-hibinit-agent==1.0.0
filelock==3.8.2
httplib2==0.20.2
hyperlink==21.0.0
idna==3.3
importlib-metadata==4.6.4
incremental==21.3.0
jeepney==0.7.1
Jinja2==3.0.3
jsonpatch==1.32
jsonpointer==2.0
jsonschema==3.2.0
keyring==23.5.0
launchpadlib==1.10.16
lazr.restfulclient==0.14.4
lazr.uri==1.0.6
MarkupSafe==2.0.1
more-itertools==8.10.0
netifaces==0.11.0
oauthlib==3.2.0
pexpect==4.8.0
platformdirs==2.6.0
ptyprocess==0.7.0
pyasn1==0.4.8
pyasn1-modules==0.2.1
PyGObject==3.42.1
PyHamcrest==2.0.2
PyJWT==2.3.0
pyOpenSSL==21.0.0
pyparsing==2.4.7
pyrsistent==0.18.1
pyserial==3.5
python-apt==2.3.0+ubuntu2.1
python-debian===0.1.43ubuntu1
python-magic==0.4.24
pytz==2022.1
PyYAML==5.4.1
requests==2.25.1
SecretStorage==3.3.1
service-identity==18.1.0
six==1.16.0
sos==4.4
sqlparse==0.4.2
ssh-import-id==5.11
systemd-python==234
Twisted==22.1.0
ubuntu-advantage-tools==27.12
ufw==0.36.1
...

Django의 가상 환경 모드를 켰으면 거기서 requirements.txt를 생성하고 배포까지 해 버리면 된다.

사소한 내용이지만 잘 모를땐 사람 미치게 하고 하루를 날려 버리게 만드는 그런 오류. 그래도 어떻게든 원인을 찾고 이렇게 블로그까지 올릴 수 있게 되어 기쁘다.

--

--

sig03
sig03

No responses yet