카테고리 없음

🪣 AWS S3 bucket Django설정

King of Silicon Valley 2021. 9. 19. 20:28
728x90

장고에서 사용자에게 이미지 파일을 받아서 저장할 경우 저장 공간을 s3 bucket으로 설정하는 법을 알아보자. 

 

우선 s3 bucket을 만들자 

스토리지에 s3클릭 
버킷 만들기 클릭
다른 설정은 그대로 두고 퍼블릭 액세스 설정만 이렇게 하자

 

버킷은 만들어 졌고 IAM 설정을 하자 

보안 및 자격 증명 및 규정 준수의 IAM을 클릭 

 

사용자 탭에서 사용자 추가 클릭
이렇게 설정
그룹 생성  클릭

 

AmazonS3Full Access클릭 후 그룹 생성

 

3번 4번은 건너 뛴다

 마지막에 나오는 키 값만 csv파일로 저장하거나 메모장에 적어둔다.

이 후 장고 설정에 쓰인다. 

 

이제 장고에서 설정을 해보자 다음 사항을 설치해준다. 

pip inastall django-storages
pip install boto3

settings.py를 수정한다. 

 

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

위 코드를 추가 하고 

 

AWS_ACCESS_KEY_ID = AWS_ACCESS_KEY_ID (아까 IAM에서 받은 거)
AWS_SECRET_ACCESS_KEY = AWS_SECRET_ACCESS_KEY (아까 IAM에서 받은 거)
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 = 'core.storages.MediaStorage'
STATICFILES_STORAGE = 'core.storages.StaticStorage'
MEDIAFILES_LOCATION = 'media'
STATICFILES_LOCATION = 'static'

위 코드도 추가한다. 

 

core앱을 만들거나 util앱을 만든다. 

 

storages.py 파일을 만든다. 

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


class MediaStorage(S3Boto3Storage):
    location = settings.MEDIAFILES_LOCATION
    file_overwrite = False

class StaticStorage(S3Boto3Storage):
    location = settings.STATICFILES_LOCATION
    file_overwrite = False

strages.py파일에 위 코드를 추가해준다. 

 

이제 이미지 저장을 해보자 

from django.shortcuts import render
from .models import ProductImage, Product
from django.http     import JsonResponse
# Create your views here.
def show_img(request):
    if request.method == 'POST':
        img = request.FILES.get('img-file')
        product = Product.objects.get(id=1)
        ProductImage.objects.create(product=product ,image_url=img)
        return JsonResponse({'MESSAGE': 'success'}, status=200)     
    if request.method == 'GET':
        a = Product.objects.get(id=1)
        result = {
            'url':[i.image_url.url for i in a.productimage_set.all()]
        }
        return JsonResponse({'MESSAGE': 'success', 'result':result}, status=200)     
    else:
        return JsonResponse({'MESSAGE': 'fail'}, status=400)

아무 view파일에 적어주고 

위 함수를 실행할 수 있게 url,py설정을 해준다. 

 

포스트맨에서 body에 form-data에 키값 설정하고 파일을 첨부하고 send를 누르면! 

샐리.jpg가 저장이 됐다.