이미지 서버는 웹 서버 인프라에서 중요한 역할을 차지한다. 폭발적인 사용자 증가를 감당하려면 필히 웹 서버의 댓수를 늘려야 하는데 이럴 경우 사용자가 업로드한 이미지를 동기화하는데 큰 노력이 필요합니다. 동기화 하는데 가장 간단한 방법은 이미지 서버를 별도로 두고 모든 웹 서버가 같은 이미지 서버를 이용하도록 하는 것 입니다.
S3는 이미지 서버로 사용하기에 충분한 파일 서빙 속도를 가지고 있습니다. 그리고 무제한의 용량을 사용할 수 있고 안정성 또한 높아 이미지 서버로 사용하기에 적절합니다.
AWS 회원가입이 완료된 상태로 S3 버킷 생성
1. 서비스 메뉴를 클릭하고 스토리지 -> S3 클릭
2. 버킷 만들기
버킷 만들기 하면 새로운 버킷이 생성된 걸 확인할 수 있다.
이제 API 권한을 설정하겠습니다.
IAM 설정하기
아마존은 보안 정책이 강력해서 어떤 기능이던지 개별적으로 권한을 부여해서 사용할 수 있다.
S3 를 이용하기 위한 권한을 만들어 보겠습니다.
1. 서비스 버튼 클릭 ->보안, 자격 증명 및 규정 준수 -> IAM 클릭
2. 왼쪽에 사용자 버튼 클릭
3. 사용자 추가 버튼 클릭
4. 태그 추가(선택 사항) 이 나오는데 무시하고 다음:검토 클릭
5. [사용자 만들기] 클릭
사용자 생성을 완료했습니다. 마지막 페이지에 나오는 액세스 키는 다시는 확인할 방법이 없습니다.
위 쪽에 csv 다운로드 버튼을 클릭해 파일을 다운로드 해둡시다.
이제 파이참에서 소스를 수정해봅시다.
S3 연동하기
S3를 프로젝트에 연동하기 위해서는 모듈을 설치해야 한다.
boto3는 아마존 S3를 사용할 수 있도록 하는 모듈입니다.
$ pip install boto3
django-storages는 장고에서 다양한 저장소를 사용할 수 있게 해주는 모듈입니다.
$ pip install django-storages
설치한 모듈들을 이용하기 위한 정보를 settings.py 에 입력하겠습니다.
settings.py
INSTALLED_APPS = [
'storages',
]
AWS_ACCESS_KEY_ID = 'user key' # .csv 파일에 있는 내용을 입력 Access key ID
AWS_SECRET_ACCESS_KEY = 'user secretkey' # .csv 파일에 있는 내용을 입력 Secret access key
AWS_REGION = 'ap-northeast-2'
AWS_STORAGE_BUCKET_NAME = 'd-stagram' # 설정한 이름
AWS_S3_CUSTOM_DOMAIN = '%s.s3.%s.amazonaws.com' % (AWS_STORAGE_BUCKET_NAME,AWS_REGION)
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
DEFAULT_FILE_STORAGE = 'config.asset_storage.MediaStorage'
# 다음에 만들 MediaStorage라는 클래스를 통해 파일 저장소를 사용하겠다' 라는 의미
config 폴더에 asset_storage.py 라는 파일을 만들 후 다음 코드를 입력
from storages.backends.s3boto3 import S3Boto3Storage
class MediaStorage(S3Boto3Storage):
location = 'media'
file_overwrite = False
boto3 모듈을 사용해서 아마존 S3 이용할 수 있게 됐습니다. 이제 불 필요한 설정은 제거하겠습니다.
config/urls.py
from django.conf.urls.static import staticfrom django.conf import settings
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
제거 후 새로운 사진을 업로드해주면 잘 동작하는 걸 확인할 수 있고 업로드한 이미지는
S3 서비스 페이지에서도 확인할 수 있습니다.
'Web > Django' 카테고리의 다른 글
Django - Pagination (0) | 2019.08.02 |
---|---|
Django - Dstagram part5-배포하기 헤로쿠(Heroku) (0) | 2019.07.23 |
Django - Dstagram part3-댓글 기능 구현하기 (0) | 2019.07.23 |
Django - Dstagram part2-Account app (0) | 2019.07.18 |
Django - Dstagram part1-Photo app (0) | 2019.07.18 |
댓글