問題の説明
Alibaba Cloud Elastic Compute Service (ECS) インスタンスを再起動せずに長時間使用すると、ネットワークの問題が発生する可能性があります。インスタンスがネットワークから切断され、パブリックまたはプライベート IP アドレスに ping を実行できなくなる場合があります。
原因
ECS インスタンスが最初に起動すると、システムは動的ホスト構成プロトコル (DHCP) を使用して Elastic Network Interface (ENI) に IP アドレスを自動的に割り当て、有効期限付きのリースを取得します。通常の状態では、Linux の dhclient プロセスと Windows の DHCP クライアントサービスは、DHCP サーバーで定期的にリースを更新し、IP アドレスが引き続き利用可能であることを保証します。しかし、一部の CentOS 7 イメージ (「範囲」セクションを参照) から作成されたインスタンスでは、dhclient プロセスが予期せず終了することがあります。Windows Server の DHCP クライアントサービスにも既知の問題があります。その結果、インスタンスは IP アドレスのリースを自動的に更新できなくなります。リースが期限切れになると、インスタンスのプライベート IP アドレスが解放され、ネットワーク接続の障害が発生します。
範囲
この問題は、次の条件を満たし、DHCP を使用して ENI に IP アドレスを自動的に割り当てる ECS インスタンスに影響します。このトピックの手順に従って問題を修正できます。ECS インスタンスが静的 IP アドレスを使用している場合は、何も操作する必要はありません。
2018 年 5 月 31 日より前に次の CentOS 7 パブリックイメージから作成され、2018 年 11 月 15 日以降に再起動されていないインスタンス。
centos_7_04_64_20G_alibase_20180419.vhd
centos_7_04_64_20G_alibase_20180326.vhd
centos_7_04_64_20G_alibase_201701015.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
次の Windows Server オペレーティングシステムを実行し、2018 年 11 月 15 日より前に作成され、それ以降再起動されていないインスタンス。
Windows Server 2008 R2
Windows Server 2012 R2
Windows Server 2016
Windows Server Version 1709
解決策
インスタンスまたはそのデータの変更など、リスクの高い操作を実行する前に、インスタンスにディザスタリカバリおよびフォールトトレランス機能があることを確認して、データを保護してください。
ECS や ApsaraDB RDS インスタンスなどのインスタンスの構成やデータを変更する前に、スナップショットを作成するか、RDS のログバックアップなどの機能を有効にしてください。
Alibaba Cloud プラットフォームで権限を付与したり、ログイン資格情報などのセキュリティ情報を送信したりした場合は、速やかに変更してください。
要件に基づいて、このトピックの 4 つの解決策のいずれかを選択してください。
方法 1: クラウドアシスタントによる一括修正。この方法は簡単で、ECS コンソールから複数のインスタンスを修正するのに適しています。
方法 2: Python SDK スクリプト。この方法では、クラウドアシスタント API に基づく Python スクリプトを使用します。リージョン内のインスタンスのステータスを確認し、自動的に修正します。この方法は、スクリプトベースの操作とメンテナンスに精通しているユーザー向けです。
方法 3: Shell および PowerShell スクリプト。この方法では、各 ECS インスタンスにログインし、スクリプトを実行して手動で問題を修正する必要があります。少数のインスタンスでのポーリングやテストに適しています。スクリプトの内容は、方法 1 で使用したものと同じです。
方法 4: ENI を 1 つずつトラブルシューティングする。この方法は、少数のインスタンスに適しています。
方法 1: クラウドアシスタントによる一括修正
この例では、クラウドアシスタントを使用して ECS インスタンスを確認し、自動的に修復する方法を示します。インスタンスに クラウドアシスタントエージェント がインストールされていることを確認してください。クラウドアシスタントエージェント は、2017 年 12 月 1 日以降に作成された ECS インスタンスにデフォルトでプリインストール済みです。クラウドアシスタントエージェント の詳細については、「クラウドアシスタントエージェントのインストール」をご参照ください。
適切な Shell または PowerShell スクリプトをダウンロードし、クラウドアシスタントの [コマンド内容] フィールドに貼り付けます。
CentOS インスタンス: linux_fix_dhclient.sh
Windows インスタンス: win_fix_dhclient.ps1
ターゲット ECS インスタンスを選択し、コマンドを実行します。詳細については、「コマンドの実行」をご参照ください。
コマンドが正常に実行されたことを確認します。詳細については、「実行結果とステータスの表示」をご参照ください。次の図は、CentOS および Windows インスタンスのコマンド出力を示しています。

