일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- BOJ 1926
- BOJ 2146
- BOJ 2407
- javascript
- BOJ 1697
- BOJ 2213
- BOJ 1074
- BOJ 4485
- BOJ 1912
- priority_queue
- BOJ 5791
- 분할과 정복
- BOJ 4948
- Coercion
- BOJ 6593
- BOJ 5568
- spring security
- springboot
- BOJ 2234
- 다익스트라
- serverless
- BOJ 11726
- DP
- MySQL
- BOJ 2012
- 조합 알고리즘
- 플로이드 와샬
- AWS
- Lambda
- BOJ 2167
- Today
- Total
고인물을 지양하는 블로그
[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 프로토콜을 이용해 메일을 전송했다.

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분) 이다.
이렇게 사이드 프로젝트가 완성됐다.

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

새 글도 없고(no updated value) 에러도 없으니 잘 돌고 있음을 알 수 있다.
- https://seohyun0120.tistory.com/entry/severless-학교-공지사항-크롤러-Puppeteer-AWS-Lambda-DynamoDB-slack
- https://ivhani.medium.com/integrate-google-sheets-with-aws-lamda-python-to-send-a-recurring-email-379c8d3c503
- 서버 간 애플리케이션에 OAuth 2.0 사용 | Google ID 플랫폼 | Google Developers
- https://docs.aws.amazon.com/lambda/latest/dg/python-package.html