はじめまして、遅れてきたルーキー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で管理しています。
ここで変更!!
・・・変更できませんけど。。。
その後、調べてみますと、どうやら対応は以下の2つに分かれるようです。
その1: RDSはUTCのまま運用、利用するアプリケーション側でUTCとJSTの変換を実行する
その2: time_zone セッション変数で、JSTを指定して、セッション単位でタイムゾーンをUTCからJSTに変更する
今回の課題では、アプリケーションは登場しないので、その2を採用しました。
ちなみに”その2”を採用する場合、RDSの内部で使われる管理用ユーザのセッションはUTCで動作するようにしないと、Multi-AZ構成のfailover時に不具合がおこるようです。
その管理用ユーザは、”rdsadmin”というユーザです。
ちなみに、RDS上で、Read Replicaを作ると、”rdsrepladmin”というユーザも自動的に作られます。
これらのユーザを除外しつつ、セッション開始時にタイムゾーンを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