方法 2: Python SDK スクリプトによる一括修正
この方法では、クラウドアシスタント API に基づく Python スクリプトを使用します。このスクリプトは、Alibaba Cloud リージョン内の影響を受けるすべてのインスタンスをチェックし、自動的に修正します。ECS SDK のインストール方法の詳細については、「Alibaba Cloud GitHub リポジトリのインストールに関するドキュメント」をご参照ください。
準備
次のコマンドを実行して、必要な Python SDK の依存関係をローカルコンピューターまたは ECS インスタンスにダウンロードします。
pip install alibabacloud_ecs20140526手順
autofix_dhclient.py ファイルを ECS インスタンスにダウンロードします。
次のコマンドを実行してスクリプトを実行します。
sudo python autofix_dhclient.py <AccessKeyID> <AccessKeySecret> <region-id>説明コマンド内の
<AccessKeyID>、<AccessKeySecret>、および<region-id>を実際の値に置き換えてください。AccessKeyID: Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ID。
AccessKeySecret: Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey Secret。
region-id: インスタンスが配置されているリージョンの ID。リージョン ID のリストについては、「リージョンとゾーン」をご参照ください。
実行結果
次の図は、スクリプトのサンプル出力を示しています。
次の一覧は、インスタンスのステータスチェックについて説明しています。
Cloud Assistant: インスタンスに クラウドアシスタントエージェント がインストールされているかどうかを確認します。
Installed: クラウドアシスタントエージェント はインストールされています。
Not Installed: クラウドアシスタントエージェント が見つかりません。クラウドアシスタントエージェントをインストールしてから、修正を続行する必要があります。
NeedFix: dhclient プロセスまたは DHCP クライアントサービスを修正する必要があるかどうかを確認します。
Yes: 修正が必要です。スクリプトは後続の操作を自動的に完了します。
No: 修正は不要です。
Unknown: スクリプトは修正が必要かどうかを判断できません。手動で修正を実行する必要があります。
FixResult: 修正の結果を報告します。
Success: dhclient プロセスまたは DHCP クライアントサービスは正常に修正されました。
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 クライアントサービスは正常であり、修正は不要です。
出力が「Found one ip will expire in 500 days. We need fixing it!!! Fix it now... Fix success.」の場合、インスタンスの DHCP クライアントサービスは異常であり、スクリプトによって修正されました。
その他の出力は、修正が失敗したことを示します。
方法 4: ENI を 1 つずつトラブルシューティングする
この方法では、ENI ごとに dhclient プロセス (CentOS インスタンスの場合) または IP アドレスのリース有効期限 (Windows インスタンスの場合) を確認して修正する必要があります。
CentOS インスタンスの手順
ECS インスタンスにログインします。詳細については、「接続方法の概要」をご参照ください。
次のコマンドを実行して、インスタンス上のすべての ENI を確認します。
ls -al /sys/class/net/次のコマンドを実行して、eth0 ENI が DHCP を使用して IP アドレスを取得するかどうかを確認します。
cat /etc/sysconfig/network-scripts/ifcfg-eth0出力に
BOOTPROTO=dhcpが含まれている場合、ENI は DHCP を使用します。それ以外の場合は、ステップ 7 に進みます。
次のコマンドを実行して、eth0 ENI の dhclient プロセスのステータスを確認できます。
ps aux | grep dhclient | grep eth0出力が空の場合、dhclient プロセスは異常です。
出力が次のようになっている場合、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 ENI を使用しています。eth0 を実際の ENI の識別子に置き換えてください。
ENI の dhclient プロセスのステータスを再度確認します。
ステップ 3 から 6 を繰り返して、他のすべての ENI の dhclient プロセスを確認および修正します。
Windows インスタンスの手順
ECS インスタンスにログインします。詳細については、「接続方法の概要」をご参照ください。
管理者としてコマンドプロンプトを開きます。
次のコマンドを実行します。Red Hat VirtIO Ethernet Adaptor と記述されている各ネットワークアダプターについて、DHCP Enabled が Yes に設定されているかどうかを確認し、その Lease Expires の時刻をメモします。
ipconfig /all説明ECS インスタンスのプライマリおよびセカンダリ ENI は、Red Hat VirtIO Ethernet Adaptor として記述されます。VPN やループバック NIC などのカスタム構成のネットワークインターフェイスカード (NIC)、および DHCP が有効になっていない NIC は影響を受けません。
リースが 1 年以内に期限切れになる場合は、次のコマンドを実行してリースを更新します。
ipconfig /renewipconfig /allコマンドを再度実行します。新しいリースの有効期限が数年後であれば、修正は成功です。
適用対象
ECS