Django + S3(AWS) 연동

xhaktm·2023년 12월 26일
0

TIL

목록 보기
5/9

AWS S3 bucket 생성

S3 -> 버킷 -> 버킷 만들기

리전 선택 -> 버킷 이름 지정

객체 소유권 디폴트 값 선택
-> ACL 비활성화를 선택하여 내가 접속한 계정에서만 권한 소유가 되도록 함.

이미지 업로드 활성화를 위해 퍼블릭 액세스 차단 해제

나머지 설정은 비활성화 및 디폴트값으로 선택 후 버킷 만들기 실행

AWS_ACCESS_KEY 생성

본인 계정 클릭 -> 보안 자격 증명 클릭

좌측 사이드바의 사용자 클릭

사용자 생성 클릭

사용자 이름 지정 -> 다음 -> 권한 옵션(직접 정책 연결) 클릭

S3 검색 -> S3FullAccess 권한 부여 -> 다음 -> 사용자 생성

생성된 사용자 이름 클릭

액세스키 만들기 -> 사용 사례 첫번째 Command 클릭 -> 다음 -> 액세스키 만들기

액세스키 생성 후, Key 메모장에 저장 및 csv 파일 다운로드

Django_settings.py

  1. 기존 media폴더 경로 설정 주석 처리
# MEDIA_URL = "/media/"
# MEDIA_ROOT = os.path.join(BASE_DIR, "media")
  1. 아래 코드 추가
#django-storages 패키지의 S3 저장소 클래스를 임포트
from storages.backends.s3boto3 import S3Boto3Storage


# AWS 설정 추가
AWS_REGION = ' ' #AWS서버의 지역
AWS_ACCESS_KEY_ID = ' '
AWS_SECRET_ACCESS_KEY = ' '
AWS_STORAGE_BUCKET_NAME = ' ' #생성한 버킷 이름
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_REGION}.amazonaws.com'

< ----- 정적 파일 설정은 활성화하지 않음. ---------->
# # 정적 파일 설정
# STATIC_LOCATION = 'static'
# STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{STATIC_LOCATION}/'
# STATICFILES_STORAGE = 'your_project.storage_backends.StaticStorage'


# S3 스토리지 클래스
# S3에 저장될 때, 미디어 파일들이 media 서브디렉토리 내에 저장되도록 설정
class MediaStorage(S3Boto3Storage):
    location = 'media'  # 미디어 파일이 저장될 서브디렉토리

# 미디어 파일의 스토리지 설정
DEFAULT_FILE_STORAGE = '내 프로젝트 이름.settings.MediaStorage'

# 미디어 파일의 URL 설정
MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'

S3 bucket 추가 권한 설정

만들어둔 bucket 이름 클릭 -> 권한 클릭 -> 버킷 정책 편집 -> 정책 생성기 클릭


[정책 생성기 url]
https://awspolicygen.s3.amazonaws.com/policygen.html

  1. Select Type of Policy에서 S3 Bucket Policy를 선택
  2. Principal에 *를 입력하고 Actions에 GetObject를 선택
  3. Amazon Resource Name(ARN) 정보 등록
    버킷 이름 -> 속성 클릭하면 ARN 보임

모든 과정 이행 후, 권한이 부여되면 media 파일 업로드 및 호출 가능
-> 다음과 같이 "퍼블릭 액세스 가능"이 표시됨


추가 권한 설정을 하지 않을 경우

브라우저를 열어 확인하면 s3에 업로드된 이미지 url은 로드되지만 객체 URL을 복사하여 브라우저에서 사용하려면 작동하지 않게 된다.

참고 문헌
https://m.blog.naver.com/freedman80/223090691471

profile
"Done is better than Perfect"

0개의 댓글