장고 - AWS S3 연동 방법

1. AWS > 서비스 > 스토리지 > S3 접속

  • 버킷 생성
    • 버킷 이름 설정 (ex. media.wpsschool.site)
    • 지역 > ‘아시아 태평양(서울)’ 설정
    • ‘이 버킷의 퍼블릭 액세스 설정’ 4개 항목 체크 해제
    • ‘시스템 권한 관리’ 액세스 권한 부여
    • 버킷 만들기
    • 속성 > 정적 웹 사이트 호스팅 > ‘이 버킷을 사용하여 웹 사이트를 호스팅합니다.’ > 인덱스 문서, 오류문서 작성 > 저장



2. 보안, 자격 증명 및 규정 준수 > IAM 접속

  • 사용자 클릭
    • 사용자 이름 입력(ex. wps10-s3)
    • 액세스 유형의 프로그래밍 방식 액세스 선택
    • 그룹에 사용자 추가 > 그룹 생성
      • 그룹 이름 입력
      • AlexaForBusinessFullAccess 선택
      • 그룹 생성
      • .csv로 파일 받기(Access key ID, Secret access key 확인하기 위함)
        –> 잃어버리면 다시는 확인할 수 없으니, 주의할 것

3. S3 이용하기 위한 모듈 설치

  • pip install boto3
  • pip install django-storages

4. 프로젝트 > settings 수정

경로 : dstagram_project[루트 디렉토리] > config[프로젝트 이름] > settings.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
AWS_ACCESS_KEY_ID = 'ACCESS KEY ID 입력'
AWS_SECRET_ACCESS_KEY = 'SECRET ACCESS KEY 입력'
AWS_REGION = 'ap-northeast-2'
AWS_STORAGE_BUCKET_NAME = '버킷 이름'
AWS_S3_CUSTOM_DOMAIN = 's3.%s.amazonaws.com/%s' % (AWS_REGION, AWS_STORAGE_BUCKET_NAME)
# Route 53 연결 시, AWS_S3_CUSTOM_DOMAIN 수정
# AWS_S3_CUSTOM_DOMAIN = '%s' AWS_STORAGE_BUCKET_NAME
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl' : 'max-age=86400',
}
AWS_DEFAULT_ACL = 'public-read'
AWS_LOCATION = 'static'
AWS_S3_SECURE_URLS = False

STATIC_URL = 'http://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

DEFAULT_FILE_STORAGE = 'config.asset_storage.MediaStorage'

5. S3 버킷에 static 파일 생성 및 연동

python manage.py collectstatic

6. 프로젝트 > asset_storage.py 생성

경로 : dstagram_project > config > asset_storage.py 생성

1
2
3
4
5
6
7
8
9
10
from storages.backends.s3boto3 import S3Boto3Storage
class MediaStorage(S3Boto3Storage):
location = 'media'
file_overwrite = False
bucket_name = '버킷 이름'

region_name = 'ap-northeast-2'
custom_domain = 's3.%s.amazonaws.com/%s' % (region_name, bucket_name)
# Route 53 연결 시, custom_domain 을 bucket_name으로 설정
# custom_domain = bucket_name

7. 프로젝트의 url.py 수정

경로 : dstagram_project > config > urls.py

urlpattern += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 주석처리

8. S3 버킷에 media 파일 생성 및 연동

  • S3 버킷 생성 이전, 이미 생성한 media 파일들을 업로드하기 위한 코드 입력

    경로 : dstagram_project > s3_upload.py 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import boto3 # s3에 파일을 업로드 하는 용도
import os # 현재 업로드할 파일 탐색

def upload_files(search_path, target_path):
session = boto3.Session(
aws_access_key_id='ACCESS KEY ID 입력',
aws_secret_access_key='SECRET ACCESS KEY 입력',
region_name='ap-northeast-2'
)

s3 = session.resource('s3')
bucket = s3.Bucket('media.wpsshool.site')

for current_dir, subdir, files in os.walk(search_path):
for file in files:
full_path = os.path.join(current_dir, file)
with open(full_path, 'rb') as data: # rb - binary 형태
bucket.put_object(Key=target_path+"/"+(full_path.replace("\\","/"))[len(search_path)+1:],Body=data, ACL='public-read')
# Key는 media 하위에 올릴 것이다.(s3에 올라가는 폴더) 윈도우에서는 하위 경로를 \\로 표시하므로, /로 바꿔준다.
if __name__ == "__main__":
upload_files('./media', 'media')