AWS Tech

S3 Bucket 에 파일 업로드 시, 파일 다운로드를 위한 Pre-signed Url 을 Email 로 전송하는 방법

Dongwoo Lee 2024. 6. 20. 16:02

특정 S3에 파일이 업로드 될때마다 해당 파일을 메뉴얼로 확인할 필요 없이 바로 이메일로 보내달라는 요구사항을 고객에게 받은 경험을 바탕으로 구현한 아키텍쳐를 주제로 블로그를 작성해보겠습니다.

 

전체적인 Work Flow 는 다음과 같습니다.

1. 사용자가 S3 에 특정 파일(= Object) 을 업로드 합니다.

2. S3에 파일이 업로드 됨에 따라 Put 이벤트가 발생합니다.

3. Put 이벤트 발생 시 Lamda 가 실행되도록 설정합니다.

4. Lamda 를 활용하여 Put 한 파일에 대한 Presigned Url 생성 및 Email 전송을 통하여 다운로드 받도록 구성합니다.

     좀더 상세화하면 

    - Lamda는 Put 이벤트 발생 시 생성된 파일 (=Object) 을 Get 합니다.

    - Lamda를 이용하여 Get 한 Object 를 다운로드 받기위한 Pre-Signed Url을 생성합니다.

    - Pre-Signed Url를 Email 을 사용하여 고객 이메일을 보냅니다.

 

 

해당 Flow를 구현하기 위한 과정을 Step 별로 나누어 설명 드리겠습니다.

Step 1. S3 버킷 구성

기본 설정으로 S3를 구성합니다. Bucket 이름만 명명하고 난 뒤 설정 변경 없이 바로 버킷만들기를 클릭합니다.

 

Step 2 Lamda 구성

i)  Lamda 생성 

python 을 사용하여 업로드 된 S3 파일을 Get 하고 SNS 를 사용하여 Email 보내는 소스코드를 작성하기 위해서 런타임을 python 으로 설정하였습니다. 코드는 본인에게 익숙한 언어를 설정하여 진행하여도 무방합니다. 

ii) Role 구성

Lamda를 생성하면 Default로 Role 생성이 됩니다. 해당 Role은 생성한 Lamda에 대한 Cloudwatch log 를 남기기 위한 권한이 포함되어있습니다. 생성한 Lamda는 위에서 구성한 s3-bucket-to-email-leedw416 버킷에 대한 Get 권한 필요하기 때문에 관련 Policy 를 생성한 후 Lamda Role  연결해 줘야합니다.

 

 

s3-email-bucket-leedw416 이름으로 s3-bucket-to-email-leedw416 버킷을 사용할 수 있는  policy를 생성하였습니다.

 

Lamda Role 에 위에서 생성한 Policy를 연결합니다. 

L

iii) S3 트리거 추가 

S3 에 파일 업로드 시 (= Put 이벤트 발생 시) Lamda 가 실행되야 하기 때문에 이를 위한 Trigger 를 추가 또는 생성 합니다.

 

 

Trigger 대상 AWS Reousre는 S3 이므로 트리거 구성을 S3로 선택하고, 앞서 구성한 버킷을 선택합니다. 해당 버킷에 파일 업로드 시 Lamda를 실행할 것 이기 때문에 이벤트 유형을 PUT 선택합니다.  해당 Trigger 생성으로 인한 재귀함수 호출에 위험은 없기 때문에 아래 재귀호출 란에 동의를 구하는 문장을 체크한 후 트리거를 추가합니다. 

STEP 3. AWS SNS 구성

다음으로는 Email을 보내기 위한 AWS Managed 메시지 전송 서비스인 AWS SNS를 구성해보겠습니다. 

AWS SNS 서비스에서 SNS의 엑세스 포인트(Lamda 에서 해당 주제의 Access 포인트로 SNS에 접근)인 주제 (= Topic) 생성을 클릭합니다. 

 

유형은 표준을 선택하고 나머지는 Default 설정 그대로 Topic (=주제) 을  생성하였습니다. 

 

해당  Topic (=주제) 의 구독 탭에서 구독 생성을 클릭합니다.


Presigned Url를 보낼 예정이기 때문에 프로토콜을 이메일로 선택하고 수신할 이메일 주소를 입력후 구독을 생성합니다.

 

설정한 이메일로 들어가 Confirm subscription을 선택하면 해당 Email과 AWS SNS이 연결 됩니다.

STEP 4. Lamda 코드 작성

위에 과정에서 Lamda 코드를 작성하기 위한 모든 준비를 마쳤습니다.

아래와 같이 S3에 업로드된 파일을 받아 Pre-signed Url을 구성하고 Pre-signed Url  에 대한 SNS Topic을 통하여 발행하는 코드를 작성 후 Deploy를 클릭합니다.

 

테스트를 위하여 s3-bucket-to-email-leedw416 버킷에 파일을 업로드해 봅니다. 업로드 한 후에 Email 전송이 오지 않아 해당 Lamda에 Cloudwatch 로그를 살펴보았습니다. 로그를 확인해보니 Lamda가 SNS 에 대한 Publish 권한이 없어 Email 전송이 되지 않았습니다.

 

Lamda Role ( s3-trigger-lamda-leedw416-role-3pbop7o5) 에 아래 Policy 를 추가하여 SNS를 사용할 수 도 있도록 합니다.

 

 

STEP 5. 테스트

다시 한번 S3에 zip 파일을 업로드 하여 Email 이 오는 지 테스트 해보겠습니다.

 

업로드하자 마자 Presigned Url이 도착하는 것을 볼 수 있습니다. 해당 Presigned Url을 클릭하면 파일이 다운로드 되는 것을 확인 할 수 있습니다.

이상으로 s3 파일 업로드 시 Email  로 Presigned Url 전송하는 방법을 알아보았습니다.

감사합니다.