코딩공부/Python Django

python django heroku + aws s3 이용하기 (마무리)

integerJI 2020. 1. 2. 12:13

저번 강의부터 이어서 시작하겠습니다.

 

1. Django 설정

1-1. django_storages 설치하기

 

장고의 파일 시스템을 이용하기 위하여 storages를 설치하여 줍시다.

pip install django_storages

해당 명령어로 storages를 설치하였다면 settings.py에서 installed_apps에 storages를 설치하였다고 알려줍시다.

 

그다음은 s3버킷을 편하게 제어하기 위하여 boot3을 설치하여야 합니다.

pip install boto3

boot3는 안 알려 줘도 됩니다.

 

1-2. settingsp.py 설정

 

settings.py에 들어와서 S3버킷과 연결하기 위해 설정을 해줍시다.

DEFAULT_FILE_STORAGE = 'postproject.storages.MediaStorage'
STATICFILES_STORAGE = 'postproject.storages.StaticStorage'

MEDIAFILES_LOCATION = 'media'
STATICFILES_LOCATION = 'static'

AWS_ACCESS_KEY_ID = 'AKIAW4C2EAADAKSPONWT'
AWS_SECRET_ACCESS_KEY = '************'
AWS_STORAGE_BUCKET_NAME = 'jeongsu-test'

첫 번째 줄은 Django에서 기본 저장 시스템 클래스를 지정해주는 설정입니다.

 

두 번째 줄은 static 파일들을 s3버킷에 저장하도록 하는 설정이며

 

코드를 부면 postproject라고 처음에 만든 project가 설정되어있는데 이를 위해 storages를 만들어주어야 합니다.

 

from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage

class MediaStorage(S3Boto3Storage):
    location = settings.MEDIAFILES_LOCATION

class StaticStorage(S3Boto3Storage):
    location = settings.STATICFILES_LOCATION

settings.py와 같은 위치에 storages.py를 만들어주어 해당 코드를 넣어 줍니다.

 

이어서 셋, 네 번째 줄은 static, media란 폴더를 만들어 저장하란 뜻입니다.

 

차례로 사용자를 만들며 받은 credentials파일에 있는 KEY_ID와 SECRET_KEY입니다.

 

마지막으로 BUCKET에 만들었던 이름을 입력해 줍니다.

 

1-3. 확인

 

settings.py과 버킷 설정을 끝냈다면 collectstatic를 하여 파일들이 s3버킷에 정상적으로 저장이 되는지 확인하여 줍시다.

python manage.py collectstatic

하면 나올 어쩌고 저쩌고에 yes를 입력하면..

 

뭐라 샬라 샬라 뜬 뒤에 정상적으로 완료가 되어야 합니다. 오류 없이 완료가 되었다면 s3버킷을 확인하여 줍시다.

 

짜잔! static 파일들이 정상적으로 등록이 되었습니다.

 

이제 runserver를 하여 media파일을 올려 봅시다.

 

로컬 서버에 글을 한번 올려 보았습니다.

 

이제 s3버킷에 media란 폴더가 생겨 해당 파일이 등록되면 성공입니다.

 

두근두근...

 

짜잔 정상 등록되었습니다!!

 

근데 보시면 media 다음 usr이란 폴더에 파일이 등록되어있는데 

 

이는 img파일을 등록할 때 models.py에서 이렇게 설정해주어 usr폴더에 등록이 된 것이니 안심하셔도 됩니다.

 

2. heroku push

이제 이렇게 설정을 해주었다면 github에 올리고 heroku에 push를 해주어야 합니다.

 

하지만 저희는 settings.py에 AWS_SECRET_ACCESS_KEY를 그대로 올렸습니다.

 

이런 행동은 절대 하면 안 됩니다.

 

절대로 SECRET_KEY는 저렇게 보관하시면 안 됩니다. 

 

KEY가 노출이 될 경우 사악한 사람들이 KEY를 훔쳐 저희의 AWS 서비스를 마구마구 사용하여 요금폭탄을 먹게 될 것입니다.

 

2-1. heroku 설정

 

heroku config:set AWS_ACCESS_KEY_ID=*** AWS_SECRET_ACCESS_KEY=***

heroku config:set S3_BUCKET_NAME=***

***이 들아갈 곳은 자신의 ACCESS_KEY_ID와 SECRET_ACCESS_KEY를 입력하면 됩니다.

 

BUCKET도 똑같이 입력해 줍니다.

 

입력을 했다면 잘 입력이 되었는지 heroku 사이트로 들어가서 확인해 봅시다.

 

heroku로 들어와 저번 강의 때 배포하였던 해당 서버로 들어가 줍니다.

 

settings 선택 후

 

Config Vars의 Reveal Config Vars를 눌러줍니다.

 

이렇게 중요한 키를 heroku 자체에 보관하여 줍니다.

 

2-2. settings.py 설정

 

다시 project로 돌아와 settings.py를 수정하여 줍시다.

 

STATICFILES 아래에 평문으로 저장되어 있던

AWS_ACCESS_KEY_ID = 'AKIAW4C2EAADAKSPONWT'
AWS_SECRET_ACCESS_KEY = '************'
AWS_STORAGE_BUCKET_NAME = 'jeongsu-test'

해당 내용을 삭제하고

 

from boto.s3.connection import S3Connection

# s3 = S3Connection(os.environ['S3_KEY'], os.environ['S3_SECRET'])

AWS_STORAGE_BUCKET_NAME = 'jeongsu-test'

AWS_S3_REGION_NAME = "ap-northeast-2"

AWS_S3_SIGNATURE_VERSION = "s3v4"

새로운 내용을 넣어줍니다. 

 

또한 boto를 사용하기 위하여 pip install를 해줍시다.

 

pip install boto

 

3. 다시 배포

3-1. 라이브러리 리스트 만들기

 

pip install로 설치한 라이브러리들이 있기 때문에 다시 한번 리스트를 만들어 줍니다.

pip freeze > requirements.txt

3-2. github push 하기

git init
git add .
git commit -m "heroku+s3"
git push -u origin master

잘 올라갔는지 확인해 줍시다. 모르고 first commit로 올렸는데 올린 시간을 보면 바뀐 걸 확인할 수 있습니다.

 

3-3. heroku 배포

git push heroku master

모든 설정은 한번 하면 바꾸지 않는 이상 쭉 유지되어 이 정도 명령어만 입력해도 정상적으로 등록이 됩니다.

 

이제 확인을 해봅시다!!

 

번외. 오류

 

저는 이런 오류가 떴네요 

모든 오류는 내용을 보면 있습니다.

 

쭉 읽어보니 뭔지는 모르겠지만 4번째 줄에 $표시의 명령어를 입력해 봐야 할 거 같아서 입력하니 해결되었습니다.

 

DISABLE_COLLECTSTATIC를 1로 해주는 건가 봅니다. 저부분을 복사해서 입력!

 

뭐가 뜨면서 잘 된 것 같습니다.

 

이제 다시 heroku push!!

 

잘 올라갔으니 heroku open 혹은 해당 주소로 들어가 s3버킷에 잘 저장이 되는지 확인해 봅시다!

(앗 사진에는 명령어 오타입니다.)

 

이제 heroku서버에서도 media파일이 잘 올라가나 확인해 봅니다.

정상적으로 올라갔습니다.

 

과연 s3 버킷에는..?!

 

짜잔 정상적으로 올라갔습니다.!!!

 

이걸로 배포까지 끝내겠습니다. 짝짝짝