본문 바로가기

django

Django AWS 연동

AWS란?

  • 여러 클라우드 기반의 서비스를 제공
  • 서비스 운영에 필수적인 파일 저장, 서버 세팅, 데이터 관리 등등

IAM

  • 리소스에 대한 접근 권한을 제어하는 서비스
  • S#FullAccess 권한을 주는 IAM 생성(상황에 맞춰 FullAccess 가 아닌 권한을 주는 IAM을 생성해 권한 조정도 가능하다.)

S3

  • Simple Storage Service
  • 클라우드 스토리지 제공 서비스(이미지, 로그, 정적파일 등을 손쉽게 저장 가능)

django에서 파일을 S3로 업로드가 가능하다.

  • 컴퓨터에서 이미지를 저장하는 방식은 컴퓨터 저장공간을 많이 쓸 수 밖에 없고, 여러 서버의 상테를 동일하게 유지하기 어렵다.

S3에 이미지 저장 -> 장고에서 해당 url 저장

  • 퍼블릭 엑세스를 전체 차단하고, cloudfront 등을 사용하는 것이 좋지만, 현재는 S3에서 read only 를 허용하는 방식으로 구현(권한에 대한 것은 굉장히 다양한 방법과 상황이 존재한다.)

S3를 사용하기 전 준비사항

  • pip install django-environ
  • pip install boto3
  • .env 에 secretkey 등을 저장하고 .gitignore 에 추가

.env 에 secretkey 저장

AWS_ACCESS_KEY_ID="입력 필요"
AWS_SECRET_ACCESS_KEY="입력 필요"
AWS_STORAGE_BUCKET_NAME="입력 필요"

setting.py

  • environ 패키지를 이용해 간편하게 env 읽어오기
import environ

env = environ.Env()
environ.Env.read_env()
  • 실제 파일 업로드 작업 시 사용하게 될 변수 작성
# AWS

AWS_ACCESS_KEY_ID=env('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY=env('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME=env('AWS_STORAGE_BUCKET_NAME')
AWS_S3_REGION_NAME='ap-northeast-2'
AWS_S3_OVERWRITE=False

views.py

  • 파일 업로드 시 사용하게 될 boto3 임포트
from .models import Post
import boto3
from boto3.session import Session
from datetime import datetime
def index(request) :
    if request.method == 'POST' :
        file = request.FILES.get('img')
        session = Session(
            aws_access_key_id=AWS_ACCESS_KEY_ID,
            aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
            region_name=AWS_S3_REGION_NAME,
        )
        s3 = session.resource('s3')
        now = datetime.now().strftime('%Y%H%M%S')
        img_object = s3.Bucket(AWS_STORAGE_BUCKET_NAME).put_object(
            Key=now+file.name,
            Body=file
        )

        s3_url = 'https://django-s3-cj.s3.ap-northeast-2.amazonaws.com/'
        Post.objects.create(
            title=request.POST['title'],
            url = s3_url+now+file.name
        )
        return redirect('index')
    posts = Post.objects.all()
    return render(request, 'index.html',{'posts':posts})

boto3 의 Session 함수를 이용해 각각의 Key를 담고 S3와 이어주는 로직을 작성한다.

그리고 s3_url 을 넣어주고 model 에 추가해준다.

template

{% for post in posts %}
        <img src="{{post.url }}" alt="{{post.title}}" width="400px;">
    {% endfor %}
    <form action="{% url 'index' %}" method="POST" enctype="multipart/form-data">
        {% csrf_token %}
        <input type="file" name="img">
        <input type="text" name="title" placeholder="file name">
        <button type="submit">post</button>
    </form>

img 태그에 url을 넣어주면 이미지임을 인식한다.

 

 

이미지 업로드시 AWS 사이트의 S3에도 이미지가 저장이 되는 것을 볼 수 있다.

'django' 카테고리의 다른 글

Django CBV 기반 CRUD 만들기  (0) 2022.01.09
Django 프로젝트 구조  (0) 2021.12.07
Django Deploy  (0) 2021.12.07
Django - docker  (0) 2021.12.07
Django 기초  (0) 2021.12.07