はじめに
この記事の公開前日に、RDSのタイムゾーンが変更できるリリースの発表がありました(汗)
Release: Amazon RDS on 2015-12-21
このリリースにより、MySQL5.5と5.6、MariaDBについては、パラメーターグループのtime_zone
の設定を変更することで、タイムゾーンを変えることができるようになりました。
MySQL5.1を利用したい場合は、下記の方法でタイムゾーンを修正することができます。
概要
RDSはデフォルトでUTCのタイムゾーンが利用されています。
これはMulti-AZ間(AvailabityZone間)の通信を統一するため、タイムゾーンにこのような設定がはいっています。タイムゾーンがAZ間で異なるとレプリケーションが正常に行えないから当然と言えば当然です。
ですので、RDSインスタンスにログインし、select now()
などの現在の時刻表示コマンドを実施した場合、UTCの時刻が返ってきます。
EC2は容易にJSTに変更することが可能のため、EC2とRDS間にてタイムゾーンの差異が発生し、利用が不便になったりアプリとの連携がうまくいかなかったりする場合があると思います。
今回はRDSをUTCではなくJSTにて利用できるように、RDS側のパラメータを変更します。
上記図は、EC2とRDS(Multi-AZ)を利用した際の環境例です。
パラメータ設定
プロシージャ作成
RDSへログインし下記コマンドにてプロシージャを作成します。
プロシージャの内容はrdsadminがカレントユーザでない場合に、JSTになるように設定を記載しています。
rdsadminはRDSの各機能を利用する上で必要なユーザとなっており、本ユーザがMulti-AZ間で通信を行っています。
rdsadminを除外する理由は上記[概要]にて説明しているとおりレプリケーションが正常に行えないことを防ぐためです。
mysql> DELIMITER |
mysql> CREATE PROCEDURE {プロシージャ名} ()
mysql> IF NOT (POSITION('rdsadmin@' IN CURRENT_USER()) = 1) THEN
mysql> SET SESSION time_zone = 'Asia/Tokyo';
mysql> END IF
mysql> |
mysql> DELIMITER ;
init_connectパラメータを設定
下記の通り、init_connectへ先ほど作成したプロシージャを記載します。
CALL {プロシージャ名};
以上で完成です。
この状態でRDSへログインするとrdsadmin以外のすべてのユーザにJST時刻が出力されます。
AWS側はRDSをUTC利用することを推奨しているため、JSTで利用して問題が発生してもサポートしてくれいないかもしれませんので、注意してください。