WiseN

[Re2021] Amazon S3 Event를 EventBridge로 연계할 수 있게 되었습니다

Jan 05, 2022   |   AWS

작성자_한승수

페이스북 공유하기 트위터 공유하기
Blog thumbnail

안녕하세요. GS네오텍 SA 한승수입니다. 최근 발표로 S3에서 EventBridge가 지원되어 서버리스 애플리케이션을 더욱 빠르게 구축할 수 있게 되었는데요. 기존에도 S3 Event가 있었는데? 뭐가 바뀌었다는거지? 라고 생각하시는 분들도 많을 것 같습니다. 기존에 사용하시던 방식과 이번에 추가된 방식을 비교해보고 EventBridge와 S3를 연결하여 필터링을 하여 이미지 썸네일을 생성하는 간략한 데모를 보여드리도록 하겠습니다.


우선, Amazon EventBridge가 뭘까요? EventBridge는 여러 소스의 데이터와 애플리케이션을 연결할때 사용하는 서버리스 이벤트버스 서비스 입니다. 기존의 CloudWatch Events에서 EventBridge로 통합이 되었습니다. 예전에 제가 만들어놨던 출퇴근 시간에 맞춰 개발 인스턴스를 자동으로 키고 끄는 CloudWatch Event가 EventBridge 안으로 쏙 들어와있네요. EventBridge를 사용하면 시간, AWS Service의 이벤트들 각종 SaaS App에서 발생한 이벤트를 모두 한곳에 모아 규칙에 따라 특정 작업을 실행할 수 있는 관리형 서비스입니다.

 


 

EventBridge + S3 = ?!

S3 이벤트를 EventBridge로 보내 S3에 저장한 데이터의 변경사항을 기반으로 추가적인 작업을 할 수 있음을 의미합니다. S3 버킷에 새로운 이미지가 들어올때 이를 감지하여 썸네일 이미지를 만들어 별도로 저장한다던가 문서파일이 업로드 되었을때 이메일로 알림을 받거나 수백만 개의 오디오, 미디어 파일이 업로드 되었을때 스트리밍을 위해 미디어 형식을 변경하는 추가적인 작업을 할 수 있습니다.


처음에 얘기했던 것처럼, 이 좋은 기능들은 기존에도 있었습니다. S3 버킷에서 이벤트 알림을 생성하여 아래 그림과 같이 SNS, SQS, Lambda로 이벤트를 전파할 수 있었죠. 하지만 이 방법만으로는 확장성에 한계가 있었습니다. S3 버킷 이벤트에 따라 Kinesis Firehose로 데이터를 전송한다던가 Step Function을 사용하여 워크플로를 처리하는 방법, SageMaker 파이프라인으로 보내 오디오 파일에서 감정을 분석하는 등 추가적인 작업을 하기엔 부족했습니다.


EventBridge를 통해 S3 이벤트 알림을 사용하면 기존에는 하지 못했던 고급 필터링 및 라우팅 기능을 활용하여 Lambda, SQS 등을 포함한 18개 대상에 이벤트를 보낼 수 있습니다. 예를 들어 Lambda와 같은 대상에 보내기 전에 객체의 크기, 시간 범위 또는 메타데이터 필드별로 이벤트를 필터링 할 수 있습니다. 오늘 데모에서는 객체 크기에 따른 필터링을 적용하여 워크플로를 구성해 보겠습니다.

 

 

S3에서 EventBridge로 이벤트를 보냈던 기존 방법이 하나 더 있었습니다. S3의 객체수준 API 작업을 로깅하도록 CloudTrail 데이터 이벤트를 구성한 후 그 이벤트를 다시 EventBridge로 보내는 방법이었습니다. 아래 그림처럼 이벤트를 보내기 위해 Cloudtrail을 거쳐 보내야했죠.

 


 

하지만 이번 업데이트로 바로 EventBridge로 붙게된거죠. 기존에 Cloudtrail을 통해 EventBridge를 사용하고 계셨던 분들이라면 바로 적용이 가능하겠죠.


