Amazon Time Sync Service で時刻同期した EC2 サーバから時刻同期する

Guten Tag, Berlin の伊藤です。

下記のような時刻同期の方法についてお問い合わせがあり軽く検証してみました。

EC2 では、2017年にリリースされて以来、マネージドNTPである Amazon Time Sync Service を使用して時刻同期することができます。

Amazon Time Sync Service は、VPC で実行されているすべてのインスタンスの 169.254.169.123 IPアドレスで NTP を介して利用できます。インスタンスはインターネットにアクセスする必要はなく、アクセスを許可するためにセキュリティグループルールまたはネットワーク ACL ルールを設定する必要はありません。最新バージョンの Amazon Linux 2 と Amazon Linux AMI はデフォルトで Amazon Time Sync Service と同期します。

参考:Linux インスタンスの時刻の設定

ただし、これは VPC 上の EC2 に向けたサービスなので、それ以外のサーバから直接この IP アドレスへ時刻同期することはできません。

時刻同期された EC2 インスタンスから時刻同期をする方法について、今回は下記の構成で試してみました。

Amazon Time Sync Service で時刻同期

上の説明にもある通り、最新の Linux AMI ではデフォルトで導入されています。 インスタンスを起動すると、下記の通り既に chrony の設定ファイルで Amazon Time Sync Service が指定されていました。

$ cat /etc/chrony.conf 
# use the local instance NTP service, if available
server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool 2.amazon.pool.ntp.org iburst

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Allow NTP client access from local network.
#allow 192.168.0.0/16

# Specify file containing keys for NTP authentication.
keyfile /etc/chrony.keys

# Specify directory for log files.
logdir /var/log/chrony

# Select which information is logged.
#log measurements statistics tracking

# save data between restarts for fast re-load
dumponexit
dumpdir /var/run/chrony

# use a key to secure communication between chronyc and the daemon
#commandkey key1

タイムゾーンの変更

ドキュメントの手順に則り、JST (日本時間) へ変更してみました。

タイムゾーン変更に指定する値は、/usr/share/zoneinfo ディレクトリから見つけられます。日本は Asia の配下にあるのかと思いましたが、zoneinfo の直下に Japan がありました。(図のうち、白文字・青背景)

/etc/sysconfig/clock を下記の通りに編集、シンボリックリンクの作成、インスタンス再起動を行います。

$ sudo vi /etc/sysconfig/clock
ZONE="Japan"
UTC=true

$ sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime 

$ sudo reboot

再起動後に接続し直すと、UTC→JSTに変わっていました。

$ date
Thu Jun 13 00:38:42 JST 2019

NTP サーバの変更

NTPクライアントにおける同期サーバの変更

2台目のインスタンスを起動します。

今度は、/etc/chrony.conf で Amazon Time Sync Service のIPアドレス「169.254.169.123」で指定していた NTP サーバを、先ほど起動した1台目のパブリック IP アドレス(xx.xxx.xxx.xxx)へ書き換えます。

※ここでは、ついでにログ設定を有効にしています。(細かい設定は末尾の参考ページから学ばせていただきました)

# use the local instance NTP service, if available
server xx.xxx.xxx.xxx prefer iburst

# Specify directory for log files.
logdir /var/log/chrony

# Select which information is logged.
log tracking

再起動して、時刻同期のソースを確認してみると、それまで1行目にあった「^* 169.254.169.123」が、1台目のインスタンスの DNS になっており、ステータスが「unreachable」(到達不可)となっています。

$  sudo service chronyd restart
Stopping chronyd:                                          [  OK  ]
Starting chronyd:                                          [  OK  ]

$ chronyc sources -v
210 Number of sources = 8

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^? ec2-xx-xxx-xxx-xxx.eu-we>     0   7     0     -     +0ns[   +0ns] +/-    0ns
^* t2.time.ir2.yahoo.com         2   6    17    24   -107us[ -217us] +/- 8749us
^- bray.walcz.net                2   6    17    24  +4568us[+4568us] +/-   32ms
^+ t1.time.ir2.yahoo.com         2   6    17    25    -60us[ -161us] +/-   13ms

NTPサーバにおける設定変更

当然のことながら、このまま待ってても上の状態は解消されず、1台目サーバからの時刻同期はできません。1台目のサーバに戻り、クライアントからのアクセスを許可する必要があります。

その1:chrony 設定の更新

