DEPLOYMENT TO AWS #2

tritny6516·2022년 2월 27일
0
post-thumbnail

DEPLOYMENT TO AWS #1에 이어서 진행하겠습니다.

Container_commands


서버를 실행하면 ProgrammingError를 일으키며 View가 적절히 실행되지 않고 있습니다. 왜냐하면 아직 migration하지 않았으니까요..!

각 app에는 migration파일이 있지만 아직 적용되지 않았습니다. 그래서 django EB에 command를 보냅니다.

migrate

.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도 빠지고, 번역 기능도 빠지고 하더군요..!

Sentry

배포판에서는 DEBUG를 True로 하면 안됩니다. 그러면 에러에 대한 정보를 어디서 볼까요..? 답은 sentry.io를 활용합니다. (혹은 setting파일을 개발판, 배포판 등 세분화해 노랑색 debug화면을 보는 방법도 있습니다.)

sentry.io

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합니다!!

에러가 있다면 다음과 같이 표시됩니다.

Staticfiles

이미지들은 바로 해당의 서버로 보내면 최적화되지 않을 뿐더러 너무 많은 용량을 차지하게 됩니다. 따라서 이미지들을 다른 서버로 최적화해서 보관합니다.

미디어나 정적 파일을 공유할 수 있도록 AWS S3를 설정해보겠습니다.

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을 배포하신 홈페이지의 주소로 변경합니다.

profile
피자, 코드, 커피를 사랑하는 1인

0개의 댓글