【AWS】RDS for MySQL のタイムゾーンを変更する

Skrumエンジニアの根岸です。
今回は Amazon RDS for MySQL でタイムゾーンを変更する方法をご紹介します。この方法は Amazon Aurora MySQL でも同様です。
(タイムゾーンの変更方法はデータベースエンジンによって異なります。MySQL 以外の場合はこちらを参考にしてください。)
まずは変更対象の RDS インスタンスの詳細画面を開き「設定」タブを選択します。

「DB インスタンスパラメータグループ」という項目に記載されている「default.mysql8.0」が、現在このインスタンスに適用されているパラメータグループです。

パラメータグループとはその名の通り、データベースエンジンに適用される設定値のコンテナ(かたまり)です。このパラメータの1つとしてタイムゾーンが存在し、これを変更することによりタイムゾーンを変更することができます。(タイムゾーンのデフォルトは UTC になっています。)
しかし、「default.mysql8.0」というパラメータグループは RDS インスタンス作成時に自動で作成されるデフォルトのパラメータグループなのですが、デフォルトのパラメータグループはパラメータの変更ができません。よって、新しくパラメータグループを作り、そのタイムゾーンパラメータを変更した上で、作成したパラメータグループを RDS インスタンスにアタッチする必要があります。
それでは、パラメータグループを作成しましょう。



「パラメータグループファミリー」は対象のデータベースエンジンとバージョンに適したものを選びます。「タイプ」は「DB Parameter Group」と「DB Cluster Parameter Group」が選択できます。グループ名、説明は任意のものを設定しましょう。
新しいパラメータグループ「asia-tokyo」が作成されました。

次に作成したパラメータグループのタイムゾーン設定を変更します。
「asia-tokyo」パラメータグループを選択すると、パラメータ一覧が表示されます。タイムゾーンのパラメータ名は「time_zone」なので、「time_zone」で検索し「パラメーターの編集」をクリックします。

「time_zone」パラメータがプルダウンで選択できるようになっているので、適用したいタイムゾーンを選択します。今回は「Asia/Tokyo」にします。

選択したら「変更の保存」をしてください。これでタイムゾーン設定が Asia/Tokyo になっているパラメータグループの完成です。
次に、このパラメータグループを対象の RDS インスタンスに適用します。
インスタンスの変更画面を開きます。「DB パラメータグループ」のプルダウンに先ほど作成したパラメータグループ「asia-tokyo」が表示されるのでそれを選択します。


この状態で DB インスタンスの変更を実行すると、新しいパラメータグループが適用され、タイムゾーンが変更されます。
これで作業は完了です。
ここまでタイムゾーンの変更方法を解説してきましたが、実はデータベースのタイムゾーンを UTC 以外に設定することは好ましくありません。
システムで時間を扱う場合のベストプラクティスは、データベースレイヤーでタイムゾーン変更を行うのではなくアプリケーションレイヤーでタイムゾーン変換を行うことです。
アプリケーションレイヤーでタイムゾーン変換の運用ができる場合は、データベースのタイムゾーンは UTC の方が良いでしょう。
AWS もアプリケーションレイヤーでのタイムゾーン変換を推奨しています。
データベースレイヤーで UTC タイムゾーンを使用するのがベストプラクティスです。UTC は夏時間 (DST) を持たないため、後でシフトするときに時間を調整する必要はありません。
https://repost.aws/ja/knowledge-center/rds-change-time-zone
ローカルタイムゾーンを使用する必要がある場合は、代わりにアプリケーションレイヤーでタイムゾーンを変換します。