1台目サーバの /etc/chrony.conf に allow 行を加え(または先頭の#をはずし)、2台目サーバのパブリック IP アドレス(yy.yyy.yyy.yy)を許可し、chrony を再起動します。

# Allow NTP client access from local network.
allow yy.yyy.yyy.yy/32

※デフォルトでは NTP クライアントからのアクセス許可が与えられておらず、このように allow または deny で複数の条件を指定することができます。逆に、全く NTP サーバとしてクライアントから読み込みをさせないという場合には、port 0を指定することで、NTPサーバとしての機能を完全に無効にすることができます。

その2:セキュリティグループの更新

AWS 側での設定も必要です。1台目サーバにアタッチされたセキュリティグループに対しても、2台目サーバのパブリック IP アドレス(yy.yyy.yyy.yy)をインバウンド設定に追加します。

今回は、下記のように2台の EC2 インスタンスとも同じセキュリティグループに所属させていたので、プライベート IP によるアクセスは可能となっていますが、パブリック IP によるアクセスなので、IP and/or ポートを追加で許可する必要があります。

確認

2台目サーバに戻って、改めて確認すると、ステータスが無事「*」となっており、1台目が NTP サーバとして時刻同期されていました!

$ chronyc sources -v
210 Number of sources = 8

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* ec2-xx-xxx-xxx-xxx.eu-we>     4   7     7    21  +6710ns[ +643us] +/- 1426us
^- t1.time.ir2.yahoo.com         2   7   377    95   -594us[  +51us] +/-   10ms

その他もろもろ

ログ

log で tracking を有効にした場合の出力ログの例です。こちらは1台目サーバで Amazon Time Sync Service から同期していますが、今回の2台目サーバのように変更を加えると、IP Address にその都度同期した NTP サーバを記録していきます。

$ tail /var/log/chrony/tracking.log 
===================================================================================================================================
   Date (UTC) Time     IP Address   St   Freq ppm   Skew ppm     Offset L Co  Offset sd Rem. corr. Root delay Root disp. Max. error
===================================================================================================================================
2019-06-12 15:54:54 0.0.0.0          0      3.936      0.038  0.000e+00 ?  0  0.000e+00 -9.371e-17  1.000e+00  1.000e+00  1.500e+00
2019-06-12 15:54:59 169.254.169.123  4      3.936      0.038 -2.464e-05 N  1  5.865e-07 -4.834e-11  1.760e-03  9.349e-05  1.500e+00
2019-06-12 15:55:01 169.254.169.123  4      3.936      0.044 -7.597e-07 N  1  9.058e-07  6.131e-13  1.760e-03  1.099e-04  1.002e-03
2019-06-12 15:55:18 169.254.169.123  4      3.921      0.157 -1.210e-05 N  1  6.476e-07 -4.059e-11  1.760e-03  1.032e-04  1.017e-03
2019-06-12 15:55:34 169.254.169.123  4      3.919      0.201  8.199e-06 N  1  7.197e-06 -2.603e-09  1.793e-03  1.230e-04  1.025e-03
2019-06-12 15:55:50 169.254.169.123  4      3.886      0.370 -5.611e-06 N  1  4.120e-06 -2.043e-06  1.739e-03  1.387e-04  1.049e-03
2019-06-12 15:56:06 169.254.169.123  4      3.718      0.577 -8.618e-06 N  1  3.556e-06  1.502e-06  1.760e-03  1.272e-04  1.036e-03

5分ずらしてみたら

過去ブログの旧NTPでの実験を真似して2台目サーバにて下記のように5分進ませるコマンドを実行してみました。

$ sudo date -s "`date --date '5 minutes' '+%F %T'`"
Wed Jun 12 17:54:42 UTC 2019

この場合、すぐに時刻が修正されるわけではなくて、(詳しくは後述の参考サイトを確認いただければと思いますが)アプリケーションなどに影響を与えないよう、デフォルトでは少しずつ少しずつ修正されていくんですね。

このように chronyc tracking を時間をおいて行うと、少しずつ「System time」に表示される秒数(NTP サーバの時間との差)が短くなっており、翌日確認したら時間のズレは解消していました。

$ date
Wed Jun 12 18:06:41 UTC 2019

$ chronyc tracking
Reference ID    : 22FE9EB9 (ec2-34-254-158-185.eu-west-1.compute.amazonaws.co)
Stratum         : 5
Ref time (UTC)  : Wed Jun 12 18:02:17 2019
System time     : 247.856796265 seconds fast of NTP time
Last offset     : -0.000029414 seconds
RMS offset      : 186.497573853 seconds
Frequency       : 1.994 ppm fast
Residual freq   : -0.179 ppm
Skew            : 1.091 ppm
Root delay      : 0.002654455 seconds
Root dispersion : 0.000189438 seconds
Update interval : 70.0 seconds
Leap status     : Normal

$ date
Wed Jun 12 18:16:18 UTC 2019

$ chronyc tracking
Reference ID    : 22FE9EB9 (ec2-34-254-158-185.eu-west-1.compute.amazonaws.co)
Stratum         : 5
Ref time (UTC)  : Wed Jun 12 18:12:52 2019
System time     : 198.121749878 seconds fast of NTP time
Last offset     : +0.000000025 seconds
RMS offset      : 116.081893921 seconds
Frequency       : 2.002 ppm fast
Residual freq   : -0.000 ppm
Skew            : 0.067 ppm
Root delay      : 0.002606559 seconds
Root dispersion : 0.000075631 seconds
Update interval : 70.0 seconds
Leap status     : Normal

chrony 設定の参考

以上、どこかの誰かの何らかの役に立ちますよう。Auf Wiedersehen!