본문 바로가기

프로젝트

[기록] EventBridge rule, lambda, 시간대

cron 기반 스케줄링

aws lambda에 cron 스케줄러를 적용하려면 EventBridge 서비스를 이용한다.

https://aws.amazon.com/ko/eventbridge/

 

서버리스 이벤트 라우터 - Amazon EventBridge - Amazon Web Services

Amazon EventBridge 이벤트 버스는 이벤트 수신, 필터링, 변환, 라우팅 및 전송에 도움이 되는 서버리스 이벤트 버스입니다.

aws.amazon.com

 eventbridge는 이벤트 기반으로 애플리케이션을 연결하는 서버리스 서비스로, 버스 · 파이프 · 스케줄러 등의 방법을 통해 AWS의 다양한 애플리케이션을 연동하는데 도움을 준다.

 현재 나는 네이버 뉴스 사이트로부터 뉴스 목록을 가져오는 기능을 구현했고, 이를 aws lambda에 배포하였다. 매일 자정마다 해당 lambda 함수가 동작하기 위해서는 EventBridge cron 스케줄러를 이용해야 한다.

EventBridge 이벤트 설정

 처음에는 cron 식을 ( 0 0 * * ? * ) 으로 작성했었다. 해당 식은 매일 0시 0분, 즉 자정에 lambda를 동작하라는 의미를 담고 있다. 이때 여기서 궁금해야 하는 점이 있는데, 이 cron 식이 어떤 시간대를 기준으로 동작하는 지다.

 EventBridge rule의 경우 UTC 0+을 기준으로 동작하므로, cron 식을 지정할 때 한국의 경우 15시로 지정해야만 한국 시간 기준 자정에 실행된다. 이 부분에 대해서는 EventBridge Scheduler을 이용하면 처음부터 한국 시간을 기준으로 cron 식을 작성할 수 있는데, IAM 설정에 대한 부분을 잘 모르는 상태라 좀 더 공부를 한 후 도전해 봐야겠다.


크롤링 시간 정보 관련

 cron 식을 수정하다가 갑자기 lambda 실행 환경에 따라 한국 기준 자정 시간을 기준으로 Date을 지정하지 않을 수도 있다는 것을 깨달았다. 기존 코드는 다음과 같은 함수를 이용하여 날짜를 지정했다.

export function getDateYTString() {
  const date = new Date();
  const today = getDateString(date);
  date.setDate(date.getDate() - 1);
  const yesterday = getDateString(date);
  return {
    yesterday,
    today,
  };
}

얼핏 보면 뭐가 문제인가 싶을 수도 있는데, 아주 큰 문제가 존재한다. Date는 사용 환경의 시간대를 기준으로 동작한다는 점이다. 만약 미국 리전 lambda을 이용한다면 위 함수는 "미국 시간"을 기준으로 날짜를 지정하는 문제가 발생한다.

 다행히도 현재 한국 또는 도쿄 리전(한국과 도쿄는 UTC +9 시간대를 공유)을 이용하고 있기 때문에 우려하는 일은 발생하지 않겠지만, 내가 조절할 수 없는 방식의 에러를 배제하기 위해서는 항상 한국 시간을 기준으로 날짜를 가져올 수 있도록 구현할 필요가 있다. 관련된 정보를 찾다 보니 블로그 글이 나왔다.

 

[Javascript] 현재 시간을 항상 한국 날짜/시간으로 표시하기 (UTC to KST)

Javascript에서 현재 시간을 표시하기 위해서 'new Date()'를 사용하였습니다. [Javascript] 현재 날짜, 시간 구하기 'new Date()'를 사용해서 가져온 현재 날짜와 시간은 기본적으로 사용자의 PC에 설정 된 표

hianna.tistory.com

로직은 다음과 같다.

  1. 각 환경을 기준으로 현재 시간을 가져온다.
  2. getTimezoneOffset( ) 함수를 이용, 해당 환경의 UTC 시간대를 보정한다.
    getTimezoneOffset 함수는 UTC +0과 실행 환경 사이의 시간 차이를 분 단위로 가지고 있다.
  3. UTC +0 기준으로 보정된 시간에 +9 시간을 더한다.

위와 같은 로직으로 항상 한국 시간을 가져올 수 있게 되었다.


네이버 URL 크롤링 관련 수정

기존에는 날짜를 어제 ~ 오늘로 지정했다. 그런데, 이 경우 어제 발간된 뉴스와 오늘 나온 따끈따끈한 뉴스가 섞인다. 사실 현재 시점에서 필요한 기능은 딱 "어제" 뉴스만 가져오는 것이므로, 발간일을 어제 ~ 어제로 수정했다. 이 기능이 동작할지 궁금하여 네이버 뉴스 검색에 사용해 보았다.

2023.09.15일 뉴스만 가져오는 모습

문제없이 동작했다. 따라서 기존 함수에서 어제 ~ 오늘 가져오는 기능을 어제 날짜로만 처리하게 변경했다.


 고민할수록 시스템의 허점이 보이는 중이다. 새로운 허점은 없는지 항상 생각하는 자세를 가져야겠다.