インスタンスリフレッシュとライフサイクルフック
インスタンスリフレッシュで新しい起動テンプレートを段階的に展開し、ライフサイクルフックでインスタンスの起動前または終了前にカスタム処理を実行します。
「インスタンスリフレッシュとライフサイクルフック」はCoddyKit上の無料AWS Solutions Architectレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAWS Solutions Architect学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AWS Solutions Architectコースには全4レッスンが含まれています。
インスタンスをローリング更新する際の課題
Launch Templateを更新しても(新しいAMI、新しいユーザーデータ、新しいインスタンスタイプなど)、ASG内ですでに実行中のインスタンスは自動的には置き換えられず、古い設定のまま動作し続けます。変更を反映するには、インスタンスを置き換える必要があります。インスタンスを手動で終了して再起動する方法は、リスクが高く、エラーも発生しやすくなります。Instance Refreshを使用すると、安全性を制御する設定付きで、このプロセスを自動化できます。
Instance Refreshの仕組み
Instance Refreshは、ASG内のインスタンスをローリング方式でバッチごとに置き換えます。各ステップで古いインスタンスのバッチを終了し、新しいインスタンスがヘルスチェックに合格するのを待ってから、次のバッチに進みます。MinHealthyPercentage(Refresh中に正常な状態を維持する必要があるキャパシティの最小割合)と、オプションのInstanceWarmup時間によって、更新のペースを制御できます。
aws autoscaling start-instance-refresh \
--auto-scaling-group-name 'MyAppASG' \
--preferences '{
"MinHealthyPercentage": 80,
"InstanceWarmup": 300,
"CheckpointPercentages": [20, 50, 100],
"CheckpointDelay": 600
}'MinHealthyPercentageとバッチサイズ
MinHealthyPercentageは、Refresh中に維持する正常なキャパシティの下限を定義します。90%に設定すると、一度に置き換えられるフリートは10%だけとなり、遅くなりますが安全性は高まります。50%に設定すると、フリートの半分を一度に置き換えるため、速くなりますが冗長性は低下します。ASGは、この割合と現在のdesired capacityに基づいてバッチサイズを自動的に計算します。可用性を維持するため、本番ワークロードではより高い割合を選択してください。
カナリア方式のロールアウトにおけるチェックポイント
チェックポイントを使用すると、あらかじめ定義した割合の到達時点でInstance Refreshを一時停止できます。たとえば、インスタンスの20%を更新した後、10分間停止してスモークテストを実行し、その後続行できます。チェックポイントで問題を検出した場合はRefreshをキャンセルできます。ASGは追加のインスタンス置き換えを停止しますが、すでに置き換えたインスタンスはそのまま稼働させます(すでに新しいテンプレートを使用しているためです)。これは、EC2でのカナリアデプロイパターンに相当します。
Instance Refreshのキャンセルと監視
進行中のInstance Refreshはいつでもキャンセルできます。キャンセルすると、それ以降の置き換えは停止しますが、完了済みの置き換えはロールバックされません。describe-instance-refreshesを使用すると、ステータス、進捗率、起動に失敗したインスタンスを確認できます。Instance RefreshをCI/CDパイプラインと統合し、Launch Templateに新しいAMIを登録した後にRefreshを自動的に開始すれば、完全に自動化されたブルー/グリーン形式のデプロイを実現できます。
aws autoscaling describe-instance-refreshes \
--auto-scaling-group-name 'MyAppASG'
# Cancel a running refresh
aws autoscaling cancel-instance-refresh \
--auto-scaling-group-name 'MyAppASG'Lifecycle Hooksの概要
Lifecycle Hooksは、ASG内のインスタンス状態が重要なタイミングで遷移する際に一時停止させ、インスタンスがアクティブになる前や終了する前にカスタム処理を実行できるようにします。フックポイントは2つあります。EC2_INSTANCE_LAUNCHING(起動後、インスタンスがInServiceになる前)と、EC2_INSTANCE_TERMINATING(終了決定後、実際にインスタンスが終了する前)です。フックの実行中、インスタンスはPending:WaitまたはTerminating:Wait状態になります。
起動Lifecycle Hooksのユースケース
launching hookは、インスタンスがトラフィックを処理する前に完了させる必要があるタスクに適しています。たとえば、追加ソフトウェアのインストール、Parameter Storeからの設定の取得、サービスディスカバリレジストリへの登録、統合テストの実行などです。フックが完了するかタイムアウトするまで、ASGはそのインスタンスをロードバランサーのターゲットグループに追加しません。これにより、設定が不完全なインスタンスにトラフィックが到達するのを防げます。
aws autoscaling put-lifecycle-hook \
--auto-scaling-group-name 'MyAppASG' \
--lifecycle-hook-name 'AppInit' \
--lifecycle-transition EC2_INSTANCE_LAUNCHING \
--default-result ABANDON \
--heartbeat-timeout 300終了Lifecycle Hooksのユースケース
termination hookは、インスタンスが実際に終了する前に実行されます。ユースケースには、アプリケーションレベルのキューにある処理中のリクエストのドレイン、キャッシュデータの永続ストアへの書き出し、サービスレジストリからの登録解除、ログファイルのS3へのコピーなどがあります。終了フックがない場合、終了対象のインスタンスで処理中の作業が失われる可能性があります。このフックを使用すると、グレースフルシャットダウンのタスクを完了するために、最大2時間(ハートビートタイムアウト)が与えられます。
aws autoscaling put-lifecycle-hook \
--auto-scaling-group-name 'MyAppASG' \
--lifecycle-hook-name 'GracefulShutdown' \
--lifecycle-transition EC2_INSTANCE_TERMINATING \
--default-result CONTINUE \
--heartbeat-timeout 120Lifecycle Hookの完了
インスタンス上で実行される、またはインスタンスによってトリガーされるカスタムロジックは、処理が完了したときにフックへ通知する必要があります。complete-lifecycle-actionを使用し、CONTINUE(通常どおり続行)またはABANDON(起動フックではインスタンスを終了し、終了フックでは無視して続行)のいずれかを指定します。また、最大継続時間に達するまで一定間隔でheartbeatを送信し、フックのタイムアウトを延長することもできます。フックがタイムアウトすると、DefaultResultが適用されます。
# From inside the instance or a Lambda triggered by EventBridge
aws autoscaling complete-lifecycle-action \
--auto-scaling-group-name 'MyAppASG' \
--lifecycle-hook-name 'AppInit' \
--lifecycle-action-result CONTINUE \
--instance-id 'i-0abc123def456'EventBridgeによるロジックのトリガー
Lifecycle Hooksに応答する最もすっきりした方法は、Amazon EventBridgeを使用することです。Lifecycle Hookが実行されると、ASGはEventBridgeにイベントを送信します。EventBridgeルールはこのイベントをLambda functionにルーティングし、Lambda functionが必要な処理を実行した後、complete-lifecycle-actionを呼び出します。このアーキテクチャは完全にサーバーレスで、ポーリングが不要であり、自動的にスケールします。SQSとSNSによる通知は以前からある代替手段ですが、新しい設計ではEventBridgeが推奨されます。
Instance RefreshとLifecycle Hooksの連携
Instance Refreshがインスタンスを置き換える際にも、両方のLifecycle Hooksが実行されます。つまり、古いインスタンスでは終了フックが、新しいインスタンスでは起動フックが実行されます。そのため、通常のスケールイベントだけでなく、ローリング更新中にもグレースフルシャットダウンと初期化のロジックが自動的に実行されます。本番環境にロールアウトする前に、段階的なInstance Refresh中にLifecycle Hookのロジックを必ずテストし、正しく動作することを確認してください。
理解度チェック
このレッスンで学んだAWS Solutions Architect(SAA-C03)の概念について、理解度を確認しましょう。
レッスンのまとめ
このレッスンでは、Instance RefreshがMinHealthyPercentageとオプションのチェックポイントによって制御されたローリングバッチでASGのインスタンスを置き換え、カナリア方式の検証を可能にすること、Lifecycle Hooksが起動時または終了時にインスタンスの状態遷移を一時停止して、カスタムの初期化処理やグレースフルシャットダウン処理を実行できること、そしてEventBridge + LambdaがポーリングなしでLifecycle Hookイベントに応答する推奨パターンであることを学びました。次は、AWS Lambdaの関数、ランタイム、トリガー、ハンドラーについて説明します。
よくある質問
「インスタンスリフレッシュとライフサイクルフック」レッスンは無料ですか?
はい。「インスタンスリフレッシュとライフサイクルフック」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AWS Solutions Architectコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AWS Solutions Architectコースには全4レッスンが含まれています。
「インスタンスリフレッシュとライフサイクルフック」で何を学びますか?
インスタンスリフレッシュで新しい起動テンプレートを段階的に展開し、ライフサイクルフックでインスタンスの起動前または終了前にカスタム処理を実行します。 ブラウザで直接実行するハンズオンコードでAWS Solutions Architectを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AWS Solutions Architectを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAWS Solutions Architectは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「インスタンスリフレッシュとライフサイクルフック」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAWS Solutions Architectレッスンでコードを書いて実行できますか?
はい。すべてのAWS Solutions Architectレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 起動テンプレートと ASG の設定
- スケーリングポリシー:ターゲット追跡とステップスケーリング
- スケジュールスケーリングと予測スケーリング
- インスタンスリフレッシュとライフサイクルフック