흰 스타렉스에서 내가 내리지

Serverless 서비스 기반 지진 알람 본문

AWS

Serverless 서비스 기반 지진 알람

주씨. 2023. 9. 20. 18:42
728x90

> 기본 지식

- AWS Lambda

- Amazon DynamoDB

- Amazon EventBridge

- Amazon SNS

- Node.js

- Serverless Framework

 

> 주요 토픽 

- AWS Lambda

    - AWS Lambda Layer

- Amazon EventBridge Cron 규칙 

- Puppeteer (Node.js 기반의 크롬브라우저를 컨트롤하는 프레임워크)

- Serverless Framework

 

디시인사이드 지진희 갤러리에 지진이 일어나면 집중적으로 글이 올라온다.

 

> 로직

- 다수의 유저가 지진을 느낄 경우 디시인사이드의 지진희갤러리에 글을 게시

- 일정 주기로 갤러리를 크롤링하여 게시글의 변동을 확인

    - 디시인사이드에는 갤러리 글 별로 인덱스가 부여됨

    - 주기적으로 최신 글의 인덱스를 저장 후, 크롤링 시점에 최신 인덱스와 비교

        - 크롤링한 최신 인ㄴ덱스 - 기존 저장된 최신 인덱스 = 글 숫자

- 글 숫자가 N개 이상이라면, Amazon SNS를 통해 SMS로 알림 

 

EventBridge에 일정 시간마다 이벤트를 발생시켜주는 Cron Rule을 사용해 람다를 주기적으로 호출한다. 

람다는 갤러리를 크롤링 한다. 기존 인덱스를 DynamoDB에서 조회를 한 후 기존 인덱스와 비교하여 게시글 숫자를 계산한다. 

게시글 숫자가 N개 이상이라면 Amazon SNS 서비스를 이용해서 문자메시지를 보낸다. 

마지막으로 현재 게시글 인덱스를 다시 저장한다. 

 

 

> Amazon SNS 고려할 점

- 문자 메시지 발송은 특정 리전(US-East-1 등)만 가능 (서울 리전 불가능)

- Amazon SNS 의 경우 자신을 제외한 다른 사람에게 문자 메시지를 보낼 경우 Sandbox 해제 필요 (이는 aws에 문의를 해야 함)

    - 따라서 자신의 휴대폰 번호를 샌드박스 번호로 등록 필요

 

 

> AWS Lambda 고려할 점 

- AWS Lambda의 크롤링은 Puppeteer를 활용 

    - 이 예제에서는 로그인 등의 정보 입력이 없지만, 실전이라면 정보 입력 등의 상황 발생 가능 

    - 추후 웹 UI 테스트 등에 활용 가능 

- Puppeteer에서 Chromium을 활용하여 브라우저를 모방 

    - Chromium 자체의 용량이 매우 큼 (약 200메가)

    - 따라서 chrome-aws-lambda-layer로 미리 배포되어 있는 AWS Lambda Layer 활용

- Amazon EventBridge의 Cron 규칙을 활용해서 일정 단위로 Lambda 함수 호출

    - Cron 식을 활용하여 오전 9시에서 오후 12시 까지만 호출 

 

 

++ Lambda Layer란?

: 람다가 실행되기 위한 기반이 되는 리소스들을 미리 만들어 놓은 것이다. 그 위에 람다를 올리게 되는 것이다. 

dependencies나 머신러닝 모델, 이런 큰 프로그램 등이 될 수 있다. 

이런 것들을 미리 준비해 놓음으로써 람다가 좀 더 효율적으로 운영이 될 수 있도록 만드는 것이다. 

https://github.com/shelfio/chrome-aws-lambda-layer

 

 

> Puppeteer

- DevTool 프로토콜을 사용해 크롬 브라우저를 제어하는 Node 라이브러리

    - 코드 형식으로 크롬 브라우저의 활동을 조종 가능 

- Selector 형식으로 아이템을 선택하고 입력/클릭/출력 등 다양한 Action으로 진행 

 

 

 

> Amazon EventBridge

Amazon EventBridge는 AWS의 다양한 이벤트 기반으로 다양한 액션들을 처리하는 서비스다. 

Amazon EventBridge의 여러가지 기능 중 하나는 Cron 규칙이다. 

 

> Cron 표현식

- Cron 스케쥴러의 표현식 

    - 일정 주기, 원하는 시간을 특정하기 위한 표현식

 

 

> Serverless Framework Local Invoke

- 로컬에서 Lambda 함수를 실행할 수 있는 명령어 

- serverless invoke local --function functionName

- 단 AWS 자격증명을 위한 설정 필요

    - 예 : aws-profile 등 사용 불가능 

 

 

# 실습

여기서 serverless-test는 IAM 사용자 이름이다. 

DynamoDB 권한이 있어야 한다. 

 

실행을 해보면, Amazon EventBridge에 규칙이 잘 생성된 걸 볼 수 있다. 

들어가보면 크론식과, 트리거 된 시간이 뜬다. 지금은 5분에 한번씩 트리거 되고 있음을 볼 수 있다. 

 

 

실제로 문자를 받아봐야 하니까 SNS 설정을 해보자. 

SNS에 들어가보면 푸시알림만 있고 문자는 없다. 

위에서 설명했듯이 문자를 지원하는 리전은 따로 있다. 

리전을 버지니아 북부로 하니 문자메시지(SMS)가 있다. 

 

샌드박스 대상 전화번호에 전화번호 추가를 해준다. 

내 전화번호를 추가해주고, 확인코드를 입력해준다. 

이제 이 전화번호로만 문자메시지를 받을 수 있다. 

 

실제로 5분에 한 번씩 이벤트가 트리거되고 있는지 확인해보자. 

CloudWatch에 로그 그룹으로 들어간다. 리전은 서울로 다시 바꾸자. 

이렇게 5분에 한번씩 불리고 있는것을 확인할 수 있다. 

 

 

다시 배포를 해보고, CloudWatch 에 이벤트 트리거를 기다려보자. 아 그리고 갤러리에 글도 써야겠죠?

크롤링도 잘 됐고, 로그도 잘 찍혔다. 

문자도 아주 잘 왔다. 

'AWS' 카테고리의 다른 글

AWS Lambda 기초  (0) 2023.09.21
Amazon EventBridge - 이벤트 매칭 규칙  (0) 2023.09.20
Serverless Framework  (0) 2023.09.20
이벤트 기반 아키텍처, Lambda - S3 연결 예제  (0) 2023.09.20
디커플링, SQS, SNS  (0) 2023.09.20