3월 20, 2022

aws - django를 통해 s3에 파일 업로드, 삭제 기능 구현하기

 S3는 Simple Storage Service의 약자입니다. 아마존에서 제공하는 파일 서버 서비스입니다.


"버킷(Bucket)" 이라는 디렉토리에 데이터 하나하나(객체)를 저장합니다. 


파이썬을 이용하여 S3 저장소를 이용하기 위해서는 boto3 를 사용해야합니다.

pip로 boto3를 설치해준 뒤, 업로드를 진행하고자 하는 클래스(뷰)에서 boto3.client부터 만들어줍니다. 


s3를 사용할 것이기에 s3를 명시해주고, 그 뒤의 kwargs로 access key와 secret access key를 줍니다. 이때 이 둘은 보안과 관련된 사항이기에, my_settings 또는 환경 변수 등으로 따로 관리해주는 것이 좋습니다.

이를 통해 서비스 클라이언트를 명시해준 이후, upload_fileobj를 통해 s3에 파일 업로드를 진행해줍니다. 


인자는 순서대로 파일 객체, 업로드하려는 버킷 명, 키값(str), 추가인자입니다. 

이때, key 값은 uuid를 사용하여 관리해줍니다. (file_uuid는 uuid값을 담은 변수입니다)

만약 파일이름을 key 값으로 사용한다면, 기존의 객체와 같은 이름을 가진 파일이 추가될때, 버킷에 새로운 파일이 추가되는 것이 아니라, 기존에 있던 동명의 파일이 업데이트 되기에 uuid로 관리를 해주는 것입니다.


uuid는 universally unique identifier를 뜻합니다. 네트워크 상에서 고유성이 보장되는 ID를 만들기 위한 표준 규약입니다. 저는 uuid4 버전을 활용했습니다. 1과 4버전을 많이 이용하는데, 1버전의 경우 보안상 허점이 있을 수 있다하여 4버전을 선택했습니다.


ExtraArgs를 통해 파일의 컨텐츠 타입도 설정해줍니다.


내친김에 삭제 기능도 구현해 줍니다.

삭제는 delete_object 메소드 를 사용하면 됩니다.


이렇게 버킷 이름과, 키를(DB에 저장해두었던 UUID)를 알려주면 삭제가 됩니다.


이상입니다. S3가 생소한 개념이어서 그렇지 구현은 그렇게 어렵지 않았습니다. 세팅을 하는데 시간이 더 많이 걸렸던것 같습니다. 그러나 단순히 업로드/ 다운로드/ 삭제가 가능하게 하는것이 다가 아니라, AWS 전반에 대한 이해가 부족하기에 이를 늘려야 할 듯합니다.