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 と同期します。
ただし、これは 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 設定の参考
- Amazon Linux 2はNTPにChronyとAmazon Time Sync Serviceを使う | DevelopersIO
- 新しいNTPクライアント&サーバ、chrony - Qiita
- chrony – Frequently Asked Questions
- 【Linux】Chrony による時刻同期の設定および操作手順【Chronyd】 | 100%レンタルサーバーを使いこなすサイト
以上、どこかの誰かの何らかの役に立ちますよう。Auf Wiedersehen!