고인물을 지양하는 블로그

[Severless] 학부 공지사항 크롤러 (AWS Lambda + 크롤러 + Google Sheet => Email) 본문

카테고리 없음

[Severless] 학부 공지사항 크롤러 (AWS Lambda + 크롤러 + Google Sheet => Email)

yunjaeGong 2021. 9. 15. 02:00

왜 갑자기 크롤러인가?

학과에 최근 1년 들어 졸업요건이 추가되거나, 교과목이 추가되거나, 갑자기 캡스톤이 바뀌거나 하는 등 갑작스레 변화의 바람이 불어 휴학 중이라도 학교와 단절되면 안 될 것 같아 까먹어서 못 봐도, 바빠서 소홀해도, 야간근무 끝나고 자느라 못 봤지만 핸드폰 알림으로 와 있다면 편할 것 같아 만들게 됐다. (aws 써볼 구실 + 난이도도 낮음)

 

서버리스는 처음이지?

AWS나 Azure 같은 클라우드를 언제 한 번 써봐야 겠다는 막연한 생각은 있었지만, 'EC2 같은 거 쓰면 된다더라; 수준의 지식 이외에는 클라우드를 사용해 본 경험도, 사실 사용할 만한 프로젝트도 없었다. 

 

따라서 aws cli 없이, google api 이용을 위해 service account 발급 등 최소한의 인증과 개발 환경으로 작성했다.

 

Lambda를 선택한 이유?

인스턴스를 끄고 켜고 할 필요 없이 이벤트 만으로 주기적 함수 호출이 되고,

주기적으로 [크롤링 -> 새 글/변경된 글 확인 -> sheet에 변동 내용 업로드 -> 이메일 전송] 만 반복하면 되고, 길어봐야 10초 이내면 끝이 나는 간단한 작업에 적당했고, 무엇보다 로컬 가상 환경에서 작성하던 코드 + 패키지 + credential 파일을 통채로 압축해서 업로드만 하면 끝이라는 점이 가장 매력적이었다. (+ 프리티어 범위 이내)

 

 

1. 크롤링

 학부 공지사항은 로그인 없이 열람이 가능했기 때문에 Selenium + ChromeDriver는 사용하지 않고, urllib + BeautifulSoup4를 사용해서 진행했고, 글 제목, 글 번호, url을 대상으로 했다.

 

* 공지 내용은 어떤 개인정보/ 민감정보가 담겨있을지 몰라 의도적으로 크롤링 대상에서 제외했다.  e.g. 장학생 선정 학생 이름 일부 (홍*동), 학번 일부 등..

 

2. 새 글 찾기

 크롤링 해크롤링해 온 글이 새 글인지, 제목에 변동이 있는지 판별하기 위해서는 이전에 크롤링해 온 글 목록과 비교가 필요한데 프로젝트를 구상할 당시에는 Lambda에서 local storage를 사용할 수 있는지 모르기도 했고, 참고한 예시가 dynamoDB를 사용했기 때문에 DynamoDB나 S3 등 AWS 프리티어를 제공하는 DB를 사용해볼 생각이었지만, 저장할 데이터가 글 번호, 제목 정도가 전부이고, 데이터 수정 변경이 매우 용이해 테스트 해보기에도 알맞은 점 때문에  Google Sheet에 데이터를 저장하고 불러와 새 글 목록 찾기에 사용했다.

 

3. 변경 탐지 & 메일링

 남은 일은 새로 불러온 글 목록과 이전에 업데이트 된 데이터와 대조해 새 글, 변경된 제목을 탐지하고, 변경 내용이 있으면 sheet에 업로드, 불러온 구독 정보를 이용 smtp 프로토콜을 이용해 메일을 전송했다.

 

DB 대신 sheet

 

Lambda에 완성된 코드 업로드

완성된 코드 + 패키지 + credential 파일 압축해 AWS에 업로드한 후

 

마지막으로  EventBridge를 추가하고, 

다음과 같이 크론식을 추가했다.

cron(29/30 0-7 ? * Mon-Fri 2021-2022)

* UTC/GMT기준이므로 서울 기준으로는 GMT+9 기준으로는 (오전 9시 29분, 9시 59분, 10시 29분... 16시 59분) 이다.

 

 

 

이렇게 사이드 프로젝트가 완성됐다.

Title 값을 삭제해 -> [에... 윗줄이 빈칸으로 나온다. 변경된 경우라면 {이전 제목 \n ->변경된 제목\n 하이퍼링크} 가 전송된다.


 

 

이벤트 등록한 이후로 9/14일 현재까지 새 글이 없어 메일 발송은 아직 되지 않았지만, 돌고 있는지는 콘솔 로그로 확인할 수 있다.

새 글도 없고(no updated value) 에러도 없으니 잘 돌고 있음을 알 수 있다.

 

 

 

 

Comments