0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AWS Wavelength上にNTPサーバー(chrony)を立てる

Last updated at Posted at 2022-01-31

AWS Wavelength zone内のサブネット上に、chronyを使ったNTPサーバーを立ててみました。

AWS Wavelengthとは

AWS Wavelengthとは、簡潔に表現すると、EC2を利用したコンピューティング環境をモバイルキャリア網(日本ではKDDI)に直結する形で構築することができるサービスとなります。

ヒント
WavelengthゾーンにEC2のインスタンスを立てる場合ですが、インスタンス・タイプなど、いろいろな限定がありますので、東京リージョンとすべて同じというわけではありません。

下の図で説明しますと、AWS Wavelength Zoneは、キャリアネットワーク(日本ではKDDI)の雲の一部に設置されるようなイメージになります。実際のAWS Wavelength Zone(東京)の物理的な場所は、KDDIのネットワークセンター内になりますので、ちょうど、キャリアネットワークの中にAWSの出張所がある感じですね!

Wavelength.jpeg

Wavelengthゾーンにサーバーを立てるとどうなるか?

WavelengthゾーンにWindows Serverを立てて、そのWindows Serverへリモートデスクトップで接続してみますと、そのデスクトップ上でブラウザを使ってGoogle、Yahooなどの通常のWebサービスにアクセスすることができます。

ただし、その逆については制限があり、例えば、PCからWavelengthゾーン上のWebサーバーへアクセスしようとするケースでは、そのPCがauまたはUQのSIMを使って通信を行っている場合のみ可能となります。(au/UQのスマホによるテザリング、または、au/UQのSIMを使っているモバイルルーターなど。もちろん、au/UQのSIMを使っているスマホのブラウザでアクセスすることも可能です。)

また、次に出てきますが、Wavelengthゾーン上のサーバーとインターネット上のサーバーがUDPを使って通信をする場合、仕様上、Carrier Gateway(AWS WavelengthとKDDIモバイル網の接続ポイントにあるルーター)がパケットを通さないので、通信できません。

問題点

AWS Wavelength zone内に普通にEC2インスタンスを立ててchronyをインストールしても、WavelengthはUDPを通さないので、外部のNTPサーバーにアクセスして時間情報を取得することができません。

補足
下記のAWSのマニュアルにある通り、Wavelength上のEC2インスタンスとKDDIのモバイルネットワークを利用している端末はUDPで通信できるのですが、外部のNTPサーバーがauで通信しているわけがない(当然固定回線ですね!)ので、結局、このケースでは「通信できない」となります。

下記は、AWS Wavelengthのマニュアルからの抜粋です。

NetworkingConsiderations.png

解決策

仕方がないので、下記の2つの方法を試してみることとしました。

1. 同じVPC内の東京リージョン側に同様のNTPサーバーを立てて、それを参照する
2. Amazon Time Sync Serviceを利用する

それでは、下記の構成図のような形で設定していきます。

NTPServersInAWS6.jpg

東京リージョン(Public Subnet)のinstanceへchronyをインストール

Ctrl+Alt+Tでターミナルを開いて、コマンドでchronyをインストールします。

sudo apt install chrony

次に、/etc/chrony/chrony.confをエディターで開いて、chronyのコンフィグファイルを編集します。

sudo nano /etc/chrony/chrony.conf

そうすると下記のような画面が開きますので、デフォルトで入っているサーバーを消して、下記の画面のような感じで、サーバーを追加しましょう。

Chrony-Ubuntu-PublicSubnet-Settings.jpg

ちなみに、169.254.169.123は、Amazon Time Sync Serviceのアドレス、ntp.nict.jpは情報通信研究機構が運営する時刻サーバーのドメインとなります。(それ以外は適当に選びました。)

また、最後の行にWavelength上のサーバー(10.50.50.234)で稼働しているchronyから参照できるように、下記のような設定を1行追加します。

allow 10.50.50.234

もし、複数のサーバーからのアクセスを許可したい場合は、複数の行にして、それぞれ記入するか、または、CIDRフォーマット(例えば、10.50.50.0/24)で記述します。

allow 10.50.50.0/24

ここで一度、chronyサービスをリスタートしましょう。

sudo systemctl restart chrony.service

chronyを有効にするためのサーバーの設定変更

さらに、上記のallow 10.50.50.234の設定はあくまでもchronyの話なので、サーバーのセキュリティグループも同時に設定変更する必要があります。

Wavelength側のchrony(10.50.50.234) => 東京リージョン側のchrony(10.50.10.252)という形のアクセスになりますので、東京リージョン側のEC2インスタンスにおけるセキュリティグループのインバウンドルールの設定において、すべてのトラフィック(all traffic, all protocol)について10.50.50.234を許可しましょう。

EC2 > セキュリティグループの設定 > 該当するセキュリティグループにおいて、インバウンドルールを編集します。

