S3에서 pre-signed url(미리 서명된 url) 만들기

S3에서 pre-signed url(미리 서명된 url)을 생성하는 방법에 대해서 정리해 보았습니다.
2021.08.25

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 S3에서 pre-signed url(미리 서명된 url)을 만들어 봤습니다.

pre-signed url이란?

모든 객체는 기본적으로 비공개이며, 객체 소유자만 이러한 객체에 액세스할 수 있습니다. 그러나 객체 소유자는 필요할 경우 자신의 보안 자격 증명을 사용하여 일정 기간 동안 객체 다운로드를 허가하는 미리 서명된 URL을 만들어 다른 사용자와 객체를 공유할 수 있습니다.

객체에 대해 미리 서명된 URL(pre-signed url)을 만들 때 보안 자격 증명을 제공하고 버킷 이름, 객체 키, HTTP 메서드(GET으로 객체 다운로드) 및 만료 날짜와 시간을 지정해야 합니다. 사전 서명된 URL은 지정된 기간 동안만 유효합니다.

미리 서명된 URL을 받은 사용자는 누구나 객체에 액세스할 수 있습니다.

IAM Role 생성

이제 pre-signed url(미리 서명된 url)을 만들어 보도록 하겠습니다. 먼저 EC2에서 S3에 액세스 해야 하기 때문에 s3에 액세스 할 수 있는 권한이 필요합니다.

IAM에서 역할 만들기 버튼을 클릭합니다.

EC2를 선택하고 다음을 클릭합니다.

S3FullAccess를 선택하고 다음을 클릭합니다. 태그 값은 임의로 설정하거나 설정하지 않고 넘겨도 됩니다.

적당히 역할 이름을 입력하고「역할 만들기」버튼을 클릭해서 역할을 생성합니다.

EC2 생성 및 역할 연결

AWS CLI 환경에서 작업할 생각이기 때문에 EC2를 하나 생성합니다.

디폴트 값으로 설정 되어 있는 상테에서 선택 버튼을 클릭합니다.

인스턴스 유형 또한 디폴트 값인 상태에서 다음 버튼을 클릭합니다.

IAM 역할에서 조금 전 만들어 두었던 역할을 선택합니다.

그 외에는 디폴트 값으로 넘긴 다음, 마지막에「키 페어 없이 계속」을 선택하고 인스턴스를 시작합니다.

생성된 인스턴스를 확인합니다.

IAM 역할이 연결되어있는지 확인합니다. 먼저 인스턴스 설정에서「IAM 역할 연결/바꾸기」를 클릭합니다.

연결이되어있지 않은 경우 만들어 두었던 IAM 역할을 선택해 연결합니다.

CLI로 S3 생성

ssh키를 생성하지 않았기 때문에, 브라우저 기반 ssh연결을 통해서 EC2에 접속합니다.

인스턴스 연결에 성공하면 다음과 같은 화면이 나옵니다.

  • aws s3 ls

명령어로 현재 생성되어있는 s3 리스트를 확인합니다. 리스트가 출력되지 않는다면 IAM 역할이 제대로 연결되어있는지 확인합니다.

aws s3 mb s3://jaewook-presigned-test

다음 명령어로 S3 버킷을 생성합니다. 그리고 s3 리스트를 출력해보면 성공적으로 버킷이 생성된 것을 확인할 수 있습니다. 여기에서「IllegalLocationConstraintException)」에러가 발생한 경우 동일한 이름의 버킷이 존재한다는 의미이기 때문에 버킷 이름을 변경해서 생성합니다.

echo "jaewook test presigned url" > test.txt

echo 명령어로 텍스트 파일을 하나 생성합니다.

aws s3 cp test.txt s3://jaewook-presigned-test

생성한 test.txt 파일을 S3 버킷에 업로드 합니다.

업로드한 파일의 URL을 바탕으로 접속해보면 접속이 거부된 것을 볼 수 있습니다.

CLI로 pre-signed url(미리 서명된 url) 생성

이제 pre-signed url(미리 서명된 url)을 만들어 보도록 하겠습니다.

aws s3 presign test.txt s3://jaewook-presigned-test/test.txt --expires-in 60

약 1분 동안 해당 파일에 접근할 수 있는 pre-signed url(미리 서명된 url)을 생성합니다.

명령어를 입력하면 다음 그림과 같이 url이 출력됩니다. 해당 url로 들어가 보겠습니다.

url로 접속하면 성공적으로 test.txt 파일에 액세스한 것을 볼 수 있습니다.

Python으로 pre-signed url(미리 서명된 url) 생성

이번에는 Python으로 pre-signed url(미리 서명된 url)을 생성해 보겠습니다.

yum install python-pip
pip install boto

pip를 설치한 다음, boto를 설치 합니다.

import boto
conn = boto.connect_s3()
url = conn.generate_url(360,'GET',bucket='jaewook-presigned-test',key='test.txt')
print url

vi test.py 명령어를 통해서 test.py 파이썬 파일을 작성합니다.

AWS 공식 문서에서 파이썬 이외 언어로도 작성하는 방법이 기재되어 있으니 참고 바랍니다.

python test.py 명령어로 파이썬을 실행하면 다음과 같은 url이 출력됩니다.

해당 url로 접속하면 성공적으로 test.txt 파일에 액세스한 것을 볼 수 있습니다.

지정한 시간이 지난 다음 접속해 보면 액세스 거부가 됩니다.

참고