[Django] AWS, S3를 이용한 이미지 업로드
저번 포스팅에서는 media 파일을 업로드하는 방법을 알아봤습니다.
이번에는 media 파일을 S3를 이용해서 업로드하는 과정에 대해서 알아보도록 하겠습니다.
과정은 총 3단계로 아래와 같이 진행됩니다.
- AWS IAM 세팅
- AWS S3 세팅
- django에서 이미지 업로드
AWS IAM 세팅
AWS IAM이 무엇인지 살펴보고 사용자를 생성하는 예제입니다. IAM을 처음 사용하거나 익숙하지 않다면 위의 포스팅을 참고하시길 바랍니다.
우선 정책을 하나 만들어주겠습니다.
AWS IAM 으로 접속한 뒤 좌측 사이드 바에서 정책을 클릭하여 정책 생성
버튼을 눌러줍시다.
정책 생성 내 JSON으로 편집하여 아래와 같이 입력합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3statement",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObjectAcl",
"s3:GetObject",
"s3:ListBucket",
"s3:DeleteObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::{bucket_name}/*",
"arn:aws:s3:::{bucket_name}"
]
}
]
}
{bucket_name}
부분에는 아래서 생성하는 버킷으 이름을 {}
를 제외하고 기재하도록 합시다.
정책을 생성하는 부분이 이해가 잘 안된다면 아래 링크를 참고하시기 바랍니다.
AWS-IAM-Policy-JSON을-통한-정책-생성-ARN-정책의-종류
다음으로는 해당 정책을 부여할 사용자를 만들어야 합니다. 위에도 첨부했던 사용자 생성에 대한 가이드가 있기 때문에 필요한 부분만 짚고 넘어가겠습니다.
우선 권한 설정에서 기존 정책 직접 연결
에 직접 만든 정책을 연결시켜줍니다.
그리고 사용자 엑세스 키 ID와 비밀 엑세스 키를 저장해야합니다.
AWS S3 세팅
아래는 S3에 대한 포스팅입니다.
AWS-Simple-Storage-Service-S3-설정-및-이미지-업로드
위 과정을 따라 하여 버킷을 생성하고 버킷을 public access가 가능하도록 풀어줍시다.
이제 버킷 정책을 설정해줍시다. 생성한 버킷의 상세페이지로 들어가 권한
-> 버킷 정책
으로 들어갑시다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "StatementSid1",
"Effect": "Allow",
"Principal": {
"AWS": "{user_arn}"
},
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::{bucket_name}/*"
},
{
"Sid": "StatementSid2",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::{bucket_name}/*"
}
]
}
{user_arn}
에는 위에서 생성한 유저의 ARN을 {bucket_name}
에는 생성한 버켓의 이름을 적어줍시다.
다음으로는 CORS를 설정해줍시다.
버켓 정책
바로 옆에 CORS 구성
에 들어가면 마찬가지로 XML 문서로 설정할 수 있습니다.
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<ExposeHeader>ETag</ExposeHeader>
</CORSRule>
</CORSConfiguration>
설정에 대해서 알아봅시다.
< CORSConfiguration >
안에는 여러 개의 <CORSRule>
이 들어갈 수 있고 각각의 <CORSRule>
안에서 규칙을 정의합니다.
-
<AllowedOrigin>
허용할 Origin을 정의
-
<AllowedMethod>
허용가능한 method들을 정의
-
<AllowedHeader>
Access-Control-Request-Headers
헤더를 통해 preflight 요청에 허용되는 헤더를 지정Access-Control-Request-Headers
는 실제 요청이 만들어질 때 클라이언트가 보낼 수도 있는 HTTP headers를 서버에게 알리기 위해 브라우저가 preflight request을 할 때 사용됩니다. -
<ExposeHeader>
사용자가 접근가능한 Amazon S3 반환 응답헤더를 지정
-
<MaxAgeSeconds>
브라우저가 리소스, HTTP 메서드, 오리진으로 식별되는 preflight 요청에 대한 응답을 캐시할 수 있는 시간(초)을 지정
django에서 이미지 업로드
이제 AWS에서 세팅은 모두 끝났습니다.
django에서의 세팅을 해보도록 하겠습니다.
우선 python에서 AWS에 접근가능한 패키지 boto3를 설치해줍시다.
pip install boto3
다음으로 커스텀 스토리지 패키지 django-storages도 설치해주겠습니다.
pip install django-storages
django-storages는 설치 후, INSTALLED_APPS
에 추가해야 합니다.
INSTALLED_APPS = (
...
'storages',
)
그 후 settings
에서 몇 가지 설정이 필요합니다.
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_S3_SECURE_URLS = False # use http instead of https
AWS_QUERYSTRING_AUTH = False # don't add complex authentication-related query parameters for requests
AWS_S3_ACCESS_KEY_ID = '{엑세스 키 ID}'
AWS_S3_SECRET_ACCESS_KEY = '{비밀 엑세스 키}'
AWS_STORAGE_BUCKET_NAME = '{bucket_name}'
-
DEFAULT_FILE_STORAGE
기본이 되는 파일 스토리지를 지정
-
AWS_S3_SECURE_URLS
https 사용 여부
-
AWS_QUERYSTRING_AUTH
요청에 대한 복잡한 인증 관련 쿼리 매개 변수 허용 여부
{엑세스 키 ID}
와{비밀 엑세스 키}
, {bucket_name}
에는 각각에 맞는 정보를 기재해줍니다.
이제 파일을 업로드하면 S3의 버킷에 파일이 저장되는 것을 확인할 수 있습니다.