サマータイムを勝手に Amazon Linux 2 に導入してみる

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

最近(2018/8) サマータイム導入が議論されていて、賛否両論いろいろあるみたいですが、
Linux の多くのディストリビューション(以下 OS)では、すでに対応済みになっています。
元々は国際化対応 (internationalization,i18n) の中で、国ごとの時刻表示に対応する
必要があり、ロケール の一環としてサマータイム対応されています。
各国のサマータイムの情報や、時差の情報は IP アドレスの割り当て等を管理している
IANA で収集していて、Time Zone Database (以下、tzdata) として公開しています。
[1] , [2]
日本でも GHQ 占領時代に一時サマータイムが実施されたことがあり [3] 、その時の
データが収録されています。 [4] JDT (Japan Daylight Saving Time) という、
日本のタイムゾーンを表す3文字コードも収録されています。 [5]
なので、少なくとも OS 上は、サマータイムが制定されていつから始まり、いつ終わる
のかが決定されれば、アップデートに従って tzdata が更新されてサマータイム対応完了
となるはずです。ただし、DBMS などの個々のミドルウェアに関しては時刻に関する
扱いが異なる可能性があるため注意が必要です。
例えば JAVA は OS とは別に tzdata を持っており、別途対応するようになっています。
それでは、試験的にサマータイムを導入してみたいと思います。

環境

今回実施した環境は以下の通りです。

  • ディストリビューション
    Amazon Linux 2
  • AMI
    amzn2-ami-hvm-2.0.20180622.1-x86_64-gp2 (ami-a9d09ed1)
    (yum update 実施済み)
  • リージョン
    us-west-2 (オレゴン)
  • インスタンスタイプ
    m5.large
  • kernel
    kernel-4.14.59-68.43.amzn2.x86_64
  • glibc
    glibc-2.26-28.amzn2.0.1.x86_64
  • tzdata
    tzdata-2018c-1.amzn2.noarch

ほかのディストリビューションでも RHEL,CentOS,Fedora 等 RedHat 系であれば、
ほぼ同じ手順で実施できると思います。

準備

配布物ではデータはバイナリ形式で配布されているため、ソースからリビルドします。
まず rpmdevtools をインストールします。後述の

次に rpm パッケージビルド用のツリーを作成します。

tzdata のソースパッケージをダウンロードします。

リビルド用の依存パッケージもインストールします。

ソースパッケージの展開

ソースパッケージを展開します。

SPECS ディレクトリに移動します。

今回ソースを書き換えたいので、一旦ソースを展開します。

BUILD ディレクトリに移動します。

tzdata-2018c というディレクトリができているので、後でパッチにできるように
一旦退避します。

タイムゾーンデータの書き換え

それでは書き換えましょう。
とりあえず tzdata-2018c ディレクトリに移動します。

今回はテストということで、特にこだわりがないので、アメリカ東部時間から
コピーして修正した以下の2行を asia ファイルに追記しました。
各項目の詳しい意味などを知りたい方は、man 8 zic [6] 等をご参照ください。

差分をパッチにして SOURCES ディレクトリに保存します。

パッケージのビルド

SPECS ディレクトリに移動します。

先ほど作成した、パッチが反映されるように tzdata.spec ファイルを変更します。
差分は以下の通りです。

パッケージをビルドします。

パッケージのインストール

無事ビルドできたようなので、 RPMS/noarch ディレクトリに移動します。

パッケージを置き換えます。
今回パッケージ名等を修正しなかったので、”–replacepkgs –replacefiles” という
あまり使用しないオプションを追加してパッケージの置き換えを実施しています。

動作確認

zdump コマンドでデータが反映されていることを確認します。

環境変数 TZ を設定して date コマンドで サマータイムが反映されていることを確認します。
通常、UTC に対して +9:00 されますが、+10:00 になっていることが確認できました。
また、タイムゾーンの表示もサマータイムを示す JDT に変わっています。

いくつかのミドルウェアでも確認してみる

php でも大丈夫そうです。参考までに date コマンドも一緒に出力しています。

ruby でも大丈夫そうです。

python も同様

node これも問題なさそうです。

最後に

以上、OS 的にはサマータイムに対応する機構がすでに実装されているため、
データを追加するだけで問題なく、サマータイムに対応できることが確認できました。
そのため、サマータイムが実施されても tzdata を更新することで基本的には対応完了
となります。
ただ、ドキュメントや運用ルールなどシステム外の部分に対してはいろいろ対応が必要
かと思います。また OS に同梱されているミドルウェアなどでは別途確認、対応が必要に
なるケースがあるかと思います。ご注意ください。
以上です。

[1] IANA Time Zone Database
[2] GiHhub Time zone database and code
[3] ウィキペディア 夏時間
[4] https://github.com/eggert/tz/blob/5c005615f3f8beaa3eaf4a67ab9c87dc702e1781/asia#L1607
[5] https://github.com/eggert/tz/blob/5c005615f3f8beaa3eaf4a67ab9c87dc702e1781/asia#L1650
[6] jman project zic 8

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.