2011年3月31日木曜日

RDSでタイムゾーン(UTC)を変更

スズキです。
※コメントにもあるのですが、以下の方法は出来る場合とできない場合があるようです...
※RDSの"init_connect"パラメータでのtimezone変更はサポートされないとのことです...

下記の通り、デフォルトタイムゾーンを変更することはできません。
なので、"init_connect"に

SET time_zone = 'Asia/Tokyo';

を設定する作戦を試してみました。

まずは、いつもの"Amazon RDS Command Line Toolkit"での設定ですが、
"rds-modify-db-parameter-group"を試したところ、
クオートなり空白なりの問題で、設定することができませんでした...
(下記にも指摘されていました...)

ただ、クオートは空白はツールが対応していないだけの可能性もあるので、
"AWS SDK for PHP"でも試してみました。

コードはこんな感じです。

--------【PHP】--------

// ライブラリのインクルード
require_once("./sdk.class.php");

// RDSオブジェクトの生成
$rds = new AmazonRDS();


// リージョンの設定
$rds->set_region(AmazonRDS::REGION_APAC_NE1);

// パラメータの設定
$response = $rds->modify_db_parameter_group('suz-lab', array(
    array(
        "ParameterName"  => "init_connect",
        "ParameterValue" => "set time_zone = 'Asia/Tokyo';",
        "ApplyMethod"    => "immediate"
    ),
));

// レスポンスの確認 
var_dump($response);

--------

すると、こちらでは無事設定が成功し、
"AWS Management Console"でも確認できました。


これで、アプリケーション側に修正してもらわなくてもOKです。

よかった、よかった...
--------
http://www.suz-lab.com

6 コメント:

HAOKI さんのコメント...

非常に情報が豊富で、
いつも参考にさせて頂いております。

本件での対処方法は非常に興味深いのですが、1点お伺いしたいことがございます。

TIMEZONEの設定をinit_connectで行った場合、ERROR 2013(Lost Connect)が発生していないでしょうか?

当方の場合、init_connectの設定はうまくいくものの、上記エラーが必ず発生してしまいます。

匿名 さんのコメント...

どうやら@@time_zoneとすればいけるようですね。
suz-lab様では発生しなかったのであれば…不思議ですね。

変数は普段使わないので、ググった先を参考にこのように記述したところ一応は解決をみたので、ご参考までに…。

お邪魔致しました。

suz-lab さんのコメント...

僕がやったときは、発生しなかったのですが、
他の人が試したときは、発生していたようです。

不思議です…

情報、ありがとうございました。

HAOKI さんのコメント...

一度は解決したと申し上げましたが、
どうもそうではなかったようです。

同じパラメータ設定で別のインスタンスを立ち上げたところ、同様の問題が発生しました。
>@@はあまり関係なかったかもしれません。

既に正常動作しているものは、そのまま動きますが…。

ますます不思議です。

k_mtk さんのコメント...

原因は、立ち上げ時にinit_connectを設定していると、問題が発生する為の様です。

動作したまま設定を反映させる場合には、問題なく動き続けますが、RDSに対して再起動、もしくはAmazonのメンテナンスが入り停止して起動プロセスを踏むと動作しなくなります。

ですので、起動の手順が踏まれる場合には
起動後に、
rds-reset-db-parameter-group ro-mysql51 --parameters "name=init_connect, method=immediate" .......
を行い、再び init_connect を設定すれば問題ありません。
監視して自動設定するのも手ですが、設定に若干タイムラグがあるので工夫が必要かと思います。

また、Multi-AZになったときにどの様な動作になるかは不明です。

suz-lab さんのコメント...

詳しい挙動に関する情報ありがとうございます。
やはり、init_connectでのタイムゾーンの調整は邪道っぽいですね。