일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 장고
- HTML
- 파이썬 알고리즘
- django ORM
- 백준
- CSS
- 알고리즘 연습
- AWS
- 파이썬
- java
- django rest framework
- MAC
- 알고리즘
- Baekjoon
- PYTHON
- Django
- form
- 알고리즘 문제
- Algorithm
- javascript
- API
- c++
- es6
- Git
- django widget
- 알고리즘 풀이
- js
- react
- DRF
- web
- Today
- Total
수학과의 좌충우돌 프로그래밍
[Django] AWS, S3를 이용한 이미지 업로드 본문
[Django] media 파일 업로드하기
Media 파일이란? media 파일이란 FileField 를 통해 저장한 모든 파일을 지칭합니다. 물론 ImageField 도 FileField 를 상속받은 필드로서 유사 필드들을 통해 저장된 파일도 media 파일입니다. 이는 특별하게
ssungkang.tistory.com
저번 포스팅에서는 media 파일을 업로드하는 방법을 알아봤습니다.
이번에는 media 파일을 S3를 이용해서 업로드하는 과정에 대해서 알아보도록 하겠습니다.
과정은 총 3단계로 아래와 같이 진행됩니다.
- AWS IAM 세팅
- AWS S3 세팅
- django에서 이미지 업로드
AWS IAM 세팅
[AWS] Identity and Access Management, IAM 사용자 생성
IAM 이란? IAM이란 Identity and Access Management의 약자로 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스입니다. 회사에서 클라우드 서비스 없이 물리적인 서버, 데이터베이스, 스토리��
ssungkang.tistory.com
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-정책의-종류
[AWS] IAM Policy - JSON을 통한 정책 생성, ARN, 정책의 종류
IAM에서 정책, policy를 만들다보면 아래와 같이 두 가지 방법으로 편집이 가능합니다. 시각적 편집기에서 GUI로 생성할 수 도 있고 JSON으로 추가할 수 도 있습니다. 이번 포스팅에서는 JSON으로 만드
ssungkang.tistory.com
다음으로는 해당 정책을 부여할 사용자를 만들어야 합니다. 위에도 첨부했던 사용자 생성에 대한 가이드가 있기 때문에 필요한 부분만 짚고 넘어가겠습니다.
우선 권한 설정에서 기존 정책 직접 연결
에 직접 만든 정책을 연결시켜줍니다.
그리고 사용자 엑세스 키 ID와 비밀 엑세스 키를 저장해야합니다.
AWS S3 세팅
아래는 S3에 대한 포스팅입니다.
AWS-Simple-Storage-Service-S3-설정-및-이미지-업로드
[AWS] Simple Storage Service, S3 설정 및 이미지 업로드
S3란? S3란 Simple Storage Service의 약자로 AWS에서 제공하는 클라우드 스토리지입니다. 클라우드 스토리지라는 단어가 어색하지만은 않을 겁니다. DropBox, Google drive, Ndrive, Onedrive 등 여러 클라우드..
ssungkang.tistory.com
위 과정을 따라 하여 버킷을 생성하고 버킷을 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의 버킷에 파일이 저장되는 것을 확인할 수 있습니다.
'웹프로그래밍 > Django' 카테고리의 다른 글
[Django] 한 모델이 여러 개의 모델과 관계를 맺어야하는 순간, contenttypes framework (2) | 2020.08.21 |
---|---|
[Django] Logging 설정 및 SQL 쿼리 확인 (0) | 2020.08.15 |
[Django] Model Field의 Null vs Blank (0) | 2020.08.06 |
[Django] Django 2.2 mysql 8 버전 연동하기 (0) | 2020.08.02 |
[Django] 웹서버, Nginx 사용하기 (0) | 2020.06.19 |