コーヒーが好きな木谷映見です。
AWS Summit Japan 2022 が盛り上がっていますね!
昨日 2022 年 5 月 24 日、EC2 インスタンスの偶発的な停止を防ぐ「Stop Protection(停止保護)」機能が発表されました。今回はこの機能をさっそく試してみようと思います。 aws.amazon.com
最初に結論
EC2 インスタンスの停止保護を有効化しておくと、 AWS 側の誤った操作でインスタンスの停止を防ぐことができ、さらに休止と削除も防ぐことができます。 再起動、スケジュールされた停止、 OS からのシャットダウンを防ぐことはできませんので、ご注意ください。
ドキュメント
ドキュメントはこちらです。英語にすると「Enable Stop Protection」という項目が確認できます。 docs.aws.amazon.com
停止保護は、マネジメントコンソール、CLI、または API からインスタンスが誤って停止されるのを防ぎます。さらに、誤って休止、削除(終了)するのも防ぎます。
停止保護を有効化する
EC2 インスタンスを起動します。
EC2 マネジメントコンソールの「インスタンス」から、「インスタンスの起動」をクリックします。
Name タグは「Stop-Protection-demo」としておきます。
キーペアだけは自身で所持しているものを設定し、基本デフォルト設定にしておきます。
「高度な詳細」を展開します。
「停止保護」という項目がありますので、これを有効化します。
インスタンスを起動します。
起動後、インスタンスの詳細を見ると「停止保護」が有効になっているのが確認できます。
停止を試す
マネジメントコンソールからインスタンスの停止を試す
インスタンスを停止しようとしてみます。
「インスタンスの状態」から、「インスタンスを停止」をクリックします。
以下のようなエラーが表示され、インスタンスの停止に失敗します。
The instance 'i-xxxxxxxxxxxxxxxxx' may not be stopped. Modify its 'disableApiStop' instance attribute and try again.
AWS CLI からインスタンスの停止を試す
停止保護を有効化した EC2 インスタンスの停止を AWS CLI で実行しようとすると、以下のようにエラーが出ます。
$ aws --version aws-cli/2.7.0 Python/3.9.11 Linux/4.14.275-207.503.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off $ aws ec2 stop-instances --instance-ids i-xxxxxxxxxxxxxxxxx An error occurred (OperationNotPermitted) when calling the StopInstances operation: The instance 'i-xxxxxxxxxxxxxxxxx' may not be stopped. Modify its 'disableApiStop' instance attribute and try again.
再起動を試す
マネジメントコンソールからインスタンスの再起動を試す
インスタンスを再起動しようとしてみます。 「インスタンスの状態」から、「インスタンスを再起動」をクリックします。
停止保護が有効の状態で、再起動されました。
AWS CLI からインスタンスの再起動を試す
停止保護を有効化した EC2 インスタンスの再起動を AWS CLI で実行しようとすると、以下のように何事もなく正常に終了します。
$ aws --version aws-cli/2.7.2 Python/3.9.11 Linux/4.14.276-211.499.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off $ aws ec2 reboot-instances --instance-ids i-xxxxxxxxxxxxxxxxx $
休止を試す
マネジメントコンソールからインスタンスの休止を試す
インスタンスを休止しようとしてみます。
EC2 インスタンスを休止するには、起動時に「Stop - Hibernate behavior」を有効にしておく必要があります。
「インスタンスの状態」から、「インスタンスを休止」をクリックします。
以下のようなエラーが表示され、インスタンスの休止に失敗します。
The instance 'i-xxxxxxxxxxxxxxxxx' may not be stopped. Modify its 'disableApiStop' instance attribute and try again.
AWS CLI からインスタンスの休止を試す
停止保護を有効化した EC2 インスタンスの休止を AWS CLI で実行しようとすると、以下のようにエラーが出ます。
$ aws --version aws-cli/2.7.2 Python/3.9.11 Linux/4.14.276-211.499.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off $ aws ec2 stop-instances \ > --instance-ids i-xxxxxxxxxxxxxxxxx \ > --hibernate An error occurred (OperationNotPermitted) when calling the StopInstances operation: The instance 'i-xxxxxxxxxxxxxxxxx' may not be stopped. Modify its 'disableApiStop' instance attribute and try again.
削除を試す
マネジメントコンソールからインスタンスの削除を試す
インスタンスを削除(終了)しようとしてみます。
「インスタンスの状態」から、「インスタンスを終了」をクリックします。
インスタンスの削除に失敗します。
日本語と英語が混じっていますが、以下のエラーが表示されます。
インスタンス The instance 'i-xxxxxxxxxxxxxxxxx' may not be terminated. Modify its 'disableApiStop' instance attribute and try again. の終了に失敗しました。
AWS CLI からインスタンスの削除を試す
停止保護を有効化した EC2 インスタンスの削除(終了)を AWS CLI で実行しようとすると、以下のようにエラーが出ます。
$ aws --version aws-cli/2.7.0 Python/3.9.11 Linux/4.14.275-207.503.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off $ aws ec2 terminate-instances --instance-ids i-xxxxxxxxxxxxxxxxx An error occurred (OperationNotPermitted) when calling the TerminateInstances operation: The instance 'i-xxxxxxxxxxxxxxxxx' may not be terminated. Modify its 'disableApiStop' instance attribute and try again.
停止保護を無効化する
停止保護を無効化します。
[アクション] - [インスタンスの設定] - [停止保護を変更]をクリックします。
有効化のチェックを外して「保存」をクリックします。
停止保護が無効になります。この状態で「インスタンスを停止」すると、インスタンスが停止できます。
インスタンスにログインしてシャットダウン
停止保護が有効な状態で、OS上からシャットダウンしたらどうなるのでしょうか。再度停止保護を有効化して試します。
停止保護の有効化は、[アクション] - [インスタンスの設定] - [停止保護を変更]をクリックし、「有効化」にチェックを入れて保存するだけで簡単に有効化できます。
Amazon Linux 2 にログインし、シャットダウンコマンドを実行します。
# shutdown -h now
停止保護は有効ですが、シャットダウンし、インスタンスが停止しました。
考慮事項
再起動は防ぐことはできません。
停止保護を有効にしても、インスタンスを停止するスケジュールされたイベントがある場合、インスタンスを停止するのを防ぐことはできません。
停止保護を有効にしても、インスタンスが異常な場合やスケールインイベント中に Auto Scaling がインスタンスを終了するのを防ぐことはできません。
Instance Store-Backedインスタンスの停止保護を有効にすることはできません。
スポットインスタンスの停止保護を有効にすることはできません。
emi kitani(執筆記事の一覧)
AS部LX課。2022/2入社、コーヒーとサウナが好きです。執筆活動に興味があります。AWS認定12冠。