マーケットプレイスから購入したインスタンスではEC2Rescueの実行が失敗する件

## これは何?

以前、とあるEC2インスタンスで、[インスタンスステータスチェックの失敗(StatusCheckFailed_Instance)](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html)が頻発していたため、復旧策としてEC2Rescueを実行しようとした際にEC2Rescueの実行自体がエラーになりましたので、ここではその時調べた内容とかの備忘録になります。


## EC2Rescueとは?
EC2Rescueとは、LinuxまたはWindowsServer内の問題点の診断とトラブルシュート、はたまた修復もすることができちゃうツールになります。
以下のようにWindows版とLinux版とでは手順が異なるため、取り違うことがないように..
- [EC2Rescue for Linux](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Linux-Server-EC2Rescue.html)
- [EC2Rescue for Windows Server](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/Windows-Server-EC2Rescue.html)

今回は、トラブルが発生しまくっているLinuxインスタンスに対して、[EC2Rescue](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-ec2rescue.html#automation-ec2rescue-begin)を実行して、復旧を試みようと考えました。

## 実行結果
EC2Rescueを実行した結果から言うと**失敗**になります。。。
[こちら](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-ec2rescue.html#automation-ec2rescue-begin)の手順で、「[AWSSupport-ExecuteEC2Rescue](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-executeec2rescue.html)」を実行しても、SSM Automation が途中でコケてEC2Rescue自体が実行できませんでした。

## 失敗する理由
まあ、、、理由としてはタイトルにもある通り、マーケットプレイスから購入したインスタンスではEC2REscueが失敗するためです。
SSM Automation「[AWSSupport-ExecuteEC2Rescue](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-executeec2rescue.html)」内で呼び出される「[AWSSupport-StartEC2RescueWorkflow](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-startec2rescueworkflow.html)」が、マーケットプレイスから購入したインスタンスの場合、利用できないということでエラーとなりました。

https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-startec2rescueworkflow.html

上記のドキュメントから、はっきりとマーケットプレイスのAMIはサポート対象外と書かれています。

> Amazon EC2 instances created from Marketplace Amazon Machine Images (AMIs) are not supported by this automation.

マーケットプレイスのインスタンスが実行できない理由としては、記載はされていないので私の予想となってしまいますが、
大方、販売側で設定したOS上の設定値が、EC2Rescue(AWS側)によって修復対象として修復されてしまった場合、元のインスタンスの設定値から乖離してしまうため、ベンダー側のサポートも受けられなくなってしまうからと予想されます。


特に、だいぶ前にEC2を構築し、かつ古いCentOSのイメージを利用しているような案件ですと、CentOSイメージがマーケットプレイスからの購入でしか利用できなかった？時代もあるので、古いCentOSを利用している案件があったら一応確認しておくといいと思います。


マーケットプレイスから購入した古いCentOSのイメージがどうかは[Legacy CentOS Public Images](https://wiki.centos.org/Cloud/AWS#Legacy_CentOS_Public_Images)から、マケプレから購入したインスタンスかを確認することができます。


## 確認方法
EC2Rescueを利用する前に、**マーケットプレイスから購入したインスタンス**かを確認する必要があります。

確認する方法は下記のようにマーケットプレイスから購入したAMIやインスタンスからはプロダクトコード(ProductCodes)が割り当てられているため、参照できればマケプレから購入したインスタンスだと判断できます。

```bash
# イメージから確認
aws ec2 describe-images --image-ids <イメージID> --query "Images[].{ImageId:ImageId,Name:Name,ProductCodes:ProductCodes}"

# インスタンス一覧から確認
aws ec2 describe-instances  --query "Reservations.Instances[].{InstanceId:InstanceId,ProductCodes:ProductCodes}"
```

もし、EC2Rescueを使用するケースがありましたら、マケプレから購入したかどうかを頭の片隅に入れておけば手戻りや話の二転三転が防げるかと思います。


## 余談
ってことは、GuardDutyのマルウェア検知機能も利用できないってことです。
マーケットプレイスから購入したインスタンスは、復旧系のものはダメってことですね。。

https://docs.aws.amazon.com/ja_jp/guardduty/latest/ug/malware-protection.html
> Malware Protection は、EBS 用デフォルト AWS マネージドキー で暗号化された EBS ボリュームのスキャンをサポートしていません。
> 
> marketplace として productCode を使用した Amazon EC2 インスタンスのスキャンもサポートされていません。そのような Amazon EC2 インスタンスに対してマルウェアスキャンが開始された場合、スキャンはスキップされます。詳細については、「」の UNSUPPORTED_PRODUCT_CODE_TYPE を参照してください。