このトピックでは、無効な IP アドレスによって発生する、インスタンスのアクセス障害を処理する方法について説明します。ここで提供されている情報は、CentOS 7 および Windows Server イメージを使用して作成された ECS インスタンスに適用されます。
現象
ECS インスタンスが、再起動せずに一定期間実行された後、その IP アドレスが ping できない
原因
ECS インスタンスが初めて起動されると、システムは動的ホスト構成プロトコル (DHCP) を使用して、自動的に IP アドレスを ENI に割り当て、DHCP サーバーからこの IP アドレスのリース期間を取得します。実行中、Linux の dhclient プロセス、および Windows の DHCP クライアントは、定期的にこのリース期間を延長します。
ただし、CentOS 7 のインスタンスによっては、誤って dhclient プロセスがクリーンアップされたり、DHCP クライアントで既知の問題が発生したりすることがあります。これは、リース期間を延長できなくなることを意味します。その結果、リース期間が経過すると、プライベートネットワークの IP アドレスがリリースされ、ネットワークにアクセスできなくなります。 CentOS 7 インスタンスの詳細については、「適用範囲」 をご参照ください。
適用範囲
このトピックの内容は、以下の条件を満たす ECS インスタンスにのみ適用されます。
- 2018 年 5 月 31 日以前に作成され、2018年 11 月 15 日以降再起動されていない ECS インスタンス上の CentOS 7 パブリックイメージ
- 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
- 2018 年 11 月 15 日以前に作成され、それ以降再起動されていない ECS インスタンス上の Windows Server イメージ
- Windows Server 2008 R2
- Windows Server 2012 R2
- Windows Server 2016
- Windows Server Version 1709
解決策
この問題を解決するには、要件に合わせて、以下のいずれかの解決策を使用してください。
- 解決策 1: クラウドアシスタントクライアントを使用する (バッチ操作) 。
- 解決策 2: Python SDK スクリプトを実行する (バッチ操作) 。
- 解決策 3: Shell または PowerShell スクリプトを実行する。
- 解決策 4: ENI を個別に確認する (CentOS インスタンスが少数の場合)。
解決策 1:クラウドアシスタントクライアントを使用する
この解決策では、クラウドアシスタントクライアントを使用して ECS インスタンスを自動的に確認し、修復します。クラウドアシスタントクライアントが、ECS インスタンスにインストールされていることを確認してください。クラウドアシスタントクライアントは、2017 年 12 月 1 日以降に作成された ECS インスタンスには、プリインストールされています。詳細については、「クラウドアシスタントクライアント」 をご参照ください。
- ECS コンソールのクラウドアシスタントページにログインします。
- 対象リージョンを選択します。
- [スクリプトの作成] をクリックします。詳細については、「コマンドの作成」 をご参照ください。
- 次の Shell または PowerShell スクリプトをダウンロードして、[スクリプト] フィールドに貼り付けます。
- CentOSインスタンスの場合 (Shell):linux_fix_dhclient.sh
- Windowsインスタンス (PowerShell) の場合:win_fix_dhclient.ps1
- 作成したコマンドを見つけて、[操作] 列の [タスクの作成] をクリックします。次に、影響を受ける ECS インスタンスを選択し、そのインスタンスに対してコマンドをバッチで実行します。詳しくは 「コマンドの実行」 をご参照ください。
- [ステータス] が [タスク完了] に変わったら、[タスク管理] ペインの [操作] 列にある、[結果の表示] をクリックします。詳細については、「実行結果とステータスの照会」 をご参照ください。
次の図は、CentOS インスタンスと Windows インスタンスのコマンド結果を示しています。
解決策 2:Python SDK スクリプトを実行する
この解決策では、Python スクリプトはクラウドアシスタント API に基づいて開発されており、Alibaba Cloud リージョン内の影響を受けるすべてのインスタンスを自動的にチェックして修復します。ECS SDK のインストール方法については、「Alibaba Cloud Github repositories」 をご参照ください。
準備
次の Python SDK の依存関係をローカルコンピューター、または ECS インスタンスにダウンロードします。
pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-ecs
操作手順
- autofix_dhclient.py をローカルコンピューター、または ECS インスタンスにダウンロードします。
- (オプション) スクリプトの使用方法を見るために
python autofix_dhclient.py
コマンドを実行します。# python autofix_dhclient.py
Usage: autofix_dhclient.py <AccessKeyID> <AccessKeySecret> <region-id>
パラメーターの説明:AccessKeyID
: ご使用の AccessKeyId。値の範囲については、「AccessKey の作成」 をご参照ください。AccessKeySecret
: ご使用の AccessKeySecret。region-id
: インスタンスが属するリージョンの ID。値の範囲については、「リージョンとゾーン」 をご参照ください。
- 指示に従って
AccessKeyID
、AccessKeySecret
およびregion-id
を設定してから、root ユーザーまたは管理者としてスクリプトを実行します。例:# python autofix_dhclient.py LTAIn*******Py6J kXXIOEoPXXvsYRUd**********TRyU cn-hangzhou
コマンド結果
次の図は、コマンドの結果を示しています。
インスタンスのステータスチェック項目は次のとおりです。
Cloud Assistant
: クラウドアシスタントクライアントが、インスタンスにインストールされているかどうかをチェックします。Installed
: クラウドアシスタントクライアントはインストールされています。Not Installed
: クラウドアシスタントクライアントはインストールされていません。クラウドアシスタントクライアントを設定して、修復を続行してください。
NeedFix
: dhclient プロセスまたは DHCP クライアントサービスを修復する必要があるかどうかをチェックします。Yes
: 修復が必要です。スクリプトによって自動的に完了します。No
: 修理は必要ありません。Unknown
: 修復が必要かどうかを判断できません。手動でスクリプトを実行する必要があります。
FixResult
: 修復結果を報告します。Success
: dhclient プロセスまたは DHCP クライアントサービスは修復されました。Failed
: 修復に失敗しました。NoChange
: 修理は不要です。Unknown
: 修復が必要かどうかを判断できません。手動でスクリプトを実行する必要があります。
解決策 3:Shell または PowerShell スクリプトを実行する
この解決策では、影響を受けるインスタンスに接続する必要があります。インスタンス数が少ない場合に適したシナリオです。
CentOS インスタンスの手順
- インスタンスに接続します。インスタンスへの接続方法については、「インスタンス接続の概要」 をご参照ください。
- 修復スクリプト linux_fix_dhclient.sh をローカルディレクトリにダウンロードします。
- スクリプトが格納されている作業ディレクトリに移動し、root ユーザーとしてスクリプトを実行します。
sudo bash linux_fix_dhclient.sh
return code: 0
が返された場合は、修復は成功しており、次の手順をスキップできます。- 他のメッセージが返された場合は、引き続き異常なプロセスを修復してください。
Windows インスタンスの手順
- インスタンスに接続します。インスタンスへの接続方法については、「インスタンス接続の概要」 をご参照ください。
- 修復スクリプト 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.
が返された場合、dhclient プロセスは正常で、修復は不要です。Found one ip will expire in 500 days. We need fixing it!!! Fix it now... Fix success.
が返された場合、dhclient プロセスに異常があり、異常なプロセスが修復されます。- 他のメッセージが返された場合、修復は失敗します。
解決策 4:ENI を個別に確認する
この方法では、各NICに対応するdhclientプロセス(CentOSインスタンス)またはIPアドレスのリース期限(Windowsインスタンス)を確認して修復する必要があります。
CentOS インスタンスの手順
- インスタンスに接続します。
- インスタンスのすべての ENI をチェックするために、
ls -al /sys/class/net/
コマンドを実行します。 cat /etc/sysconfig/network-scripts/ifcfg-eth0
コマンドを実行し、eth0 が DHCP によって割り当てられた IP アドレスを使用しているかどうかを確認します。- BOOTPROTO=dhcp は、eth0 が DHCP によって割り当てられた IP アドレスを使用していることを示しています。
- DHCP によって IP アドレスを割り当てない場合は、手順 7 へ進んでください。
- BOOTPROTO=dhcp は、eth0 が DHCP によって割り当てられた IP アドレスを使用していることを示しています。
ps aux | grep dhclient | grep eth0
コマンドを実行し、eth0 に対応する dhclient プロセスの実行状態を確認します。ifup eth0
コマンドを実行し、dhclient プロセスを再起動します。- eth0 に対応する dhclient プロセスの実行状態を確認します。
- 必要に応じて手順 3〜6 を繰り返し、その他の ENI の dhclient プロセスを確認して修復します。 注意: コマンドの eth0 を実際の ENI の ID に置き換える必要があります。
Windows インスタンスの手順
- インスタンスに接続します。
- 管理者としてコマンドプロンプト(CMD)を開きます。
- 次のコマンドを実行して、Red Hat VirtIO Ethernet Adapterと表示されているNICのDHCP有効項目がYesであるかどうか、またリース期限が切れるかどうかを確認します。
ipconfig /all
注意:Red Hat VirtIO Ethernet Adapterは、ECSインスタンスのプライマリNICおよびセカンダリエラスティックNICです。カスタム構成のVPNまたはLoopBack NICは影響を受けません。さらに、DHCPサービスが有効になっていないNICは影響を受けません。 - 1年以内にリースが期限切れになる場合は、次のコマンドを実行しリースの有効期限を更新します。
ipconfig /renew
その後、ipconfig / allコマンドを実行して、リースの有効期限が10年以内の日時に更新されましたら修正は完了です。
お問い合わせ
修復に失敗する場合は、チケットを起票し、サポートセンターへお問い合わせください。