Amazon EC2 Windows をトラブルから復旧してみる

AWS

2022.9.22

Topics

はじめに

こんにちは。今回は EC2 Windows にトラブルが起こった際に、EC2Rescue を用いて復旧する方法についてご紹介します。Windows ファイアウォールに誤ったルールを設定してしまい、インスタンスにリモートデスクトップ接続できなくなったというシナリオです。
単純に復旧するだけならバックアップからのリストアの方が早く済む場合が多いですが、どうしても作業途中や処理中のデータを失いたくない場合には、EC2Rescue での復旧が役に立つと思います。

今回の環境

次の通り2つのインスタンスを用意します。

復旧対象インスタンス EC2Rescueインスタンス OS
Instance #1 Instance #2 Windows Server 2019

インスタンスを壊す

先ずは、Instance #1 に Windows ファイアウォールのルールを追加してアクセス不能にします。 PowerShell で以下のコマンドを入力します。

注意:本番環境のインスタンスでは実行しないでください

New-NetFirewallRule `
  -DisplayName 'Block-Inbound-TCP-3389' `
  -Direction Inbound `
  -Protocol TCP `
  -LocalPort 3389 `
  -Action Block

上記のルールは RDP (3389/tcp) の着信パケットを全て遮断します。[Enter] キーを押下するとすぐにアクセス不能になり、リモートデスクトップのウィンドウがフリーズします。インスタンスが壊れてしまいましたので、このインスタンスは停止しておきます。

復旧用インスタンスの用意

新たに Instance #2 として、復旧用の Windows Server を立ち上げます(この時同じ AZ 内に立ち上げる必要があります)。インスタンスの起動が完了したら、ログインして PowerShell を実行、EC2Rescue をダウンロード、展開します。

PS C:\Users\Administrator> Invoke-WebRequest https://s3.amazonaws.com/ec2rescue/windows/EC2Rescue_latest.zip -OutFile $env:USERPROFILE\Desktop\EC2Rescue_latest.zip

PS C:\Users\Administrator> Expand-Archive -Path $env:USERPROFILE\Desktop\EC2Rescue_latest.zip -DestinationPath $env:USERPROFILE\Desktop\EC2Rescue_latest

PS C:\Users\Administrator> Get-ChildItem $env:USERPROFILE\Desktop\EC2Rescue_latest

Directory: C:\Users\Administrator\Desktop\EC2Rescue_latest

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2/17/2021 7:21 AM 214504 EC2Rescue.chm
-a---- 2/17/2021 7:24 AM 697680 EC2Rescue.exe
-a---- 7/29/2020 8:52 AM 1267 EC2Rescue.exe.config
-a---- 2/17/2021 7:24 AM 25424 EC2RescueCmd.exe
-a---- 7/29/2020 8:52 AM 1267 EC2RescueCmd.exe.config
-a---- 2/17/2021 7:24 AM 183120 EC2RescueLib.dll
-a---- 2/17/2021 7:19 AM 1223 license.txt
-a---- 2/17/2021 7:19 AM 4921 README.txt

PS C:\Users\Administrator>

次に、不具合が発生している Instance #1 の EBS ボリュームをデタッチして、Instance #2 のセカンダリボリュームとしてアタッチします。イメージとしては、以下のようになります。

Diagnose and Rescue の実行

問題が発生しているインスタンスの分析と復旧を行います。実施前にはスナップショットや AMI でのバックアップの取得を推奨します。デスクトップ上に展開した EC2Rescue を実行します。

初回実行時はライセンス同意に関するダイアログが表示されますので、[I Agree] を押下します。その後、EC2Rescue に関する説明が表示される画面に遷移しますので、[Next] を押下します。

Select mode では、別のインスタンスの復旧を行うため Offline instance をクリックします。

Select a disk では、復旧対象のディスクを選択して [Next] を押下します。

選択したディスクでよいかどうか確認ダイアログが表示されますので、[Yes] を押下します。

Volume successfully loaded. が表示されればディスクのオンライン化が成功です。

その後、システムの概要と各機能の選択画面が表示されますので、Diagnose and Rescue を選択して [Next] を押下します。

検出された問題が表示されます。 Windows Firewall について3件表示されています。3件ともチェックして [Next] を押下します。

復旧内容の確認をして [Rescue] ボタンを押下します。

選択したディスクの変更を行う旨のダイアログが表示されるので、[OK] をクリックします。

結果が表示されます。Windows Firewall を無効化したと表示されています。[Next] を押下して進みます。

終了画面です。[Finish] を押下して終了します。終了時にディスクがオフラインになりますので、デタッチして、元のインスタンス (Instance #1) のルートボリューム (/dev/sda1) としてアタッチします。

復旧確認

Instance #1 を起動して、リモートデスクトップで接続します。コントロールパネルから Windows ファイアウォールの状態を見ると、全て無効になっていることが確認出来ます。PowerShell からも確認してみます。

PS C:\Users\Administrator> Get-NetFirewallProfile | Format-Table

Name Enabled DefaultInboundAction DefaultOutboundAction AllowInboundRules AllowLocalFirewallRules AllowLocalIPsecRul
es
---- ------- -------------------- --------------------- ----------------- ----------------------- ------------------
Domain False NotConfigured NotConfigured NotConfigured NotConfigured NotConfigured
Private False NotConfigured NotConfigured NotConfigured NotConfigured NotConfigured
Public False NotConfigured NotConfigured NotConfigured NotConfigured NotConfigured

PS C:\Users\Administrator>

尚、最初に投入した RDP を遮断するルール自体は残っています。このままファイアウォールを有効化すると再度遮断されてしまいます。

PS C:\Users\Administrator> Get-NetFirewallRule | Where-Object DisplayName -Like '*3389' | Format-Table

Name DisplayName DisplayGroup Enabled Profile Direction Action
---- ----------- ------------ ------- ------- --------- ------
{46e5713d-7ca0-4153-8b4c-98f24aa7089f} Block-Inbound-TCP-3389 True Any Inbound Block

PS C:\Users\Administrator>

そのため、問題となるルールを削除します。

PS C:\Users\Administrator> Remove-NetFirewallRule -DisplayName "Block-Inbound-TCP-3389"
PS C:\Users\Administrator>
PS C:\Users\Administrator>
PS C:\Users\Administrator> Get-NetFirewallRule | Where-Object DisplayName -Like '*3389' | Format-Table
PS C:\Users\Administrator>

問題となっていたルールが削除されました。この状態でファイアウォールを有効化すると、遮断されず復旧完了となります。

 

最後に

今回は手動で EC2Rescue を実行してみましたが、これら一連の操作を Systems Manager を利用して自動化することもできます。以下のページを参照し、いざという時に備えてみてはいかがでしょうか。本記事が読者様の運用のお役に立てれば幸いです。

参考

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-ec2rescue.html

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら