DEPLOYMENT TO AWS #1에 이어서 진행하겠습니다.
서버를 실행하면 ProgrammingError를 일으키며 View가 적절히 실행되지 않고 있습니다. 왜냐하면 아직 migration하지 않았으니까요..!
각 app에는 migration파일이 있지만 아직 적용되지 않았습니다. 그래서 django EB에 command를 보냅니다.
.ebextensions/django.config
라는 폴더에 container_commands:
를 넣어주는데 기본적으로 다 끝났을 때 실행하도록 하는 코드입니다.
container_commands:
01_migrate:
command: "django-admin migrate"
leader_only: true
02_compilemessages:
command: "django-admin compilemessages"
option_settings:
aws:elasticbeanstalk:container:python:
WSGIPath: config/wsgi.py
aws:elasticbeanstalk:application:environment:
DJANGO_SETTINGS_MODULE: config.settings
leader_only: true
는 하나의 인스턴스를 가지고 있고, 트래픽이 들어오는데 우리의 컨테이너가 오직 leader만 커맨드를 실행하고, migration을 한번만 실행하라고 하는 커맨드입니다.
해당 코드를 입력하고 git add 및 commit을 합니다.
여기서 migrate 커맨드가 실패했다는 에러를 접한 경우 다음의 코드를 입력하며 이 링크를 참고합니다.
container_commands:
01_migrate:
command: "source /var/app/venv/*/bin/activate && python3 manage.py migrate"
leader_only: true
migrate command를 어떻게 하는지는 공식문서에 잘 나와있습니다. 함께 참조하세요!!
이를 완료하면 해당 웹사이트가 실행됩니다... 완벽하게는 아니구... 90프로정도...?!
저의 경우는 CSS도 빠지고, 번역 기능도 빠지고 하더군요..!
배포판에서는 DEBUG
를 True로 하면 안됩니다. 그러면 에러에 대한 정보를 어디서 볼까요..? 답은 sentry.io를 활용합니다. (혹은 setting파일을 개발판, 배포판 등 세분화해 노랑색 debug화면을 보는 방법도 있습니다.)
create 프로젝트를 하고 pip install sentry-sdk==버전
을 터미널에 입력해 설치합니다.
그리고 import를 하고 if not DEBUG:
일 때 sentry_sdk.init
를 입력합니다.
if not DEBUG:
sentry_sdk.init(
dsn=os.environ.get("SENTRY_URL"),
integrations=[DjangoIntegration()],
send_default_pii=True, # 매번 에러가 있을 때 마다 보여줍니다.
)
보안을 위해 해당 변수를 aws에 올리도록 합니다.
그리고 프로젝트 url에 다음의 코드를 덧붙입니다.
def trigger_error(request):
division_by_zero = 1 / 0
urlpatterns = [
...
path("sentry-debug/", trigger_error),
...
]
다 했으면 requirements.txt
에 꼭 추가하고 git add, commit한 후 eb deploy합니다!!
에러가 있다면 다음과 같이 표시됩니다.
이미지들은 바로 해당의 서버로 보내면 최적화되지 않을 뿐더러 너무 많은 용량을 차지하게 됩니다. 따라서 이미지들을 다른 서버로 최적화해서 보관합니다.
미디어나 정적 파일을 공유할 수 있도록 AWS S3를 설정해보겠습니다.
pip install django-storages
로 django-storages를 설치합니다.
INSTALLED_APPS에 storages를 올려줍니다.
INSTALLED_APPS = [...,"storages"]
if not DEBUG:
DEFAULT_FILE_STORAGE = "config.custom_storages.UploadStorage"
STATICFILES_STORAGE = "config.custom_storages.StaticStorage"
AWS_ACCESS_KEY_ID = os.environ.get("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.environ.get("AWS_SECRET_ACCESS_KEY")
AWS_STORAGE_BUCKET_NAME = "설정한-버켓-이름"
AWS_DEFAULT_ACL = "public-read"
# AWS_AUTO_CREATE_BUCKET = True # django-storages가 업그레이드되면서 삭제
# 밑에서 설명!!
# AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com"
# STATIC_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/static/"
DEFAULT_FILE_STORAGE
는 다음과 같고, 자동적으로 s3에 static한 파일을 넣으려면 STATICFILES_STORAGE
설정을 해주어야 합니다.
해당의 코드는 시뮬레이터 느낌으로, 본 서버에 적용하려면 python manage.py collectstatics
를 실행합니다.
그러면 다음과 같이 boto3
라는 모듈이 없다고 하는데 설치해줍니다. pip install boto3
그런 후에 s3에 가보면 다음과 같이 버켓이 열려있습니다.
그 후에 static한 파일들을 collect합니다.
container_commands:
.
.
.
04_collectstatic:
command: "django-admin collectstatic --noinput" # 모든 것을 yes하도록 함
여기서 STATIC_URL과 MEDIA_URL은 AWS s3로 변경하였으니 이제는 실행되지 못합니다. 그래서 해당 값을 잘 받도록 변경합니다.
if not DEBUG:
DEFAULT_FILE_STORAGE = "config.custom_storages.UploadStorage"
STATICFILES_STORAGE = "config.custom_storages.StaticStorage"
AWS_ACCESS_KEY_ID = os.environ.get("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.environ.get("AWS_SECRET_ACCESS_KEY")
AWS_STORAGE_BUCKET_NAME = "설정한-버켓-이름"
AWS_DEFAULT_ACL = "public-read"
# AWS_AUTO_CREATE_BUCKET = True # django-storages가 업그레이드되면서 사라짐
AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com"
STATIC_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/static/"
그리고 config/custom_storages.py
에 해당 목록을 관리하도록 합니다.
from storages.backends.s3boto3 import S3Boto3Storage
class StaticStorage(S3Boto3Storage):
location = "static/"
file_overwrite = False # 파일이 같을 경우, 업로드하지 않도록 함
class UploadStorage(S3Boto3Storage):
location = "uploads/"
해당 페이지를 참고하였습니다.
마지막으로 배포한 뒤 github이나, kakao로그인 등 소셜로그인이 제대로 작동하지 않는다면 url이 "http://127.0.0.1:8000/"
로 설정돼 있기 때문입니다. url을 배포하신 홈페이지의 주소로 변경합니다.