크롬에 비밀번호 저장하지 말자. 특히 개발 관련한 사이트에 대해서는 더욱더.
요즘은 소프트웨어를 통해 접근하는 해킹보다는 물리적으로 잃어버린 기기에 저장된 비밀번호로 해킹되는 경우가 많다. 그래서 아마존 서버도 위치가 극비로 유지되고 있다.
실제로 노트북을 잃어버리고 그게 큰 개발적인 손해로 이어질 확률은 아직 적지만, 그래도 이런 것을 늘 견지하고 주의하는 태도는 가져야 한다.
클라우드 기반 서비스
파일 저장, 서버 세팅, 데이터 관리 등 다양한 기능을 제공한다.
우리는 이미지 저장을 위해 IAM과 S3라는 것을 이용해 볼 것이다.
리소스에 대한 접근권한을 제어하는 서비스
S3에 대한 접근권한을 관리하기 위해 필요하며, 우리는 S3FullAccess로 해보자
Simple Storage Service의 약자로, 클라우드 스토리지를 제공하는 서비스이다.
DB보다는 이미지나 로그파일 등 정적인 파일을 관리하는 저장소
aws 페이지 회원가입
IAM이라는 서비스를 검색해서 들어간다.
IAM 사용자 추가
사용자 이름 작성
엑세스 유형 선택: 프로그래밍 방식 액세스
권한 설정: 기존 정책 직접 연결에서 AmazonS3FullAccess
만든 후 Access Key 등이 담긴 CSV파일을 꼭 저장하자! 이 때 말고는 CSV파일 다운로드가 따로 제공되지 않는다.
aws에서 S3를 검색하여 들어간다.
S3 버킷 만들기
버킷 이름 작성
AWS 리전 설정
모든 퍼블릭 액세스 차단하는 게 좋지만, 지금은 S3 연습을 위해 체크 해제
write하는 권한은 차단해줘야 좋으니 익명 유저에 대한 Readonly 정책 을 추가
JSON 형태로 직접 입력하되, Resource 부분에서 내 버킷 이름을 넣어주어야.
Django 에서 S3로 이미지 파일 관리하기
이미지는 로컬이나 DB에 저장하기에는 용량이 크니까 S3에 저장하자.
S3에 저장, 객체 url 생성, url을 장고DB에 저장하는 순서
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
Django에서 Bucket 관리를 편하게 해주기 위해 S3와 소통하는 패키지
$ pip install boto3
로 설치한다.
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로 하여 데이터를 생성한다.
내 컴퓨터가 아닌 다른 곳에 이미지가 들어가도록 연결시키다니 감개무량하다.
오랜만에 수업하니까 버겁지만 재미있었다.