【AWS】EC2のAutoRecovery(自動復旧)を無効化するスクリプトを作ってみた

<!-- 発端や概要を記載 -->
# 目次
<!-- タイトルとアンカー名を編集 -->
1. [はじめに](#はじめに)
1. [インスタンス一覧の取得](#インスタンス一覧の取得)
a. [実行結果1](#実行結果1)
1. [オートリカバリを無効化](#オートリカバリを無効化)
a. [実行結果2](#実行結果2)

# はじめに
どうやら最近デフォルトでEC2インスタンスがAuto Recoveryするようになったみたいですね
わざわざ復旧しなくてラッキー！って思う人がいれば、そうでない人も中には。。。。

デフォルトでAuto Recoveryが有効化される以前のお話だと、CloudWatch　Alarmの「StatusCheckFailed_System」メトリクスを監視して、アラーム状態に変われば再起動って流れが多いのではないかなと思います。
アラームの設定が面倒ですが、この再起動するタイミングで通知を飛ばしたりすることで再起動を検知できていました

CloudWatchによる再起動とSNS通知を使用している環境でのお話になりますが、
AutoRecoveryのおかげで？CloudWatchを経由せず、EC2が勝手に復旧してしまう恐れがあります。

再起動後に手動で設定が必要な作業があるから通知するようにしていたのに、勝手に再起動→通知が来ないってなる可能性があると考えるとちょっと怖いですよね。
EventBridgeで再起動を検知して通知するってのもありですが今回はその話はスルーします（笑）

そういうわけでAWSが親切に自動復旧の機能を提供してくれましたが、
「「「ウチはそんなん使わへんで！」」」って方に向けてこの記事を書きました。


<!-- 各チャプター -->

# インスタンス一覧の取得
まず、環境内のインスタンスID、インスタンス名(Nameタグ)、AutoRecoveryのステータスを取得してCSV出力するスクリプトを作成しました。この後に紹介する2つ目のスクリプトで読み込むためのファイルを「AutoRecovery-default-InstanceList.csv」って名前で出力してます。

```  check-autorecovery.sh
#!bin/bash 
InstanceIdList="InstanceIDList.tmp"
OutputFile="InstanceIDList.csv"
AutoRecoverydefaultList="AutoRecovery-default-InstanceList.csv"

rm -f $AutoRecoverydefaultList
echo "EC2 AutoRecoveryのステータスチェック開始"
#CSVヘッダー作成
echo "InstanceID,InstanceName,AutoRecovery Status" > $OutputFile

#インスタンスID一覧の取得
aws ec2 describe-instances --query "Reservations[*].Instances[*].InstanceId" --output text > $InstanceIdList

#インスタンスIDを1行ずつ読み込んで処理
cat $InstanceIdList | while read instanceId
do

	#Nameタグの取得
	read NameTag < <(aws ec2 describe-instances --filters "Name=instance-id,Values=$instanceId" --query "Reservations[*].Instances[*].Tags[?Key=='Name'].Value" --output text)

	#AutoRecoveryのステータスを取得
	read Status < <(aws ec2 describe-instances --filters "Name=instance-id,Values=$instanceId" --query "Reservations[*].Instances[*].MaintenanceOptions.AutoRecovery" --output text)
	
	#ファイルに出力	
	echo "$instanceId,$NameTag,$Status" >> $OutputFile
 
	if [ $Status == "default"  ] ; then
		#オートリカバリが有効化されているインスタンスIDのみリスト出力
	        echo "$instanceId" >> $AutoRecoverydefaultList      
       	fi
done

rm $InstanceIdList
echo "チェック完了"
```
実行前に現在の環境を確認しておきます。
今回はこの2台のみが存在するリージョンで検証を行います。
インスタンスの自動復旧が「デフォルト」になっていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/1bd96343-abc1-5ffa-2aff-a34f8ead83da.png)

ではさっそく動かしてみましょう。
今回は実行環境としてCloudShellを使用します。
(必要な権限を持ったEC2の中で動かしていただいてもかまいません)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/5935693d-49d0-aa28-cefd-85d61d0560e0.png)

## 実行結果1
スクリプトを実行すると「InstanceIDList.csv」と「AutoRecovery-default-InstanceList.csv」が出力されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/181f4f18-645a-a705-8393-cc734fd84818.png)

それぞれの中身を見ていきます。まずは「InstanceIDList.csv」から
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/d0cca34a-de44-144d-0f25-91eb04d7335b.png)
ここに表示されるインスタンスはリージョン内のすべてのインスタンスが対象になっており、CSV形式で"インスタンスID","インスタンス名(Nameタグ)","AutoRecoveryのステータス"が出力されます。
注目してほしいのは「AutoRecovery Status」を「default」として値を取得していることです。
これはオートリカバリが有効化されていることを表しています。
今回はすべてのインスタンスでオートリカバリが有効化されている状態で実行したので「default」しか表示されていませんが、オートリカバリが無効化されているインスタンスが環境内に存在する場合は「disabled」と表示されます。

つぎに「AutoRecovery-default-InstanceList.csv」の中身を見ていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/1e54fe59-2bfb-d0fb-2022-cdfa72b0548e.png)
インスタンスIDのみが追加されています。
これは"AutoRecoveryのステータス"が「default」つまり有効化されているインスタンスIDを表しています。
今回検証で使用する環境はEC2インスタンスが2台、2台とも有効化されているので2台分のインスタンスIDが出力されます。

# オートリカバリを無効化
読み込んだファイルに記載されているインスタンスIDに対してAutoRecoveryの無効化を実行していきます。
先ほど実行した「check-autorecovery.sh」を実行して出力された「AutoRecovery-default-InstanceList.csv」を引数として渡して実行します。

``` disable-autorecovery.sh
#!bin/bash 
InstanceIdList="${1}"
echo "EC2 AutoRecoveryを無効化します"

#インスタンスIDを1行ずつ読み込んで処理
cat $InstanceIdList | while read instanceid
do
        aws ec2 modify-instance-maintenance-options --instance-id $instanceid --auto-recovery disabled
done
echo "AutoRecoveryの無効化が完了しました"
```

実行してみます。
以下のコマンドのように引数として、先ほど出力されたファイルを指定して実行します。

``` 
bash disable-autorecovery.sh "$PATH"/AutoRecovery-default-InstanceList.csv
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/fa404016-8d60-2a45-1201-94e98b4ffebb.png)

# 実行結果2
EC2のコンソール画面でオートリカバリが無効化されたか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/92ae36a3-9db9-426a-9e0d-1e07293d8cfa.png)


「インスタンスの自動復旧」が「オフ」になっていることを確認できました！




# さいごに
今回はスクリプトをあえて2つに分けて作成しましたが、問答無用で全EC2のオートリカバリを無効化したいって場合は1つにまとめちゃってもいいかもしれません。
対象インスタンスをテキスト出力して、問題なければ無効化するっていうステップを踏みたかったので分割しました。

ちょっと記事書くの楽しくなってきたのでため込んでいたネタを消化していきたいと思います。
ちなみに...この記事をTwitterとかで拡散していただけると凄くうれしいです！！！