ec2에 한국 표준시 적용하기 - woowacourse-teams/2020-songpa-people GitHub Wiki

문제

우리가 운영하고 있는 ec2는 UCT(협정 세계시)를 따르기 때문에 한국 시간보다 9시간 느리다.

문제가 되는 것은 서비스에 접속하는 로그를 남길 때, 데이터베이스에 정보를 저장할 때 등이다.

로그 분석의 문제

로그를 저장할 때 문제가 되는 것은 경험상의 문제였다.

로그 파일을 분석하는것에 익숙하지 않았기 때문에 서비스 접속에 에러가 발생했을 때 생성된 로그가 지금 접속 때문에 생긴 것인지 과거에 생긴 것인지 시간을 보고서 직관적으로 확인이 힘들었다.

데이터 저장 문제

데이터베이스에 데이터를 쌓을때 우리는 가게 생성 / 변경 로그를 쌓기 위해 created_date / modified_date 컬럼을 관리한다.

우리는 Spring Data의 AuditingEntityListener 를 이용해서 자동으로 시간 컬럼에 대한 값을 저장하고 있다.

이 클래스는 DateTimeProvider라는 빈을 직접 만들어서 주입해주면 엔티티를 저장할 때 설정한 시간대로 저장할 수 있다.

하지만 우리는 따로 빈을 주입하지 않고 기본으로 생성되 주입되는 빈을 사용해서 시간을 지정하고 있는데 이 빈은 CurrentDateTimeProvider가 주입된다.

따라서 프로그램이 실행되고 있는 환경의 시간 값이 저장되는데 ec2의 시간이 UCT 이므로 우리가 새벽에 스케쥴러를 실행해서 데이터를 저장한다면 데이터베이스에 저장되는 값은 9시간 빠른 저녁 시간이 저장될 것이다.

해결 방법

Linux 인스턴스의 시간 설정

  1. 시간을 변경할 ec2에 접속한다.

  2. 인스턴스에 사용할 표준 시간대를 식별한다.

    • /usr/share/zoneinfo 디렉토리에 표준 시간대에 대한 정보가 들어있다.
    • 우리는 서울 시간을 적용할 것이기 때문에 /usr/share/zoneinfo/Asia/Seoul 이 있는지 확인한다.
  3. etc/sysconfig/clock 파일을 수정한다.

    • ec2에 해당 디렉토리와 파일이 없을 수 있다.
    • 만약 디렉토리와 파일이 없다면 다음 명령어를 수행해서 만들어준다.
    > sudo mkdir /etc/sysconfig
    > sudo vi /etc/sysconfig/clock
    
    • 파일을 생성했다면 다음 내용을 입력해준다.
    ZONE="Asia/Seoul"
    UTC=true
    ARC=false
    
  4. 인스턴스가 현지 시간 정보를 참조할 때 표준 시간대 파일을 참조하도록 심볼릭 링크 파일을 생성해준다.

    > sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
    
  5. ec2를 재부팅한다.

    > sudo reboot
    
    • 재부팅 명령어를 실행하면 ec2가 종료되고 재실행 된다.
    • aws 페이지에서는 표시되지 않으므로 잠시 기다린 후에 다시 접속을 시도하면 접속 가능하다.
  6. date 명령어로 현재 시간을 확인해본다.