AWS Lambda에서의 Timezone 설정
TL;DR
TZ
환경 변수(Environment Variable) 통해서 Timezone을 설정할 수 있어요
오늘 AWS Lambda에 크롤러를 만들어 올렸는데 컨텐츠를 제대로 가져오지 못하는 일이 생겼다.
분명 로컬에서는 잘 돌아가는데, Lambda로 배포하고 돌려보면 컨텐츠를 제대로 가져오지 못했다.
원인을 찾아보니, 크롤러에서 요청을 날릴때 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가 막혀있어서 파일을 수정할 수 없다.
정말 다행히 Lambda에서 환경 변수를 지원해서, TZ
환경 변수를 Asia/Seoul
로 설정해봤더니.
너무 잘 된다. POSIX 짱짱맨!!!!
Node.js 런타임 내에서
TZ
환경변수를 설정할 경우 (e.g.process.env.TZ = 'Asia/Seoul';
),
어떠한 Date 함수를 호출하기 전에 반드시 먼저TZ
환경변수를 설정해야한다.
그렇지 않는다면 Timezone 설정이 적용되지 않는다.