はじめに
ソリューションアーキテクトのための視点を整理してみました。
今回は、AWS Well-Architected Framework サステナビリティ(持続可能性)の柱です。具体的には、「インスタンスの終了を適切に処理するようにアプリケーションを設計する」 観点にフォーカスしました。実務でも試験でも、ご参考にして頂けましたら、幸いです。
ソリューションアーキテクトのための視点
Auto Scaling グループで Amazon EC2 インスタンスを使用して、AWS クラウドでコンテンツを処理しています。コンテンツの処理には 30 分かかります。SQSキュー内の処理数に応じて、複数の EC2 インスタンスがスケールインおよびスケールアウトします。処理が適切にされていないものがありました。しかし、ログにエラーが見つかりませんでした。考えられる理由を教えてください。
ソリューション 例
インスタンスの終了を適切に処理するようにアプリケーションを設計する
処理中にインスタンスのスケールイン保護を構成する
これを設定していると、インスタンスの終了がデフォルトで拒否するようになる。インスタンスのスケールイン保護設定が無効になるまで、Auto Scaling グループは必要な数のインスタンスを終了できません。そのため、インスタンスが起動したままになるので、不具合が生じた際のエラー状況を確認出来るようになるものと考えられます。
インスタンスの終了を適切に処理するための12の観点
-
インスタンスのスケールイン保護
処理中のインスタンスがスケールインイベントで終了されるのを防ぎます。
保護されているインスタンスは、スケールインイベントが発生しても終了されません。 -
カスタム終了ポリシー
Auto Scalingグループのカスタム終了ポリシーを設定し、どのインスタンスを最初に終了するかを決定します。
特定のインスタンスを優先的に終了することで、重要な処理を行っているインスタンスが終了されるのを防ぎます。 -
終了ライフサイクルフック
終了ライフサイクルフックを設定し、終了対象として選択されたインスタンスの有効期間を延長します。
インスタンスが終了される前にクリーンアップ処理を実行する時間を確保できます。 -
CloudWatchアラームとイベント
CloudWatchアラームとイベントを設定し、インスタンスの終了通知を受け取ります。
インスタンスが終了される前に通知を受け取り、適切なアクションを実行できます。 -
Graceful Shutdown (優雅なシャットダウン)
アプリケーションがSIGTERMシグナルを受け取ったときにクリーンアップ処理を実行するように設計します。
インスタンスが終了される前にデータの保存やリソースの解放を行うことができます。 -
データの永続化
アプリケーションの状態やデータを永続化するために、Amazon RDSやAmazon DynamoDBなどのデータベースを使用します。
インスタンスが終了してもデータが失われません。 -
セッション管理
ユーザーセッションを管理するために、Amazon ElastiCacheなどのインメモリデータストアを使用します。
セッションデータがインスタンスの終了によって失われることを防ぎます。 -
ログの収集
アプリケーションのログをCloudWatch Logsに送信します。
インスタンスが終了してもログデータが失われないようにします。 -
メトリクスの収集
アプリケーションのメトリクスをCloudWatchに送信します。
インスタンスのパフォーマンスや状態を監視できます。 -
Auto Scalingグループの設定
Auto Scalingグループの設定を最適化し、スケールインおよびスケールアウトのポリシーを調整します。
適切なタイミングでインスタンスがスケールインおよびスケールアウトされるようにします。 -
SQSキューの設定
SQSキューの設定を最適化し、メッセージの可視性タイムアウトを調整します。
処理中のメッセージが適切に再処理されるようにします。 -
リトライロジックの実装
アプリケーションにリトライロジックを実装し、失敗した処理を再試行します。
一時的なエラーやインスタンスの終了による処理の失敗を防ぎます。
インスタンスの終了を処理するための3つの戦略
その壱 シグナルハンドラーを使用する
オペレーティングシステムは、インスタンスが終了する前に SIGTERM シグナルを送信します。このシグナルをキャッチして、アプリケーションをクリーンアップするコードを実行できます。これには、開いているファイルをクローズし、トランザクションをコミットし、キャッシュをフラッシュすることなどが含まれます。
其の弐 終了フックを使用する
多くのランタイム環境とフレームワークには、終了フックと呼ばれるメカニズムが用意されています。これにより、インスタンスが終了する前に実行されるコードを登録できます。
其の参 ライフサイクル管理ツールを使用する
Kubernetes や Amazon ECS などのライフサイクル管理ツールを使用すると、インスタンスの終了プロセスを自動化できます。これらのツールを使用して、インスタンスが終了する前に実行されるカスタムスクリプトを定義できます。
インスタンスの終了を適切に処理するようにアプリケーションを設計する3つの観点
其の壱 インスタンスのスケールイン保護
これを設定していると、
インスタンスの終了がデフォルトで拒否するようになる。
保護されている場合、スケールインイベントが発生すると、必要な容量が減ります。
インスタンスのスケールイン保護設定が無効になるまで、Auto Scaling グループは必要な数のインスタンスを終了できません。
其の弐 カスタム終了ポリシー
これを設定していると、
どのインスタンスを最初に終了するかを決定できる。
其の参 終了ライフサイクルフック
これを設定していると、
終了対象として既に選択されているインスタンスの有効期間を延長できる。
詳細は、こちらを参照ください。
インスタンスの終了を適切に処理できるようにアプリケーションを設計する
インスタンスのスケールイン保護を使用してインスタンスの終了を制御する