ルールを1行追加して、typeでall trafficを選択、Sourceは10.50.50.234を入力

Wavelength Subnet上のinstanceへchronyをインストール

Wavelength上のインスタンスに接続するためには、通常は、踏み台サーバー(Jump Box)を立てて、それを経由してアクセスします。Jump Boxを使った接続方法については、Public Subnet上にあるJump BoxからPrivate Subnet上にあるサーバーにアクセスする方法と全く同じですので、その部分については省略させていただきます。

ちなみに、auの携帯を持っている方であれば、Jump Boxなしで、au携帯のテザリングで直接接続することもできます。
その場合、Internet Gatewayは通らず、Wavelength側のCarrier Gatewayを通ってサーバーにアクセスする形となりますが、Wavelength上のサーバーのセキュリティグループを編集して、RDPでauが使っているIPアドレスレンジを受け付ける設定を入れましょう。

サーバーに接続できたら、先ほどと同様に、chronyをインストールしましょう。

sudo apt install chrony

次に、/etc/chrony/chrony.confをエディターで開いて、chronyのコンフィグファイルを編集します。

sudo nano /etc/chrony/chrony.conf

そうすると、また下記のような画面が開きますので、デフォルトで入っているサーバーを消して、こちらも下記の画面のような感じで、サーバーを追加しましょう。

169.254.169.123はAmazon Time Sync ServiceのIPアドレス、10.50.10.252は、東京リージョン側のchronyが稼働しているサーバーのアドレスとなります。

この10.50.10.252を入れることで、chronyが自動的に東京リージョン側のchrony(NTPサーバー)へアクセスするようになります!

Chrony-Ubuntu-Wavelength-Settings.jpg

設定が終わりましたので、一度、chronyサービスをリスタートしましょう。

sudo systemctl restart chrony.service

chronyが稼働しているかどうか、サービスのステータスを見てみましょう。

sudo systemctl status chrony

Chrony-Ubuntu-Wavelength-Systemctl.jpg

東京リージョン側のchrony(NTP Server)の稼働状況を確認

chronyc sourcesコマンドによって、情報ソース毎の状況を確認できます。-vをつけると、説明が付きます。

上から6番目の星印が付いているサーバーが現在同期しているサーバーであり、調整されたオフセットが百万分の98秒であると表示しています。

Stratumは、時間ソースサーバーを階層化していて、Startum 0が原子時計に直結している時間サーバー、Stratum 1はStratum 0の時間サーバーに同期していて、Stratum 0の次に正確な時間を供給するサーバーとなります。

chronyc sources -v

Chrony-Ubuntu-PublicSubnet-Sources.jpg

chronyc sourcestatsは、chronyc sourcesによって表示されない詳細な統計情報を表示するコマンドです。

chronyc sourcestats -v

Chrony-Ubuntu-PublicSubnet-Sourcestats.jpg

また、chronyc trackingコマンドによって、現時点でのトラッキング情報(選択している時間サーバーをベースとした時間情報の追跡状況)を表示します。

こちらで表示している内容では、システムタイムがNTPタイムに対して百万分の6.77秒遅れていると言っています。

chronyc tracking

Chrony-Ubuntu-PublicSubnet-Tracking.jpg

さらに、chronyc clientsコマンドによって、このサーバー(東京リージョン側のchrony)へアクセスしているクライアントの情報が得られます。
ip-10-50-50-234.ap-north...は、Wavelength側のサーバー(10.50.50.234)のDNSネームになりますので、このサーバー(10.50.10.252)へアクセスしていることがわかります!

chronyc clients

Chrony-Ubuntu-PublicSubnet-Clients.jpg

Wavelength側のchronyの稼働状況を確認

利用するコマンドは同じですが、下記のようなステータスが確認できます。
時間ソースがAmazon Time Sync Serviceと東京リージョンに建てたNTPサーバー(chrony)の2つとなります。
いずれの調整後のオフセット値も1ミリ秒以下の数値(百万分の884など)となっており、悪くないのでは?!と思っていますが、いかがでしょうか。。

chronyc sources -v

Chrony-Ubuntu-Wavelength-Sources.jpg

chronyc sourcestats -v

Chrony-Ubuntu-Wavelength-SourceStats.jpg

トラッキング情報を見ると、System timeのところで、NTPタイムと比較して百万分の154秒(1万分の1.54秒)早いとのこと。

chronyc tracking

Chrony-Ubuntu-Wavelength-Tracking.jpg

Amazon Time Sync Serviceについて

こうしてみると、Linux系、FreeBSD系、MacOSであれば、すべてchronyをインストールできるので、AWSの内部では、片っ端からchronyを入れて、単に、configファイルに、下記のサーバーの記述を入れてしまえば、まあまあの精度が得られるということでしょうか。
※ ただし、この記事では、Amazon Time Sync Serviceに固定されてしまっては面白くないので、下記のサーバーの記述からpreferは外しています。

server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4

参考情報

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?