Victoree's Blog

[AWGA] S3 with Signed URL 본문

Dev Circles/Ausg

[AWGA] S3 with Signed URL

victoree 2021. 4. 23. 17:48
728x90

이번 포스트에서는 S3와 Signed URL에 대해 소개하겠습니다.

S3

S3는 Simple Storage Service의 약자로 파일 서버의 역할을 하는 서비스입니다.

주요 특징

1) Scale Up

일반적으로 파일 서버는 트래픽이 증가함에 따라서 장비를 증설하는 작업을 해야하는데, S3는 스케일업 작업을 대행해줍니다.

그래서 트래픽에 따른 시스템적인 문제는 걱정할 필요가 없어집니다.

2) 접근 권한 설정

파일에 대한 접근 권한을 지정 할 수 있어서 서비스를 호스팅 용도로 사용하는 것을 방지 할 수 있습니다.

중요한 개인정보와 관련된 파일은 private으로 설정해두는 것처럼 접근 제어를 할 수 있겠죠?

3) 최소 1바이트에서 최대 5TB의 데이터를 저장하고 서비스 제공

4) Pay As You Go 👉 사용한만큼 금액 지불

5) Signed URL

해당 파일 객체에 접근할 때, url에 인증을 붙여서 무단으로 액세스하지 못하게 처리할 수도 있습니다.

이외에도 이런 특성들이 있습니다.

  • HTTP와 BitTorrent 프로토콜을 지원
    • Bit Torrent는 peer 2 peer 파일 전송 프로토콜이라고 합니다.
  • 데이터를 여러 시설에서 중복하여 저장해서 데이터의 손실이 발생하는 경우, 자동으로 복원
  • 버전관리 기능을 통해서 사용자에 의한 실수도 복원이 가능
  • 정보의 중요도에 따라서 보호 수준을 차등 할 수 있고, 이에 따라서 비용을 절감 가능

주요 개념

Signed URL이란?

어떠한 요청을 수행하는 데 필요한 “권한을 제한”하고 “시간을 제한”하는 URL

위 이미지는 GCP 서비스를 이용한 서명된 url의 예시입니다.

보통 이런 signed_url은 몇초간 어떤 http 함수를 실행할 수 있는지, expire 시간이랑 함수, 버킷과 파일 key, 등을 이용해서 생성됩니다.
해당하는 url을 가지고있으면 해당 객체에 특정시간동안 접근하거나 업로드를 수행할 수 있습니다.

어떠한 경우에 사용할 수 있냐면,

보통은 파일을 클라이언트에서 서버로 전송하면 이를 서버에서 업로드를 수행하고 응답을 보내줍니다.
+ 파일을 올리는 작업 자체는 비동기로 수행하게 하고, 우선 파일 경로만 응답으로 주는 경우도 있죠.

하지만 이런 식으로 작업하게되면, 부하가 서버쪽으로 치중되게 되어 업로드가 완료될때까지 쓰레드를 하나 먹고있게되기때문에, 지양해야하는 방식입니다.

이런 경우에, 서버에서는 이런 서명된 url을 클라이언트에 넘겨주면서 업로드를 클라이언트쪽으로 미루게됩니다. 어차피 사용자는 클라이언트에서 업로드를 하던지, 백에서 업로드를 수행하던지 기다려야하는 시간은 동일하기 때문에, 이런 방식으로 파일 업로드를 수행하는 경우가 많습니다.

이 외에도, 만약 private한 이미지에 접근했을 때는 특정 시간동안 get할수있는 url을 만들어서 리턴할수도 있습니다.

아래 링크는 제가 2020년 휴먼스케이프에서 인턴으로 근무할 때 작성했던 signed url 관련 글입니다. 관심있으신 분들은 읽어보면 좋을 것 같습니다.

GCS Signed URL을 이용하여 이미지 업로드하기

 

GCS Signed URL을 이용하여 이미지 업로드하기

안녕하세요. 휴먼스케이프에서 개발을 하고 있는 Victoria입니다.

medium.com

 

S3 기반 Signed URL 생성하기

간단히 Signed URL을 생성할 수 있는 코드를 보여드리겠습니다.

def sign_download(file_id):
	s3 = boto3.client("s3")
    signed_url = s3.generate_presigned_url(
    	'get_object',
        Params={'Bucket': settings.S3_BUCKET, 'Key': file_id}.
        ExpiresIn=3600,
        HttpMethod='GET'
    )
    return signed_url
    
    
def sign_upload(file_id):
	s3 = boto3.client("s3")
    signed_url = s3.generate_presigned_url(
    	'put_object',
        Params={'Bucket': settings.S3_BUCKET, 'Key': file_id}.
        ExpiresIn=3600,
        HttpMethod='PUT'
    )
    return signed_url

 

원하는 HttpMethod를 파라미터로 받으셔서 함수를 구현하는 것도 좋은 방법일 것 같습니다.

 

감사합니다.

728x90

'Dev Circles > Ausg' 카테고리의 다른 글

Elasticsearch를 아십니까?  (0) 2024.03.21
[AWGA] CloudFront (CDN)  (0) 2021.04.26
[Big Chat] EKS란 무엇인가  (0) 2021.04.23
Comments