[新機能]Amazon Auroraで日本時間が使用可能になりました!

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ウィスキー、シガー、パイプをこよなく愛する大栗です。

去年末に対応した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を起動します。

RDS_AWS_ConsoleRDS_AWS_Console

タイムゾーンを変更する

Manegement ConsoleからRDS画面のParameter Groupsを選択して、作成したDB Cluster Parameter Groupaurora-clu-time-paramを選択します。Edit Parametersボタンから編集画面に遷移してtime_zoneパラメータをAsia/Tokyoに変更してSave Changesボタンで保存します。

RDS_AWS_Console

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 〜」という記述が散見されますが、同様の問題だと思います。

AWS Documentation » Amazon Relational Database Service (RDS) » User Guide » Aurora on Amazon RDS » Local Time Zone for Amazon Aurora DB Clusters

また、うるう秒についても気になったので確認してみました。
普通にうるう秒無しのタイムゾーン表記のようです。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となります。使用前にパラメータグループを設定して今まで使用していたタイムゾーンに設定すること忘れないようにしてください。