症状
Elastic Compute Service (ECS) インスタンスが再起動せずに長期間実行されると、ネットワーク接続の問題が発生することがあります。症状には、完全なネットワーク障害や、インスタンスのパブリック IP アドレスおよびプライベート IP アドレスへの ping の失敗が含まれます。
原因
ECS インスタンスが最初に起動されると、システムは Dynamic Host Configuration Protocol (DHCP) を使用して、伸縮自在なネットワークインターフェースに IP アドレスを自動的に割り当て、リースの有効期間を取得します。通常の状態では、Linux システムの dhclient プロセスと Windows システムの DHCP Client サービスは、DHCP サーバーとの間でこのリースを定期的に更新し、IP アドレスの有効性を維持します。しかし、特定の CentOS 7 イメージから作成されたインスタンスでは、dhclient プロセスが予期せず終了することがあるため、この問題が発生します。さらに、一部の Windows Server オペレーティングシステムの DHCP Client サービスには既知の問題が存在します。その結果、インスタンスは IP アドレスのリースを自動的に更新できなくなります。最初のリースの有効期間が切れると、インスタンスのプライベート IP アドレスが解放され、ネットワーク障害が発生します。
対象範囲
この記事は、以下の基準を満たし、DHCP を使用して伸縮自在なネットワークインターフェースに IP アドレスを自動的に割り当てる ECS インスタンスに適用されます。静的 IP アドレスが設定されているインスタンスでは、操作は不要です。
-
2018 年 5 月 31 日より前に作成され、2018 年 11 月 15 日以降に再起動されていない、以下の CentOS 7 パブリックイメージから作成された任意のタイプのインスタンス。
-
centos_7_04_64_20G_alibase_20180419.vhd
-
centos_7_04_64_20G_alibase_20180326.vhd
-
centos_7_04_64_20G_alibase_20171015.vhd
-
centos_7_03_64_20G_alibase_20170818.vhd
-
centos_7_02_64_20G_alibase_20170818.vhd
-
centos_7_03_64_40G_alibase_20170710.vhd
-
centos_7_03_64_40G_alibase_20170625.vhd
-
centos_7_03_64_40G_alibase_20170523.vhd
-
centos_7_03_64_40G_alibase_20170503.vhd
-
-
2018 年 11 月 15 日より前に作成され、それ以降再起動されていない、以下の Windows Server オペレーティングシステムを実行しているインスタンス。
-
Windows Server 2008 R2
-
Windows Server 2012 R2
-
Windows Server 2016
-
Windows Server Version 1709
-
ソリューション
-
インスタンスやデータの変更など、リスクの高い操作を実行する前に、ディザスタリカバリとフォールトトレランスの対策が講じられていることを確認してください。
-
ECS や RDS などのインスタンスの設定やデータを変更する前に、スナップショットを作成するか、RDS のログバックアップなどの機能を有効にしてください。
-
Alibaba Cloud プラットフォーム上でユーザー名やパスワードなどの機密情報を送信した場合は、すぐに変更してください。
ニーズに応じて、以下の 4 つの方法から 1 つを選択してください。
-
方法 1:Cloud Assistant を使用した一括修正。この方法は複数のインスタンスの管理に適しており、ECS コンソールから簡単に実行できます。
-
方法 2:Python SDK スクリプトを使用した一括修正。この方法はインスタンスの状態をチェックし、リージョン全体で自動修正を実行します。この方法は、スクリプトに精通しているユーザー向けです。
-
方法 3:Shell および PowerShell スクリプトを使用した修正。この方法では、各 ECS インスタンスにログインして手動で修正を適用する必要があります。少数のインスタンスのテストや更新に適しています。スクリプトは方法 1 で使用されるものと同じです。
-
方法 4:ネットワークインターフェイスカードの手動チェック。この方法は、少数のインスタンスに適しています。
方法 1:Cloud Assistant を使用した一括修正
この例では、Cloud Assistant を使用して ECS インスタンスをチェックし、自動的に修復します。インスタンスに Cloud Assistant Agent がインストールされていることを確認してください。Cloud Assistant Agent は、2017 年 12 月 1 日以降に作成された ECS インスタンスにはデフォルトでインストールされています。詳細については、Cloud Assistant Agent および「Cloud Assistant Agentのインストール」をご参照ください。
-
適切な Shell または PowerShell スクリプトをダウンロードし、その内容を ECS コンソールの [コマンド内容] フィールドに貼り付けます。
-
CentOS インスタンス:linux_fix_dhclient.sh
-
Windows インスタンス:win_fix_dhclient.ps1
-
-
対象の ECS インスタンスを選択し、コマンドを実行します。詳細な手順については、「コマンドの実行」をご参照ください。
-
コマンドが正常に実行されたことを確認します。詳細な手順については、「コマンドの実行結果とステータスの表示」をご参照ください。以下の例は、CentOS と Windows インスタンスのコマンド出力を示しています。
[INFO] [2019-04-28 11:13:00] start check and fix [INFO] [2019-04-28 11:13:00] log file /tmp/dhcp_fix_20190428-11:13:00.log [INFO] [2019-04-28 11:13:00] start checking eth0 [INFO] [2019-04-28 11:13:00] eth0 state is up [INFO] [2019-04-28 11:13:00] ip a show dev eth0 [INFO] [2019-04-28 11:13:00] eth0 valid_lft 315359644 [INFO] [2019-04-28 11:13:00] no need fix, dhclient eth0 is running [1;32;40m[SUCCESS] [0m [2019-04-28 11:13:00] check and fix success [1;32;40m[SUCCESS] [0m [2019-04-28 11:13:00] return code: 0 [1;33;40m[WARN] [0m [2019-04-28 11:14:17] need fixing eth0 [INFO] [2019-04-28 11:14:17] start fixing eth0 [INFO] [2019-04-28 11:14:17] ip a show dev eth0 [INFO] [2019-04-28 11:14:17] ifup eth0 RTNETLINK answers: File exists [INFO] [2019-04-28 11:14:19] ip a show dev eth0 [INFO] [2019-04-28 11:14:19] ok, dhclient eth0 is running now [1;32;40m[SUCCESS] [0m [2019-04-28 11:14:19] check and fix success [1;32;40m[SUCCESS] [0m [2019-04-28 11:14:19] return code: 0 No ip will expire in recent 500 days. Then no need fix. Nic info: \\E2ETesthxxx...xxxterConfiguration.Index=3 Found one ip will expire in 500 days. We need fixing it!!! Fix it now... Nic info: \\E2ETesthxxx...xxxpterConfiguration.Index=3 fix success. ]]]]]]]]]]
方法 2:Python SDK スクリプトを使用した一括修正
この方法では、Cloud Assistant API に基づく Python スクリプトを使用して、Alibaba Cloud リージョン内のすべての影響を受けるインスタンスをチェックし、自動的に修正します。ECS SDK のインストール手順については、Alibaba CloudのGitHubリポジトリにあるインストールガイドをご参照ください。
前提条件
次のコマンドを実行して、ローカルマシンまたは ECS インスタンスに Python SDK の必要な依存関係をインストールします。
pip install alibabacloud_ecs20140526
手順
-
autofix_dhclient.py ファイルを ECS インスタンスにダウンロードします。
-
次のコマンドでスクリプトを実行します。
sudo python autofix_dhclient.py <AccessKeyID> <AccessKeySecret> <region-id>説明コマンド内の
<AccessKeyID>、<AccessKeySecret>、および<region-id>を置き換える必要があります。-
AccessKey ID:Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ID。
-
AccessKey Secret:Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey Secret。
-
リージョン ID:インスタンスが所在するリージョンの ID。リージョン ID のリストについては、「リージョンとゾーン」をご参照ください。
-
結果
以下にスクリプトの出力例を示します。
Performing the scan and this will take some time, please wait...
Scan done.
Instance Status details:
+----------------------------+----------------+---------------+---------------+
| InstanceID | Cloud Assistant| NeedFix | FixResult |
+----------------------------+----------------+---------------+---------------+
| i-uf639pxxxye4ldb | Installed | No | NoChange |
+----------------------------+----------------+---------------+---------------+
| i-uf69mdxxxk6sahw | Installed | Yes | Success |
+----------------------------+----------------+---------------+---------------+
Summary:
================================
Total instances scanned: 2
Fixed: 1
Unknown: 0
Failed: 0
出力フィールドの説明は次のとおりです:
-
Cloud Assistant:このチェックは、Cloud Assistant Agent がインスタンスにインストールされているかどうかを確認します。
-
Installed:Cloud Assistant Agent はインストールされています。
-
Not Installed:Cloud Assistant Agent がインストールされていません。「Cloud Assistant Agentのインストール」を参照してエージェントをインストールしてから、スクリプトを再度実行してください。
-
-
NeedFix:このチェックは、
dhclientプロセスまたは DHCP Client サービスに修正が必要かどうかを確認します。-
Yes:修正が必要です。スクリプトが自動的にタスクを完了します。
-
No:修正は不要です。
-
Unknown:スクリプトがステータスを判断できませんでした。手動でチェックを実行する必要があります。
-
-
FixResult:このフィールドは修正の結果を示します。
-
Success:
dhclientプロセスまたは DHCP Client サービスは正常に修正されました。 -
Failed:修正に失敗しました。
-
NoChange:修正は不要でした。
-
Unknown:スクリプトが結果を判断できませんでした。手動でチェックを実行する必要があります。
-
方法 3:Shell または PowerShell スクリプトを使用した修正
この方法では、影響を受ける各インスタンスにログインし、スクリプトを手動で実行する必要があります。少数のインスタンスに適しています。
CentOS インスタンスの手順
-
ECS インスタンスにログインします。詳細については、「接続方法」をご参照ください。
-
linux_fix_dhclient.sh スクリプトを任意のディレクトリにダウンロードします。
-
スクリプトがあるディレクトリに移動し、root ユーザーとしてスクリプトを実行します。
sudo bash linux_fix_dhclient.sh説明-
リターンコードが「0」の場合は、スクリプトがチェックと修正を正常に完了したことを示します。
-
その他のリターンコードは、修正が失敗したことを示します。
-
Windows インスタンスの手順
-
ECS インスタンスにログインします。詳細については、「接続方法」をご参照ください。
-
win_fix_dhclient.ps1 スクリプトを任意のディレクトリにダウンロードします。
-
管理者権限で PowerShell を開き、次のコマンドを実行します。
powershell -executionpolicy bypass -file C:\win_fix_dhclient.ps1説明注:
-
C:\win_fix_dhclient.ps1を実際のファイルパスに置き換える必要があります。 -
「No ip will expire in recent 500 days. Then no need fix.」という出力は、DHCP Client サービスが正常に実行されており、修正が不要であることを示します。
-
「Found one ip will expire in 500 days. We need fixing it!!! Fix it now... Fix success.」という出力は、DHCP Client サービスが正しく実行されておらず、スクリプトによって問題が修正されたことを示します。
-
その他の出力は、修正が失敗したことを示します。
-
方法 4:ネットワークインターフェイスカードの手動チェック
この方法では、各ネットワークインターフェイスカードについて dhclient プロセス (CentOS インスタンスの場合) または IP アドレスのリースの有効期間 (Windows インスタンスの場合) を手動で確認し、修正する必要があります。
CentOS インスタンスの手順
-
ECS インスタンスにログインします。詳細については、「接続方法」をご参照ください。
-
次のコマンドを実行して、インスタンス上のすべてのネットワークインターフェイスカードを確認します。
ls -al /sys/class/net/ -
次のコマンドを実行して、eth0 ネットワークインターフェイスカードが DHCP を使用して IP アドレスを取得しているかどうかを確認します。
cat /etc/sysconfig/network-scripts/ifcfg-eth0次のような出力が表示されます。
BOOTPROTO=dhcpは、ネットワークインターフェイスカードが DHCP を使用して IP アドレスを割り当てることを示します。DHCP を使用して IP アドレスが割り当てられない場合は、ステップ 7 に進んでください。[root@xxx ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes [root@xxx ~]# grep 'BOOTPROTO=dhcp' /etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTO=dhcp -
次のコマンドを実行して、eth0 ネットワークインターフェイスカードの
dhclientプロセスのステータスを確認します。ps aux | grep dhclient | grep eth0-
出力が空の場合は、
dhclientプロセスが正しく実行されていないことを示します。 -
出力が次のような場合、プロセスは正常に実行されています。この場合は、手順7に進みます。
root 15340 0.0 0.3 113372 12788 ? Ss 14:16 0:00 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient--eth0.lease -pf /var/run/dhclient-eth0.pid -H izuf****************** eth0
-
-
次のコマンドを実行して、
dhclientプロセスを再起動します。ifup eth0説明この例ではeth0を使用しています。
eth0を実際のネットワークインターフェイスカードの識別子に置き換えてください。 -
dhclientプロセスのステータスを再度確認し、実行中であることを確認します。 -
手順3〜6を繰り返して、残りのすべてのネットワークインターフェイスカードの
dhclientプロセスを確認し、修正します。
Windows インスタンスの手順
-
ECS インスタンスにログインします。詳細については、「接続方法」をご参照ください。
-
管理者としてコマンド プロンプト (CMD) を開きます。
-
次のコマンドを実行して、[Red Hat VirtIO Ethernet Adaptor] と表示されているネットワークインターフェイスカードの [DHCP Enabled] が [Yes] に設定されているかどうかを確認し、その [Lease Expires] 時刻を表示します。
ipconfig /all説明Red Hat VirtIO Ethernet Adaptor は、ECS インスタンスのプライマリネットワークインターフェイスカードまたはセカンダリの伸縮自在なネットワークインターフェースとして機能します。VPN やループバックアダプターなどのカスタム設定は影響を受けません。DHCP サービスが有効になっていないネットワークインターフェイスカードも影響を受けません。
-
リースが 1 年以内に失効する場合は、次のコマンドを実行して更新します。
ipconfig /renew -
ipconfig /allコマンドを実行します。リース有効期限が 10 年以内であれば、修正が完了したことを示します。
適用対象
-
ECS