S3에서 바로 Lambda로 이벤트를 보냈던 버전 1 / S3에서 CloudTrail을 통해 꾸역꾸역 EventBridge로 보내는 버전 2 / S3에서 바로 EventBridge로 보내는 이번 업데이트를 통해 AWS EventBridge를 키운다는 의지를 볼 수 있었던 것 같습니다. CloudWatch Events도 통합하고 AWS 핵심 서비스인 S3도 소스로 추가해 IFTTT 처럼 모든 이벤트를 통합하여 중앙에서 처리하는 강력한 통합서비스를 만들고자 하는 AWS의 세계관이 보입니다.



 

데모에 앞서 S3 EventBridge를 활성화하는 방법을 보여드리겠습니다. 데이터가 담길 S3버킷을 선택하시고 속성탭에 들어가 아래로 쭉 내리다보면 기존에 이벤트알림이라고 있던 부분 아래에 Amazon EventBridge가 추가되었습니다.

 


 

여기서 편집에 들어가 단순히 기능을 활성화를 누르면 끝 입니다. 활성화를 하면 S3의 모든이벤트가 EventBridge의 기본 이벤트 버스로 들어가게 됩니다.



 

이번에는 S3에 이미지 파일이 올라왔을때 썸네일을 만들어 저장하는 EventBridge의 예시를 보여드리겠습니다. 기존에는 S3에 이벤트로 한 Lambda 혹은 한개의 SQS, SNS로만 데이터를 전송할 수 있었는데, EventBridge를 활용하여 S3에 올라온 이미지 용량 혹은 시간에 따라 Lambda함수와 SQS로 분기하여 데이터를 전송할 수 있습니다. EventBridge에서 이미지용량을 필터링 걸어 일정 크기보다 작으면 바로 Lambda함수에서 이미지 프로세싱 작업을 걸치고, 용량이 크다면 SQS로 데이터를 넘겨 Lambda 혹은 프로세싱서버에 부하를 줄이고 별도의 작업을 진행하는 프로세스입니다.



 

100KB 미만이면 Lambda로 바로 넘기고 100KB보다 클 경우에는 SQS로 전송하는 시나리오입니다. 데모를 진행하는 순서를 설명드리겠습니다.

1. S3 Bucket을 만들고 EventBridge 기능을 활성화한다.

2. 이미지 썸네일 제작 람다함수를 구성한다. (참고. https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/with-s3-tutorial.html)

3. SQS 대기열을 생성한다.

4. EventBridge에서 2개의 이벤트를 생성해야 한다.


다음과 같이 사용자 지정 패턴을 선택 후 JSON 형태의 이벤트 패턴을 작성합니다. AWS에서 제공하는 이벤트 패턴 작성 가이드 문서를 참조했습니다.(https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html)

 


 

작은 이미지 처리용 규칙 : ssh-bucket-test1이라는 버킷에서 넘어온 데이터와 10KB 이하 인 데이터를 필터링하는 규칙입니다.

 


 


 

큰 이미지 처리용 규칙 : 10KB 보다 큰 데이터를 필터링하는 규칙입니다.

 


 


 

이벤트 생성 후 S3에 71KB의 이미지와 2.5MB 이미지를 업로드해봤습니다.

 


 

71KB의 이미지는 EventBridge의 필터링에 걸려 람다함수를 호출하였고 다음과 같은 응답을 받을 수 있었습니다.



 

2.5MB의 이미지는 SQS에 들어가 폴링한 결과 다음과 같았습니다.



 


 

이벤트를 수신하게 되면 2번에서 만든 Lambda함수를 활용하여 S3에 업로드한 이미지 파일의 경로를 찾아 리사이징 하는 작업을 거치면 썸네일 이미지를 생성할 수 있습니다.


[요약]

S3에 객체를 업로드, 변경 및 여러 이벤트에 대한 필터링 옵션과 Subscription에 관한 환경 구성과 제어를 EventBridge가 대신 관리 / EventBridge를 사용하면 중앙에서 이벤트를 관리할 수 있고 Lambda 함수, SQS, SNS 등의 재사용성을 높이며 확장성있고 통합성 있는 애플리케이션을 구성할 수 있다.


[링크]

https://aws.amazon.com/blogs/aws/new-use-amazon-s3-event-notifications-with-amazon-eventbridge/