[新機能]Amazon Auroraで日本時間が使用可能になりました!
ウィスキー、シガー、パイプをこよなく愛する大栗です。
去年末に対応したRDS for MySQLのタイムゾーン変更に引き続きAuroraでもタイムゾーンが変更可能になりました! Auroraでは対応していなかったでの心待ちにしていたのですが、ようやく対応したので確認してみたいと思います。
変更可能なタイムゾーン
Auroraで設定可能なタイムゾーンは、以下の62個(2016年3月2日現在)となっています。 RDS for MySQLでは84個と設定できる内容に違いがあるのでご注意下さい。 (この記事を読まれている方でUTCとAsia/Tokyo以外を設定する人は少ないと思いますが)
# | タイムゾーン | # | タイムゾーン | # | タイムゾーン |
---|---|---|---|---|---|
1 | Africa/Harare | 22 | Asia/Bangkok | 43 | Australia/Sydney |
2 | Africa/Monrovia | 23 | Asia/Beirut | 44 | Canada/Saskatchewan |
3 | Africa/Nairobi | 24 | Asia/Calcutta | 45 | Brazil/East |
4 | Africa/Windhoek | 25 | Asia/Kabul | 46 | Europe/Amsterdam |
5 | America/Bogota | 26 | Asia/Karachi | 47 | Europe/Athens |
6 | America/Caracas | 27 | Asia/Kathmandu | 48 | Europe/Dublin |
7 | America/Chihuahua | 28 | Asia/Muscat | 49 | Europe/Helsinki |
8 | America/Cuiaba | 29 | Asia/Riyadh | 50 | Europe/Paris |
9 | America/Denver | 30 | Asia/Seoul | 51 | Europe/Prague |
10 | America/Fortaleza | 31 | Asia/Shanghai | 52 | Europe/Sarajevo |
11 | America/Guatemala | 32 | Asia/Singapore | 53 | Pacific/Auckland |
12 | America/Halifax | 33 | Asia/Taipei | 54 | Pacific/Guam |
13 | America/Manaus | 34 | Asia/Tehran | 55 | Pacific/Honolulu |
14 | America/Matamoros | 35 | Asia/Tokyo | 56 | Pacific/Samoa |
15 | America/Monterrey | 36 | Asia/Ulaanbaatar | 57 | US/Alaska |
16 | America/Montevideo | 37 | Atlantic/Azores | 58 | US/Central |
17 | America/Phoenix | 38 | Australia/Adelaide | 59 | US/Eastern |
18 | America/Tijuana | 39 | Australia/Brisbane | 60 | US/East-Indiana |
19 | Asia/Ashgabat | 40 | Australia/Darwin | 61 | US/Pacific |
20 | Asia/Baghdad | 41 | Australia/Hobart | 62 | UTC |
21 | Asia/Baku | 42 | Australia/Perth |
設定してみる
DBパラメータグループを作成する
defaultのDBパラメータグループは項目を編集できないため、パラメータグループを別途作成します。
グループの種類 | パラメータグループ名 |
---|---|
DB Cluster Parameter Group | aurora-clu-time-param |
DB Parameter Group | aurora-time-param |
Auroraを起動する
作成したパラメータグループを設定してAuroraを起動します。
タイムゾーンを変更する
Manegement ConsoleからRDS画面のParameter Groups
を選択して、作成したDB Cluster Parameter Groupaurora-clu-time-param
を選択します。Edit Parameters
ボタンから編集画面に遷移してtime_zone
パラメータをAsia/Tokyo
に変更してSave Changes
ボタンで保存します。
time_zone
を変更している最中の挙動を確認してみます。
1秒ごとにAuroraへログインしてselect now()
で時刻を確認します。
2016年 3月 2日 水曜日 03:52:31 UTC
ではAurora上でUTCの2016-03-02 03:52:31
でしたが、1秒後の2016年 3月 2日 水曜日 03:52:32 UTC
ではJSTの2016-03-02 12:52:32
が表示されています。
$ date ; (export TZ=JST-9 ; date) ; \ > echo "select now();" \ > | mysql -u awsuser -pmypassword -h localtime.xxxxx.ap-northeast-1.rds.amazonaws.com 2016年 3月 2日 水曜日 03:52:30 UTC 2016年 3月 2日 水曜日 12:52:30 JST now() 2016-03-02 03:52:30 $ date ; (export TZ=JST-9 ; date) ; \ > echo "select now();" \ > | mysql -u awsuser -pmypassword -h localtime.xxxxx.ap-northeast-1.rds.amazonaws.com 2016年 3月 2日 水曜日 03:52:31 UTC 2016年 3月 2日 水曜日 12:52:31 JST now() 2016-03-02 03:52:31 $ date ; (export TZ=JST-9 ; date) ; \ > echo "select now();" \ > | mysql -u awsuser -pmypassword -h localtime.xxxxx.ap-northeast-1.rds.amazonaws.com 2016年 3月 2日 水曜日 03:52:32 UTC 2016年 3月 2日 水曜日 12:52:32 JST now() 2016-03-02 12:52:32 $ date ; (export TZ=JST-9 ; date) ; \ > echo "select now();" \ > | mysql -u awsuser -pmypassword -h localtime.xxxxx.ap-northeast-1.rds.amazonaws.com 2016年 3月 2日 水曜日 03:52:33 UTC 2016年 3月 2日 水曜日 12:52:33 JST now() 2016-03-02 12:52:33
一方、Auroraにログインしたままselect now()
で時刻を確認してみます。
タイムゾーンが変わった2016年 3月 2日 水曜日 03:52:31 UTC
から2016年 3月 2日 水曜日 03:52:32 UTC
で表示はUTCのままとなっています。タイムゾーンが変更されてもログイン中のコネクションでは元のタイムゾーンが維持されて、新しいコネクションからタイムゾーンが変更されます。
mysql> select now(); +---------------------+ | now() | +---------------------+ | 2016-03-02 03:52:30 | +---------------------+ 1 row in set (0.00 sec) mysql> select now(); +---------------------+ | now() | +---------------------+ | 2016-03-02 03:52:31 | +---------------------+ 1 row in set (0.00 sec) mysql> select now(); +---------------------+ | now() | +---------------------+ | 2016-03-02 03:52:32 | +---------------------+ 1 row in set (0.00 sec) mysql> select now(); +---------------------+ | now() | +---------------------+ | 2016-03-02 03:52:33 | +---------------------+ 1 row in set (0.00 sec)
注意
Auroraのドキュメントを読んでいて、以下の記述が気になりました。
This time zone setting can return incorrect values from 30 Sep 1937 15:00:00 GMT to 31 Dec 1937 15:00:00 GMT. (このタイムゾーンの設定は、1937年9月30日15時00分00秒 GMT から1937年12月31日15時00分00秒 GM Tまで誤った値を返すことがあります。)
これだけ読むと実装にバグが有るように思えますが、「1937年9月30日15時00分00秒 GMT」つまり「1937年10月01日00時00分00秒 JST」に日本の標準時に関する法律が変わっています。日本に「西部標準時」があったのですが無くなって「中央標準時」に統一されています。年の途中で標準時の変更があったので地政学的に正しい時刻が返せないと言うことだと自分は認識しました。 他のタイムゾーンでも「This time zone setting can return incorrect values from 〜 to 〜」という記述が散見されますが、同様の問題だと思います。
また、うるう秒についても気になったので確認してみました。 普通にうるう秒無しのタイムゾーン表記のようです。MySQLでもうるう秒を表現できないので当然といえば当然ですね。
mysql> select from_unixtime(1341100799), from_unixtime(1341100800), from_unixtime(1341100801); +---------------------------+---------------------------+---------------------------+ | from_unixtime(1341100799) | from_unixtime(1341100800) | from_unixtime(1341100801) | +---------------------------+---------------------------+---------------------------+ | 2012-07-01 08:59:59 | 2012-07-01 09:00:00 | 2012-07-01 09:00:01 | +---------------------------+---------------------------+---------------------------+ 1 row in set (0.00 sec)
さいごに
最近使用頻度が高くなっているAuroraでタイムゾーンが設定できるようになったので、RDS for MySQLと同じように使用できる事になりました。しかし、Auroraをスナップショットからリストアするときには、デフォルトのパラメータグループが設定されるのでUTCとなります。使用前にパラメータグループを設定して今まで使用していたタイムゾーンに設定すること忘れないようにしてください。