데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      AWS Lambda와 EventBridge로 누구보다 빠르게 멘사 테스트 신청하기

      zero 24.08.29
      2,748 10 4
      DEVOTEE 요약
      멘사 시험 신청을 놓치지 않기 위해 AWS 서비스를 사용한 알람 스케줄러를 만들었습니다. Amazon SES를 통해 이메일을 설정하고, AWS Lambda로 멘사 테스트 페이지를 크롤링하여 새 게시물이 있으면 알림 메일을 보냅니다. Amazon EventBridge를 이용해 Lambda 함수를 주기적으로 실행하도록 설정하여 자동으로 알림을 받도록 했습니다.

      Intro

      예전부터 문제적남자 같은 프로그램을 보면서 퀴즈 푸는 것을 아주 좋아했는데요.

      한번 멘사 시험에 도전해볼까? 라는 생각을 최근에 가지게 되었습니다. ㅎㅎ


      신청을 하려고 멘사코리아 홈페이지에 등록된 테스트 일정들을 확인해 봤는데,

      image.png

      위처럼 테스트 일정이 굉장히 무작위로 열리는 것을 알 수 있습니다.

      (일주일 만에 열릴 때도 있고, 1년 2개월 만에 열릴 때도 있고.. 심지어 접수기간도 단 5일정도..)


      때문에 몇 번의 신청 기간을 놓쳐버린 저는, AWS 서비스들을 사용해서 멘사 테스트 알람 스케줄러를 만들기로 결심합니다..ㅋㅋ


      1. Amazon SES (Simple Email Service)

      먼저 알람 메일 발송을 위해 Amazon SES(Simple Email Service)를 구성합니다.

      SES는 이름 그대로 별도의 메일 서버 없이 간단하게 메일 발송을 도와주는 AWS 서비스 입니다.

      • 'Amazon SES - 자격 증명' 에서 '자격 증명 생성' 을 클릭해줍니다.

        image.png

      • '이메일 주소'에 개인 이메일 주소를 입력하고 생성을 눌러줍니다.

        (저는 카톡으로 알람을 받기 위해 수신은 카카오, 발신은 네이버를 사용했습니다.)

        image.png

      • 처음 생성하면 상태가 '보류중'으로 뜨는데요, 입력한 메일 수신함에서 승인 링크를 클릭하면 '확인됨'으로 바뀌어 발신/수신 용도로 사용이 가능하게 됩니다.

        image.png


      2. AWS Lambda

      이어서 멘사테스트 페이지를 크롤링하고 메일 발송을 수행하는 코드를 실행할 Lambda를 구성합니다.

      Lambda는 간단한 코드를 서버리스로 실행할 수 있는 AWS 서비스 입니다.

      • 'AWS Lambda - 함수' 에서 '함수 생성' 을 클릭해줍니다.

        image.png

      • 함수 이름을 작성하고 런타임을 선택한 뒤 '함수 생성' 을 클릭해줍니다.

        저는 파이썬으로 크롤링 코드를 작성하였으므로, 런타임은 Python 3.12를 선택하였습니다.

        image.png

      • 아래와 같이 파이썬으로 멘사 테스트 크롤링 코드를 작성하였습니다.

        1) 게시물 번호에 해당하는 태그(td.c.f_ver11)를 확인한 후, 가장 최신 게시물 번호를 추출

        image.png

        2) 해당 번호가 지정한 번호보다 클 경우, send_email() 실행

      import requests
      from bs4 import BeautifulSoup
      import boto3
      
      SES_CLIENT = boto3.client('ses', region_name='ap-northeast-2')
      FROM_EMAIL = "****@naver.com"
      TO_EMAIL = "****@kakao.com"
      
      def check_new_post():
          url = "https://www.mensakorea.org/bbs/board.php?bo_table=test"
          response = requests.get(url)
          soup = BeautifulSoup(response.text, 'html.parser')
          
          # 게시물 목록에서 가장 최신 게시물 번호 추출
          latest_post = soup.select_one('td.c.f_ver11').text.strip()
      
          return int(latest_post)
      
      def send_email():
          subject = "멘사 새로운 게시물 알림"
          body = "멘사 새로운 게시물이 등록되었습니다: https://www.mensakorea.org/bbs/board.php?bo_table=test"
          
          response = SES_CLIENT.send_email(
              Source=FROM_EMAIL,
              Destination={
                  'ToAddresses': [TO_EMAIL],
              },
              Message={
                  'Subject': {'Data': subject},
                  'Body': {'Text': {'Data': body}}
              }
          )
          print(f"Email sent! Message ID: {response['MessageId']}")
      
      def lambda_handler(event, context):
          last_checked_post = 211  # 마지막 게시물 번호
      
          current_latest_post = check_new_post()
      
          if current_latest_post > last_checked_post:
              send_email()
              last_checked_post = current_latest_post
          
          return {
              'statusCode': 200,
              'body': 'Lambda function executed successfully!'
          }
      • 이대로 함수를 실행하면 'no module named' 에러가 발생합니다. Lambda 기본 패키지 라이브러리에 requests 등의 모듈이 없기 때문입니다.

        로컬에서 관련 패키지를 다운로드&압축 한 뒤, Lambda Layer를 통해 패키지 압축 파일을 업로드 해주어야 합니다.

        pip -t 로 패키지를 다운로드한 후, 다운로드한 폴더를 python_lib.zip으로 압축해줍니다.

        pip install requests bs4 boto3 -t . --no-user

      • 'Lambda - 계층 - 계층 생성' 으로 들어가서 방금 압축해준 python_lib.zip을 업로드해 줍니다.

        image.png

      • 이제 다시 'Labmda - 함수' 로 들어와서 이전에 만든 mensa-alarm 함수에 레이어를 추가해줍니다.

        image.png

      • 마지막으로 Lambda에서 send_email을 호출할 수 있도록 Lambda의 IAM Role에 AmazonSESFullAccess Policy를 추가해줍니다.

        image.png

      • 이제 Lambda 코드를 Deploy하고 테스트를 수행해보면, 아래와 같이 함수 실행에 성공함을 확인할 수 있습니다.

        image.png

      • 메일도 잘 발송되는지 테스트하기 위해 Lambda 코드의 마지막 게시물 번호를 210으로 수정하여 배포하니, 아래와 같이 메일도 잘 발송됨을 확인할 수 있습니다.

        image.png


      3. Amazon EventBridge

      이제 Deploy된 Lambda 코드가 주기적으로 실행되도록 Amazon EventBridge로 스케줄러를 구성합니다.

      • 'Amazon EventBridge - 일정' 에서 '일정 생성' 을 클릭해줍니다.

        image.png

      • 일정 이름을 입력하고, 일정 패턴은 아래와 같이 '반복 일정 - Rate 기반 일정' 으로 10분마다 Lambda 함수를 호출하도록 지정 했습니다.

        image.png

      • 대상은 AWS Lambda Invoke로 선택하고 이전에 배포한 Lambda 함수를 지정하여 스케줄러를 생성해줍니다.

        image.png

        image.png

      • 마지막으로 테스트를 위해 Lambda 코드의 마지막 게시물 번호를 210으로 수정하여 배포하니, 아래와 같이 10분마다 알람 메일이 발송되는 것을 확인할 수 있습니다.

        이제 다시 소스코드에서 게시물 번호를 211로 수정하고 새 글 알람이 오기만을 기다리면 됩니다.^^ (막상 신청만 하고 합격이 어려운 것은 함정)

        image.png

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      zero 님의 최신 블로그

      더보기
      동영상 기고하기