アクセスできなくなったWindowsインスタンスをAWSSupport-ExecuteEC2Rescueで復旧する

# 概要
AWSからEC2Rescueというツールが提供されていて、EC2インスタンスのトラブルシューティングに使用できます。

- [Linux 用 EC2Rescue の使用](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Linux-Server-EC2Rescue.html)
- [EC2Rescue for Windows Server の使用](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/Windows-Server-EC2Rescue.html)

ただしネットワーク的な問題がありインスタンスにログインできないといった場合、復旧作業用のインスタンスを立ち上げて問題のあるインスタンスからEBSボリュームをデタッチ、復旧用インスタンスにアタッチしてEC2Rescueを実行、ボリュームを再び元のインスタンスに戻すというような手順が必要でした。
トラブル発生中にこの手順を間違いなく実行するのは難しいものがあります。

今回、そんな一連の作業をSSM Automation（自動化）でまとめて実行してくれる`AWSSupport-ExecuteEC2Rescue`ドキュメントが提供されているのを見つけたので試してみました。
（※2017/10現在Windows限定）

詳細については以下公式ドキュメントを確認してください。

- [到達不可能なインスタンスでの EC2Rescue ツールの実行](http://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-ec2rescue.html)
- [Recover your impaired instances using EC2Rescue and Amazon EC2 Systems Manager Automation](https://aws.amazon.com/jp/blogs/mt/recover-your-impaired-instances-using-ec2rescue-and-amazon-ec2-systems-manager-automation/)

# 事前準備
## IAM Roleの作成
事前準備としてSSM Automationが使用するIAM Roleを作成します。
Role作成用のCloudFormationテンプレートが提供されていたのでそのまま利用しました。
http://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-ec2rescue.html#automation-ec2rescue-access-cfn
<img width="1111" alt="IAM_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/48250/8b0d0fda-be21-fb6d-ff29-1838b4bbddc6.png">

## 障害EC2インスタンスの作成
障害が発生したという想定のインスタンスを作成します。
<img width="1261" alt="EC2_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/48250/d9f314fa-f5f9-877e-d59f-41e820b1db8a.png">

<img width="1280" alt="UnreachableInstance.png" src="https://qiita-image-store.s3.amazonaws.com/0/48250/edf1ef45-409f-753b-7aaa-74d07c32a02c.png">

手違いでDHCPで割り当てられているアドレスと関係ないアドレスを設定してしまいました。
<img width="1280" alt="UnreachableInstance 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/48250/f88388d6-9b47-53c9-f949-9600110fc557.png">

RDP接続が切断され、
<img width="1280" alt="UnreachableInstance 5.png" src="https://qiita-image-store.s3.amazonaws.com/0/48250/8721625a-7678-b62e-2518-5d8af0e7043b.png">

しばらくするとインスタンスステータスチェックにも失敗するようになります。
<img width="1258" alt="EC2_Management_Console 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/48250/29894de6-ece6-5268-903c-da1421c1f1b9.png">

# AWSSupport-ExecuteEC2Rescue を実行
マネジメントコンソールからAutomationを開きます。
`AWSSupport-ExecuteEC2Rescue`ドキュメントを選択、パラメータに復旧したいインスタンスのID、作成したIAM RoleのARNを入力し実行します。
<img width="1453" alt="EC2_Management_Console_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/48250/130401ec-5206-50ba-fdcc-0ab980cbb026.png">

復旧処理が開始されました。
<img width="1265" alt="EC2_Management_Console 4.png" src="https://qiita-image-store.s3.amazonaws.com/0/48250/14df595b-03a6-876f-502b-e44c06939901.png">

CloudFormationでLambda Function、復旧用インスタンスなどが展開されます。
<img width="1177" alt="Lambda_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/48250/186e3969-9f36-08ef-dcc0-7e200f43fae9.png">

<img width="1263" alt="EC2_Management_Console 5.png" src="https://qiita-image-store.s3.amazonaws.com/0/48250/390f17fd-f09e-a37c-5cf6-725342fa6e5a.png">

一連の処理が完了したようです。この時は障害インスタンスの再起動に15分、作業時に作成されたリソースの削除も含めた完了に20分程度かかっていました。
`createBackup` がタイムアウトしていますが作業前に障害インスタンスのAMIバックアップが行われており、実際には問題なく作成されていました。
<img width="1264" alt="EC2_Management_Console 8.png" src="https://qiita-image-store.s3.amazonaws.com/0/48250/4b32e443-807e-8ecf-59ad-928b510ad215.png">

## 確認
障害インスタンスのインスタンスステータスチェックに合格しています。
<img width="1264" alt="EC2_Management_Console 7.png" src="https://qiita-image-store.s3.amazonaws.com/0/48250/176ad486-333d-12b8-60fd-548b947bbfc7.png">

RDP接続も問題なくでき、DHCP設定が元に戻されていました。
<img width="1280" alt="UnreachableInstance 6.png" src="https://qiita-image-store.s3.amazonaws.com/0/48250/302b5e8c-2d77-2e49-fa0c-52cd39d0be57.png">

ステップ`runEC2Rescue`のログはこうなっていました。
DHCPを有効化すると同時にWindows Firewallも無効化したようです。

```:runEC2Rescue
CommandId : 9b0b2297-0838-40cd-b49e-fb924bbadc29

Output : ===== System Information =====
Operating System: Windows Server 2016 Datacenter
Service Pack: -
Version: 10.0.14393
Computer Name: EC2AMAZ-4T6ARMO
Time Zone: UTC
.NET Framework:
    v4.7 (4.7.02053)
EC2Launch Version: 1.3.630

===== Analysis =====
System Time
  OK - RealTimeIsUniversal (Enabled): This registry value should be enabled when timezone is not UTC.
Windows Firewall
  Warning - Domain networks (Enabled): Windows Firewall will be disabled.
  Warning - Private networks (Enabled): Windows Firewall will be disabled.
  Warning - Guest or public networks (Enabled): Windows Firewall will be disabled.
Remote Desktop
  OK - Service Start (Manual): Sets Remote Desktop service start to automatic.
  OK - Remote Desktop Connections (Enabled): The RDP listening port will be changed to TCP/3389.
  OK - TCP Port (3389): The RDP listening port will be changed to TCP/3389.
EC2Launch
  OK - Installation (Installed): EC2Launch 1.3.630 is installed.
  Information - Reset Administrator Password (Disabled): 
Network Interface
  OK - DHCP Service Startup (Automatic): The service will be set to start automatically.
  Information - ?????? 2 detail (N/A): AWS PV Network Device (7.4.6.0)
  Warning - DHCP on ?????? 2 (Disabled (Static: 172.21.27.100)): DHCP will be enabled.

===== Changes =====
Windows Firewall
  OK - Domain networks (Disabled)
  OK - Private networks (Disabled)
  OK - Guest or public networks (Disabled)
Network Interface
  OK - DHCP on ?????? 2 (Enabled)



ResponseCode : 0

Status : Success

```

# まとめ
障害発生時に大きな手間なくトラブルシューティングを行えるので重宝しそうです。
IAM Roleだけでも事前に作成しておくと良さそう。

Linux対応版にも期待したいですね。