Elastic Beanstalk 環境の EC2 インスタンスを停止した際、EC2 インスタンスが終了してしまった理由を教えてください

2022.12.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

検証用の Elastic Beanstalk 環境において、コストを抑えるために環境内の EC2 インスタンスを EC2 のマネジメントコンソールから停止しました。
その後、停止した EC2 インスタンスが終了し、新たな EC2 インスタンスが起動しました。
Elastic Beanstalk 環境の EC2 インスタンスを停止した際、EC2 インスタンスが終了してしまった理由を教えてください

どう対応すればいいの?

停止した EC2 インスタンスが終了したのは、Elastic Beanstalk 環境の Auto Scaling グループによる想定された挙動です。

AWS 公式ドキュメントより

AWS Elastic Beanstalk 環境には、環境内の Amazon EC2 インスタンスを管理する Auto Scaling グループが含まれています。単一インスタンス環境では、Auto Scaling グループは常に1 つのインスタンスが実行されているよう確認します。負荷分散される環境では、実行する範囲のグループを設定すると、Auto Scaling は、負荷に基づき、必要に応じてインスタンスを追加または削除します。

EC2 インスタンスを停止したことにより、Auto Scaling グループのヘルスチェックで EC2 インスタンスが異常とみなされた結果、EC2 インスタンスの終了および新規起動が行われたという挙動です。

AWS 公式ドキュメントより

Amazon EC2 Auto Scaling は、Amazon EC2 インスタンスのステータスチェックとシステムステータスチェックの結果を使用して、インスタンスのヘルスステータスを判断します。インスタンスが running 以外の Amazon EC2 状態である場合、またはステータスチェックのステータスが impaired になった場合、Amazon EC2 Auto Scaling はインスタンスを異常であると見なし、そのインスタンスを置き換えます。これには、インスタンスが以下のいずれかの状態にある場合が含まれます。
・stopping
・stopped
・shutting-down
・terminated

上記より、Elastic Beanstalk 環境の EC2 インスタンスを停止した際には、EC2 インスタンスが終了するという挙動が正常ですのでご注意ください。

検証用の Elastic Beanstalk 環境でコストを抑えたい場合には、以下の AWS ナレッジセンターでスケジュールされた時間に環境自体を終了および再起動する方法が紹介されていますので、参考にしてください。

どうしても停止したい場合の方法

環境の終了では EC2 インスタンスが終了してしまいますので、どうしても停止状態にしておきたい場合には、非公式かつ非推奨ですが方法はあります。
ただし、Elastic Beanstalk 環境外での操作となるため、問題が発生する可能性があることを理解したうえで実施してください。

AWS 公式ドキュメントより

環境内にあるリソースを変更する場合は、必ず Elastic Beanstalk を使用してください。他のサービスのコンソール、CLI コマンド、または SDK を使用してリソースを変更した場合、Elastic Beanstalk ではこれらのリソースの状態を正確にモニタリングできなくなります。また、設定を保存することも、環境を確実に再現することもできなくなります。帯域外で変更を加えた場合は、環境を更新または終了する際も問題が発生することがあります。

Elastic Beanstalk 環境内の EC2 インスタンスを停止する方法は、Auto Scaling グループの中断されたプロセスで「Health Check」を選択する方法です。

先述の通り、Auto Scaling グループにはヘルスチェック機能がありますが、中断されたプロセスで「Health Check」を選択することで、ヘルスチェックプロセスを停止します。
この状態で EC2 インスタンスを停止すれば、Auto Scaling グループのヘルスチェックが機能しないので、EC2 インスタンスは常に正常とみなされ、停止状態を保つことができます。

Auto Scaling グループの中断されたプロセスについては、以下の AWS 公式ドキュメントをご覧ください。

EC2 インスタンスを停止から起動する場合には、必ず EC2 インスタンスが起動してステータスチェックに合格してから Auto Scaling グループの中断されたプロセスを元に戻しましょう。
先に中断されたプロセスを元に戻してしまうと、停止状態の EC2 インスタンスが起動している最中にヘルスチェックで不合格と判定され、終了してしまう可能性があります。

参考までに Elastic Beanstalk 環境内の EC2 インスタンスを停止する方法を紹介しましたが、先述の通り非公式、非推奨の方法なので、実施時には問題が発生する可能性があることを理解したうえで実施してください。

参考資料