작업중인 프로젝트를 오랜만에 Elastic Beanstalk (이하 EB)에 배포해 봤다. 그런데 에러 발생. 에러 로그를 추적해보니 특정 파일이 없어서 에러가 나고 있다. 배포하는 폴더에는 파일이 있는데 로그는 파일이 없어서 에러가 난다고 한다. 문제가 되는 파일은 django의 중요 정보를 json 파일로 분리해서 관리하고 있는 파일이다. gitlab에도 올리지 않으려고 .gitignore에도 포함시켜 놓았다.
아래는 에러 로그 메시지.
Jan 2 06:21:40 ip-10-0-2-178 web: [2023-01-02 06:21:40 +0000] [3185] [INFO] Starting gunicorn 20.1.0
Jan 2 06:21:40 ip-10-0-2-178 web: [2023-01-02 06:21:40 +0000] [3185] [INFO] Listening at: http://127.0.0.1:8000 (3185)
Jan 2 06:21:40 ip-10-0-2-178 web: [2023-01-02 06:21:40 +0000] [3185] [INFO] Using worker: gthread
Jan 2 06:21:40 ip-10-0-2-178 web: [2023-01-02 06:21:40 +0000] [3191] [INFO] Booting worker with pid: 3191
Jan 2 06:21:40 ip-10-0-2-178 web: [2023-01-02 06:21:40 +0000] [3191] [ERROR] Exception in worker process
Jan 2 06:21:40 ip-10-0-2-178 web: Traceback (most recent call last):
Jan 2 06:21:40 ip-10-0-2-178 web: File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/gunicorn/arbiter.py", line 589, in spawn_worker
Jan 2 06:21:40 ip-10-0-2-178 web: worker.init_process()
Jan 2 06:21:40 ip-10-0-2-178 web: File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/gunicorn/workers/gthread.py", line 92, in init_process
Jan 2 06:21:40 ip-10-0-2-178 web: super().init_process()
Jan 2 06:21:40 ip-10-0-2-178 web: File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/gunicorn/workers/base.py", line 134, in init_process
Jan 2 06:21:40 ip-10-0-2-178 web: self.load_wsgi()
Jan 2 06:21:40 ip-10-0-2-178 web: File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/gunicorn/workers/base.py", line 146, in load_wsgi
Jan 2 06:21:40 ip-10-0-2-178 web: self.wsgi = self.app.wsgi()
Jan 2 06:21:40 ip-10-0-2-178 web: File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/gunicorn/app/base.py", line 67, in wsgi
Jan 2 06:21:40 ip-10-0-2-178 web: self.callable = self.load()
Jan 2 06:21:40 ip-10-0-2-178 web: File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 58, in load
Jan 2 06:21:40 ip-10-0-2-178 web: return self.load_wsgiapp()
Jan 2 06:21:40 ip-10-0-2-178 web: File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp
Jan 2 06:21:40 ip-10-0-2-178 web: return util.import_app(self.app_uri)
Jan 2 06:21:40 ip-10-0-2-178 web: File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/gunicorn/util.py", line 359, in import_app
Jan 2 06:21:40 ip-10-0-2-178 web: mod = importlib.import_module(module)
Jan 2 06:21:40 ip-10-0-2-178 web: File "/usr/lib64/python3.8/importlib/__init__.py", line 127, in import_module
Jan 2 06:21:40 ip-10-0-2-178 web: return _bootstrap._gcd_import(name[level:], package, level)
Jan 2 06:21:40 ip-10-0-2-178 web: File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
Jan 2 06:21:40 ip-10-0-2-178 web: File "<frozen importlib._bootstrap>", line 991, in _find_and_load
Jan 2 06:21:40 ip-10-0-2-178 web: File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
Jan 2 06:21:40 ip-10-0-2-178 web: File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
Jan 2 06:21:40 ip-10-0-2-178 web: File "<frozen importlib._bootstrap_external>", line 843, in exec_module
Jan 2 06:21:40 ip-10-0-2-178 web: File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
Jan 2 06:21:40 ip-10-0-2-178 web: File "/var/app/current/MgBackApi/wsgi.py", line 16, in <module>
Jan 2 06:21:40 ip-10-0-2-178 web: application = get_wsgi_application()
Jan 2 06:21:40 ip-10-0-2-178 web: File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/django/core/wsgi.py", line 12, in get_wsgi_application
Jan 2 06:21:40 ip-10-0-2-178 web: django.setup(set_prefix=False)
Jan 2 06:21:40 ip-10-0-2-178 web: File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/django/__init__.py", line 19, in setup
Jan 2 06:21:40 ip-10-0-2-178 web: configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
Jan 2 06:21:40 ip-10-0-2-178 web: File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/django/conf/__init__.py", line 92, in __getattr__
Jan 2 06:21:40 ip-10-0-2-178 web: self._setup(name)
Jan 2 06:21:40 ip-10-0-2-178 web: File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/django/conf/__init__.py", line 79, in _setup
Jan 2 06:21:40 ip-10-0-2-178 web: self._wrapped = Settings(settings_module)
Jan 2 06:21:40 ip-10-0-2-178 web: File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/django/conf/__init__.py", line 190, in __init__
Jan 2 06:21:40 ip-10-0-2-178 web: mod = importlib.import_module(self.SETTINGS_MODULE)
Jan 2 06:21:40 ip-10-0-2-178 web: File "/usr/lib64/python3.8/importlib/__init__.py", line 127, in import_module
Jan 2 06:21:40 ip-10-0-2-178 web: return _bootstrap._gcd_import(name[level:], package, level)
Jan 2 06:21:40 ip-10-0-2-178 web: File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
Jan 2 06:21:40 ip-10-0-2-178 web: File "<frozen importlib._bootstrap>", line 991, in _find_and_load
Jan 2 06:21:40 ip-10-0-2-178 web: File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
Jan 2 06:21:40 ip-10-0-2-178 web: File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
Jan 2 06:21:40 ip-10-0-2-178 web: File "<frozen importlib._bootstrap_external>", line 843, in exec_module
Jan 2 06:21:40 ip-10-0-2-178 web: File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
Jan 2 06:21:40 ip-10-0-2-178 web: File "/var/app/current/MgBackApi/settings.py", line 20, in <module>
Jan 2 06:21:40 ip-10-0-2-178 web: with open(secret_file) as f:
Jan 2 06:21:40 ip-10-0-2-178 web: FileNotFoundError: [Errno 2] No such file or directory: '/var/app/current/sec.json'
안될때는 잘 되는 케이스를 만들어서 뭐가 다른지 비교하며 찾아봐야 한다. 일단 기본 django 프로젝트를 만들고 배포하니 잘 된다. 그렇다면 EB 환경 문제는 아닌거고.
배포되는 기본 프로젝트에 sec.json 파일을 만들어서 배포하니 역시 잘 된다. 그런데 안 되는 프로젝트는 계속 sec.json 파일이 없다고 나오고.
EB에서 생성한 ec2 서버에 접속해 해당 경로에 가보니 진짜 파일이 없다. 잘 되는 프로젝트는 배포 후 가보면 파일이 있다. 안 되는 프로젝트에서 임의의 파일을 임의의 경로에 생성해서 배포하면 역시 파일이 안 올라간다. 혹시 git 문제일까? develop 브랜치에서 커밋치고 main 브랜치에서 pull 받은 후 eb deploy 해 보니 파일이 올라간다.
결론: EB에 git을 연결하면 git으로 추적되는 파일만 배포한다.
참조
https://tdear.tistory.com/5
https://jsdev.kr/t/aws-beanstalk-eb-deploy/3485
https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb3-deploy.html
git가 설치된 경우 EB CLI는 git archive 명령을 사용하여 최신 git commit 명령의 내용에서 .zip 파일을 생성합니다.