Skip to content

Latest commit

 

History

History
110 lines (96 loc) · 5.28 KB

20210624.md

File metadata and controls

110 lines (96 loc) · 5.28 KB

Django

인상 깊은 조언

  • 크롬에 비밀번호 저장하지 말자. 특히 개발 관련한 사이트에 대해서는 더욱더.
    • 요즘은 소프트웨어를 통해 접근하는 해킹보다는 물리적으로 잃어버린 기기에 저장된 비밀번호로 해킹되는 경우가 많다. 그래서 아마존 서버도 위치가 극비로 유지되고 있다.
  • 실제로 노트북을 잃어버리고 그게 큰 개발적인 손해로 이어질 확률은 아직 적지만, 그래도 이런 것을 늘 견지하고 주의하는 태도는 가져야 한다.

AWS 활용하기

aws란?

  • 클라우드 기반 서비스
  • 파일 저장, 서버 세팅, 데이터 관리 등 다양한 기능을 제공한다.
  • 우리는 이미지 저장을 위해 IAM과 S3라는 것을 이용해 볼 것이다.

IAM이란?

  • 리소스에 대한 접근권한을 제어하는 서비스
  • S3에 대한 접근권한을 관리하기 위해 필요하며, 우리는 S3FullAccess로 해보자

S3란?

  • Simple Storage Service의 약자로, 클라우드 스토리지를 제공하는 서비스이다.
  • DB보다는 이미지나 로그파일 등 정적인 파일을 관리하는 저장소

AWS 환경 설정

  1. aws 페이지 회원가입
  2. IAM이라는 서비스를 검색해서 들어간다.
  3. IAM 사용자 추가
  • 사용자 이름 작성
  • 엑세스 유형 선택: 프로그래밍 방식 액세스
  • 권한 설정: 기존 정책 직접 연결에서 AmazonS3FullAccess
  • 만든 후 Access Key 등이 담긴 CSV파일을 꼭 저장하자! 이 때 말고는 CSV파일 다운로드가 따로 제공되지 않는다.
  1. aws에서 S3를 검색하여 들어간다.
  2. S3 버킷 만들기
  • 버킷 이름 작성
  • AWS 리전 설정
  • 모든 퍼블릭 액세스 차단하는 게 좋지만, 지금은 S3 연습을 위해 체크 해제
  • write하는 권한은 차단해줘야 좋으니 익명 유저에 대한 Readonly 정책을 추가
    • JSON 형태로 직접 입력하되, Resource 부분에서 내 버킷 이름을 넣어주어야.

Django 에서 S3로 이미지 파일 관리하기

  • 이미지는 로컬이나 DB에 저장하기에는 용량이 크니까 S3에 저장하자.
  • S3에 저장, 객체 url 생성, url을 장고DB에 저장하는 순서

.env로 S3 access 정보 빼두기

  • Access를 위한 secret key를 config/.env에 빼두고 .gitignore 파일에 .env를 추가한다. (settings.py에 명시하면 깃헙에서 다 털리니까)
# .env
AWS_ACCESS_KEY_ID=""
AWS_SECRET_ACCESS_KEY=""
AWS_STORAGE_BUCKET_NAME="내 버킷 이름"
  • $ pip install django-environ로 패키지 설치
  • settings.py에서 .env 파일에 있는 것을 environ 을 통해 읽어온다.
# settings.py

import environ

env = environ.Env()
environ.Env.read_env()

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_FILE_OVERWRITE=False

boto3 설치

  • Django에서 Bucket 관리를 편하게 해주기 위해 S3와 소통하는 패키지
  • $ pip install boto3로 설치한다.

장고에서 create할 때 S3에 저장하기

  • models.py에서 url을 받을 TextField 모델(e.g. Post의 photo_url)을 생성해준다.
  • 템플릿에 <img src="{{ post.photo_url }}">로 url을 문자열로 넣어준다.
  • view에서 post를 통해 create 요청이 들어왔을 때, boto3에서 제공하는 메서드로 IAM에서 받은 Access Key 등을 인증 받아 session 데이터를 생성한다.
# views.py 

import boto3
from boto3.session import Session
from config.settings import AWS_ACCESS_KEY_ID, AWS_S3_REGION_NAME, AWS_SECRET_ACCESS_KEY, AWS_STORAGE_BUCKET_NAME

def index(request):
    if request.method == 'POST':
	temp_file = request.FILES.get('photo')) #input name으로 들어오는 데이터
	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%m%d%H%M%S') # 파일명 중복을 막기 위해
	img_object = s3.Bucket(AWS_STORAGE_BUCKET_NAME).put_object(
	    Key = now + file.name,
	    Body = file
	)
	s3_url = '{내 s3 객체가 담기는 주소}'
	post = Posting.objects.create(
	    title = request.POST['title'],
	    photo_url = s3_url + now + file.name
	)
	return redirect('index')
    posts = Posting.objects.all()
    return render(request, 'index.html', { 'posts': posts }
  • 위와 같이 session 생성 후 그 세션을 통해 s3에 접근하고 put_object 메서드를 통해 지정한 bucket에 파일을 key와 함께 담아둔다.
  • put_object 메서드에서 파일명 중복을 막기 위해 업로드하는 시간을 파일명 앞에 문자열형태로 넣어 key를 생성한다.
  • 내 bucket의 주소에 아까 만든 key를 뒤에 붙여 url을 만들고 이를 템플릿에서 html 태그 안 img src에 들어갈 photo_url로 하여 데이터를 생성한다.

느낀 점

  • 내 컴퓨터가 아닌 다른 곳에 이미지가 들어가도록 연결시키다니 감개무량하다.
  • 오랜만에 수업하니까 버겁지만 재미있었다.