TIMEZONEなはなし

記事タイトルとURLをコピーする

はじめまして、遅れてきたルーキーtakadaです。
10月からサーバーワークスにジョインしております。これまでAWSの経験がなく、日々勉強の毎日です。

サーバーワークスでは、新人さん向けに検証環境を使った構築課題が用意されており、私もその課題にチャレンジしています。今回は、課題を進めていくなかで直面した問題をご紹介したいと思います。
(なにぶん新人なもので、初歩的な内容になっておりますので、ご了承ください)

さて、直面した問題は、TIMEZONEです。
そう、その昔、某アイドルグループが唄ってたあれです。

EC2(Amazon Linux インスタンス)のタイムゾーン

最初のお題は、「EC2インスタンスでLAMP環境を構築せよ」という課題です。
とりあえず、Amazon Linux インスタンス(今回は、Amazon Linux AMI 2015.09.1 (HVM), SSD Volume Typeを使用)を立ち上げると、UTCで動作しています。。。
うーん。オンプレ環境では、インストール時で指定するもんで、あまり気にすることはありませんでした。

変更の仕方は、公式ドキュメントにのっています。↓

http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-time.html
この手順をEC2(Amazon Linux インスタンス)を立ち上げるたびにおこなうのは大変なので、変更したインスタンスでAMIイメージを作る、もしくは、cloud-init で起動時に手順を自動的に適応するのがよさそうですね。

Amazon RDS for MySQLのタイムゾーン

「Amazon RDS for MySQLを構築せよ」という課題を終えた後、「RDSのタイムゾーンをJSTにせよ」と追加の課題を頂戴しました。 たしかに、以下のコマンドで確認してみると、RDSはUTCで動作しています。

mysql> select now();

通常、MySQLでは、my.cnfの”default-time-zone”オプションでタイムゾーンを指定することができますが、
Amazon RDS for MySQLで、my.cnfの代わりに各種パラメータを管理しているParameter Groupで管理しています。

ここで変更!!

ParameterGroups

・・・変更できませんけど。。。


その後、調べてみますと、どうやら対応は以下の2つに分かれるようです。

その1: RDSはUTCのまま運用、利用するアプリケーション側でUTCとJSTの変換を実行する
その2: time_zone セッション変数で、JSTを指定して、セッション単位でタイムゾーンをUTCからJSTに変更する

今回の課題では、アプリケーションは登場しないので、その2を採用しました。
ちなみに”その2”を採用する場合、RDSの内部で使われる管理用ユーザのセッションはUTCで動作するようにしないと、Multi-AZ構成のfailover時に不具合がおこるようです。

その管理用ユーザは、”rdsadmin”というユーザです。
ちなみに、RDS上で、Read Replicaを作ると、”rdsrepladmin”というユーザも自動的に作られます。

mysqlusers20151030

これらのユーザを除外しつつ、セッション開始時にタイムゾーンをUTCからJSTに変更するために、
Parameter Group中の"init_connect"に、以下のmysqlコマンドのSET文を指定して適応します。

SET SESSION time_zone = CASE WHEN POSITION('rds' IN CURRENT_USER()) = 1 THEN 'UTC' ELSE 'Asia/Tokyo' END;


これで、"rds"から始まるユーザ名を持つユーザ以外のセッションをJSTにすることができます。

なお、一般ユーザとして"rds"からはじまるユーザ名を使用している場合は、そのユーザのセッションはUTCとなりますので、注意が必要です。

まとめ

オンプレミスでは、あまり気にしなかったタイムゾーンですが、AWSだと気をつけないといけませんね。
この他にも、新人さん向けの課題はたくさんあり、オンプレミス1本でやってきた私にとっては、新鮮なことだらけです。また、直面した問題がでてきたらブログにしていきたいと思います。

 

 

(参考にさせていただいたサイト)

http://qiita.com/j3tm0t0/items/089ef96ba131df079ca4