AWS RDS의 타임존 변경하기

By | 2014/10/10

최근까지 N모사의 클라우드 서비스를 사용하다가, 혼자서 서버를 관리해야하는 부담 때문에 AWS로 넘어왔다. 그러면서 기존에 구상해 두었던, 서버 아키텍쳐를 AWS로 다 옮기는 중에 있는데, 그중에 하나는 Mysql-cluster를 RDS로 옮기기로 한 결정이었다. 그래서 RDS 인스턴스를 만들어보고 테스트 중에 있는데, 아니 타임존이 UTC로 되어 있어서 시간이 내가 의도한대로 나오지 않는 것이었다!

이걸 고치는 법을 아마존에서 공식적으로 지원하지는 않는 것으로 보이고(오라클은 최근에 지원이 되기 시작했다!) 뭔가 다른 방법으로 해야될 것 같아서 찾아보니 DB프로시져를 이용하는 방법이 있었다.

간단히 단계를 살펴보자면 아래와 같다.

  1. 스토어드 프로시져의 작성
  2. Parameter Group의 작성
  3. RDS에 Parameter Group을 적용
  4. RDS 인스턴스 재시작

이 작업을 하면서 주의해야될게 하나 있는데 rdsadmin 이라는 유저는 AWS쪽에서 DB인스턴스 관리용으로 사용되는 녀석으로 타임존을 건드리면 이상하게 동작할 것 같으니 이녀석의 타임존은 안건드려야 한다는 것이다.

이제 스토어드 프로시져부터 만들어보자

1. 스토어드 프로시져 만들기

프로시져 명을 mysql.store_time_zone이라고 했는데, mysql에는 실제로 사용할 DB의 이름을 넣도록 하자. 귀찮으면 그냥 둬도 상관은 없다.

DELIMITER |
CREATE PROCEDURE mysql.`store_time_zone`()
    IF NOT (POSITION('rdsadmin@' IN CURRENT_USER()) = 1) THEN
        SET SESSION time_zone = 'Asia/Seoul';
    END IF |

DELIMITER ;

2. Parameter Group 만들기

RDS에서는 MySQL의 파라메터를 Parameter Group으로 그룹단위로 관리하고 있다. mysql의 세션이 최초 접속시에 위에서 만들어둔 프로시져를 실행하도록 init_connect파라메터를 설정하기 위한 Parameter Group을 만들자.

RDS의 Parameter Groups에 들어가서 Create DB Parameter Group을 클릭한다.

그림1

Yes, Create를 클릭!

그림2

store-time-zone을 선택후 Edit Parameters를 클릭하자.

엄청 많은 파라메터들이 있는데 init_connect 파라메터를 찾아서 아래의 CALL 명령어를 입력하자

CALL mysql.store_time_zone

그림3

설정이 끝났으면 위로 올라와서 Save Changes를 클릭해서 설정을 저장한다.

그림4

3. RDS에 파라메터 그룹을 설정하기

그림5

RDS instance메뉴로 가서 DB Instance를 선택한다음 마우스 오론쪽을 클릭해서 Modify 메뉴로 들어가자.

Parameter Group을 위에서 작성한 그룹으로 변경하고 Apply Immediately를 체크하고 변경하자.
그림6

4. DB인스턴스의 재시작

적용후 DB인스턴스를 재시작해주면 된다.

잘 적용 되었는지 DB에 접속해서 확인을 해보자. 아래와 같이 쿼리를 날리면 아마 바뀌어진 타임존으로 시간이 나올 것이다.

적용전/적용후를 알 수가 없지만, 이 글을 포스팅한 시간이 2014년 10월 10일 오후 5시 50분경이니 잘나오는거라고 보시면 된다. ^^;

mysql > select now();

그림7

Tip 커맨드라인으로 변경하기

** ※ AWS RDS API는 사용가능 한 상태임을 가정한다. **

앞서 본것 처럼 웹콘솔에 들어가서 작업을 해도 되지만, API로 하는 방법도 있다.
단계는 동일한데 단순히 API를 쓴다는 것만 다르다.

  • 프로시져를 만든다.
  • 파라메터 그룹을 만든다.
  • RDB인스턴스의 파라메터 그룹 설정을 변경한다.
  • RDB인스턴스 재시작

프로시져는 위에서 만들어 봤으므로 생략하겠다

파라메터 그룹 만들기

아래의 커맨드로 그룹을 쉽게 만들 수 있다.

$ rds-create-db-parameter-group store-time-zone  --db-parameter-group-family  mysql5.6  --description "change time zone" --region "ap-northeast-1"

파라메터 그룹 설정 적용하기

아래의 커맨드로 만든 그룹에 대한 설정을 하고 적용을 바로 할 수 있다.

$ rds-modify-db-parameter-group PARAMGROUP --parameters "name=init_connect, value='CALL mysql.store_time_zone', method=immediate"

재시작도 해보자

※ rdb 인스턴스 명을 알고 있어야 한다.

$ rds-reboot-db-instance {rdb instance 명}

댓글

  1. JaeHyeok Jo 댓글:

    reboot 했더니 접속을 할 수 없게 되었네요…
    왜 그럴까요?