웹프로그래밍/Django

[Django] AWS, S3를 이용한 이미지 업로드

ssung.k 2020. 8. 12. 03:38

Django media 파일 업로드 하기

 

[Django] media 파일 업로드하기

Media 파일이란? media 파일이란 FileField 를 통해 저장한 모든 파일을 지칭합니다. 물론 ImageField 도 FileField 를 상속받은 필드로서 유사 필드들을 통해 저장된 파일도 media 파일입니다. 이는 특별하게

ssungkang.tistory.com

저번 포스팅에서는 media 파일을 업로드하는 방법을 알아봤습니다.

이번에는 media 파일을 S3를 이용해서 업로드하는 과정에 대해서 알아보도록 하겠습니다.

과정은 총 3단계로 아래와 같이 진행됩니다.

  • AWS IAM 세팅
  • AWS S3 세팅
  • django에서 이미지 업로드

 

AWS IAM 세팅

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의 버킷에 파일이 저장되는 것을 확인할 수 있습니다.