[Django] AWS S3와 연동하기
Server/Django

[Django] AWS S3와 연동하기




Django, AWS S3와 연동하기


 

AWS에 입장하여, 서비스 -> S3를 눌러 S3 Manage Console에 진입한다.

 

1. 버킷 만들기를 클릭

'버킷 만들기' 클릭

 

2. 버킷 이름을 적어주고 '다음'

3. 옵션 구성 페이지. 현재는 필요 없다. 바로 '다음'을 클릭

4. 전체 체크를 풀어주고 퍼블릭 정책 관련한 아래 2가지만 체크해주고 '다음' 클릭

5. 위와 똑같게 맞추었다면, 바로 '다음'을 눌러도 무방하다. '다음' 클릭

6. 제대로 버킷이 생성되었다면, IAM을 설정하러 갈 차례이다.

Hot Ez Ex) IAM이란 쉽게 비유하자면 리눅스에서 nginx나 db용 유저를 따로 만들어 관리하듯이, 그런 유저를 하나 새로 만들어준다고 생각하면 된다. 물론 전체적인 상황에서는 다를 수 있지만 현재 상황에서는 비슷한 용도의 임의 유저를 만들어준다고 보면 된다.

 

7. 서비스 -> IAM 클릭

 

8. 사용자 버튼 -> 사용자 추가를 클릭하고 '사용자 이름'을 정하고 '액세스 유형'에 프로그래밍 방식 엑세스를 체크하여준다.

 

9. 그룹에 사용자 추가 화면이 나올텐데 ' 그룹 생성' 버튼을 누르고 '그룹 이름'을 적어주고 필터에 s3를 적어 나오는 FullAccess에 체크를 해주고 그룹을 생성해준다.

10. 이후 나오는 화면은 태그 설정화면인데 굳이 필요없다면 그냥 넘어가도 된다. 생성완료 후 표시되는 액세스 키와 비밀 액세스 키 모두를 어디 적어두거나 알아두고, 혹은 csv 파일 받기로 저장해둔다.

 

11. django가 설치된 서버로 넘어가서, s3와 연동할 수 있는 패키지인 boto3와 다양한 저장소를 이용가능토록 하는 패키지인 django-storages를 설치한다.

$ (venv) pip3.7 install boto3
$ (venv) pip3.7 install django-storages

12. 설치 후 settings.py 에서 설정 작업을 해준다. (static, media 경로 설정은, 전글에서 확인하면 좋다)

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

# media file (as a upload file)
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

#AWS S3

AWS_ACCESS_KEY_ID = 'Access key ID'
AWS_SECRET_ACCESS_KEY = 'Access Secret Key'
AWS_REGION = 'ap-northeast-2'
AWS_STORAGE_BUCKET_NAME = '버킷명'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.%s.amazonaws.com' % (AWS_STORAGE_BUCKET_NAME,AWS_REGION)

DATA_UPLOAD_MAX_MEMORY_SIZE = 1024000000 # value in bytes 1GB here
FILE_UPLOAD_MAX_MEMORY_SIZE = 1024000000

DEFAULT_FILE_STORAGE = '프로젝트명.storages.S3DefaultStorage'
STATICFILES_STORAGE = '프로젝트명.storages.S3StaticStorage'

13. 그리고 storages 패키지용 파일을 하나 만들어준다. 이는 프로젝트 폴더 내에 위치시킨다.

$ vi storages.py

from storages.backends.s3boto3 import S3Boto3Storage

__all__ = (
    'S3StaticStorage',
    'S3DefaultStorage',
)

# for media
class S3DefaultStorage(S3Boto3Storage):
    default_acl = 'private'
    location = 'media'
    
# for static
class S3StaticStorage(S3Boto3Storage):
    default_acl = 'public-read'
    location = 'static'


14. 마지막으로 nginx, wsgi연동까지 해두었다면 nginx 설정도 해주어야 한다. 지난 번글을 그대로 이어서 설명하자면,

server {
	...
    
	client_max_body_size 128M;
        charset UTF-8;
        
        ...

        location /static/ {
             alias https://버킷명.s3.northeast.amazonaws.com/static/;
        }

        location /media/ {
             alias https://버킷명.s3.northeast.amazonaws.com/media/;
        }

위와 같이, 업로드 허용 용량을 설정해주고, 기존에 설정해두었던 static과 media 경로를 s3경로로 바꾸어주면 된다.

해당 버킷 내에 media나 static 폴더가 없어도, 데이터가 들어가는 순간 만들어지므로 걱정할 필요는 없다.

 

마지막으로, 기존 django 서버에 urls.py에 static용 설정을 해주었다면 해제시켜준다.

urlpatterns = [
...
]
# + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

이후 collectstatics 명령어를 실행시켜서 s3에 static과 media 파일을 저장한다.

$ (venv) python3 manage.py collectstatic