EC2インスタンスは「終了」操作を行うと、簡単に削除できちゃいます。
- 停止:EC2の停止操作(OS停止)
- 終了:EC2の削除(通常はEBSもセットで削除)
最初は怖かったですねぇ。けど意味をしっかり理解して「終了保護」をしかけておけば少し安心出来ます。今回は「終了保護」の観点で記事を書いていきます。さらに、CLIを利用して終了保護が無効状態のEC2一覧を確認する方法にも触れます。
公式サイトにも終了保護に関しては色々と記載あります。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/accidental-termination/
終了保護の解説
終了保護を有効にすると、終了操作を行った際にエラーになるため、意図しない終了操作から保護することが出来ます。



終了保護はデフォルトで無効(未設定)です。
終了保護の設定と確認
- 設定は、EC2起動時や起動後に設定可能です。
- 確認は、EC2メニューより確認可能です。

確認に関して、コマンドで未設定EC2を出力する例も見ていきます。
終了保護の設定
■EC2起動時
インスタンスの詳細の設定ステップにおいて、「終了保護の有効化」にチェックを入れることで設定出来ます。

■EC2起動後
任意EC2を選択して右クリックメニューより「インスタンスの設定」→「終了保護を変更」と進み、「有効化」にチェックを入れて保存します。


終了保護の確認(マネジメントコンソール)
設定状況については、任意EC2選択時の詳細タブ内に「終了保護」という項目より確認出来ます。(設定画面を開いてチェック状態を確認でも可能です)


残念ながら列に表示させることは出来ません(2022年2月時点)。管理対象のEC2が多い場合、個々に見ていくのは面倒くさい・・・。この場合、終了保護の状況確認はコマンドを使うと見落としが無いです。
終了保護の確認(AWS CLI@CloudShell)
対象となるコマンドは「describe-instance-attribute」です。cloudShellを利用すれば手っ取り早く確認出来ます。
# 実行例
aws ec2 describe-instance-attribute --instance-id i-1234567890 --attribute disableApiTermination
# 出力例
# true = 終了保護有効です。
{
"DisableApiTermination": {
"Value": true
},
"InstanceId": "i-1234567890"
}
同様にCloudShellを利用して、任意VPC内において、終了保護が「無効」となっているインスタンスIDを出力してみます。以下コマンドで実施可能です。
aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-1234567890123456 --query 'Reservations[*].Instances[*].[InstanceId]' | \
jq '.[][][]' | \
xargs -L 1 \
aws ec2 describe-instance-attribute --attribute disableApiTermination --instance-id | \
jq --unbuffered 'select(.DisableApiTermination.Value == false)' | \
jq --unbuffered -r '.InstanceId'

上記コマンドの補足説明です。
- 任意VPCIDのインスタンスIDをJSON出力
- JSON出力から配列を除去する(複数行のインスタンスIDになる)
- インスタンスIDを1行毎に次のコマンドに渡す(次コマンドの引数にする)
- 終了保護状態を出力
- 上記出力において終了保護が「無効」だけにフィルタする。
- 上記出力においてインスタンスIDのみを出力する。
jqのオプションで「–unbuffered」を指定しているのは、すぐに標準出力されない場合があるためです。(指定しなくても構いませんが、数が多いと結果がなかなか表示されず、固まったのかなと勘違いします。)

jqコマンドはjsonを扱う上で便利です。(今後勉強しつつまとめる予定)
その他
本記事では「終了保護」に関して紹介しましたが、終了させたくないのであれば、そもそも、操作アカウント(IAMユーザ等)にEC2の終了保護を与えないのも選択肢です。
2022年5月にAWSがアップデートされ「停止保護」というのも出来ました。AWSマネジメントコンソール等を使って停止操作をしようするとガードしてくれる機能です。
ただし、
- OS内部からの停止操作はガード出来ない。
- 再起動操作はガード出来ない。
です。
重要なシステムであれば、こうした保護機能をしかけつつ、ユーザ権限や運用手順の順守でしっかりガードする必要がありますね。
まとめ
本記事ではEC2終了保護の確認や設定方法についてご紹介しました。終了操作は権限があれば簡単に実施出来てしまうため必ず設定しましょう。

最後までご覧いただき、ありがとうございました。
コメント