AWS Lambda에서의 Timezone 설정

AWS Lambda에서의 Timezone 설정

TL;DR TZ 환경 변수(Environment Variable) 통해서 Timezone을 설정할 수 있어요

오늘 AWS Lambda에 크롤러를 만들어 올렸는데 컨텐츠를 제대로 가져오지 못하는 일이 생겼다.
분명 로컬에서는 잘 돌아가는데, Lambda로 배포하고 돌려보면 컨텐츠를 제대로 가져오지 못했다.

Timezone 설정하기 전 UTC로 포매팅되는 모습

원인을 찾아보니, 크롤러에서 요청을 날릴때 query string을 만드는 과정에 날짜를 포매팅하는게 문제가 있었다.
query string을 만들때 moment.js로 날짜를 YYYY-MM-DD 형식으로 포매팅하고 있었는데,
로컬 머신의 경우 GMT+9인 한국 타임존이 이미 설정되어 있는 상황이었고, AWS Lambda가 돌아가는 컨테이너는 UTC라 타임존 차이로 결과가 달라진 것이었다.

예~전에 RDS에서도 기본 Timezone이 UTC로 설정되어 있어서 동일한 이슈를 이미 겪어봤기에 바로 타임존 문제임을 알아챌 수 있었다.

그런데 RDS의 경우 Parameter group에서 Timezone 설정만 변경해주면 되는데,
AWS Lambda의 경우 코드만 올리고 땡이라 그런거 없다.

그리고 일반적으로 리눅스 박스에서 Timezone을 변경하려면 /etc/localtime 혹은 /etc/timezone을 수정하는 방법을 썼는데,
AWS Lambda는 코드만 돌아가는 서비스라 그걸 변경하기도 불가능하다. 애초에 Root access가 막혀있어서 파일을 수정할 수 없다.

Timezone을 Asia/Seoul로 설정한 후 포매팅되는 모습

정말 다행히 Lambda에서 환경 변수를 지원해서, TZ 환경 변수를 Asia/Seoul로 설정해봤더니.
너무 잘 된다. POSIX 짱짱맨!!!!

Node.js 런타임 내에서 TZ 환경변수를 설정할 경우 (e.g. process.env.TZ = 'Asia/Seoul';),
어떠한 Date 함수를 호출하기 전에 반드시 먼저 TZ 환경변수를 설정해야한다.
그렇지 않는다면 Timezone 설정이 적용되지 않는다.

References