Amazon EC2 Auto Scaling のライフサイクルフック
Amazon EC2 Auto Scaling は、Auto Scaling グループにライフサイクルフックを追加する機能を提供します。これらのフックにより、Auto Scaling インスタンスライフサイクルのイベントを認識し、対応するライフサイクルイベントが発生したときにカスタムアクションを実行するソリューションを作成できます。ライフサイクルフックでは、インスタンスが次の状態に移行する前に、ライフサイクルアクションの完了を待つ時間 (デフォルトでは 1 時間) が指定されます。
Auto Scaling インスタンスでライフサイクルフックを使用する例として、以下を実行します。
-
スケールアウト イベントが発生すると、新しく起動したインスタンスはスタートアップ シーケンスを完了し、待機状態に移行します。インスタンスが待機状態の間に、アプリケーションに必要なソフトウェアパッケージをダウンロードしてインストールするスクリプトを実行して、トラフィックの受信をスタートする前に、インスタンスの準備がすべて完了していることを確認できます。スクリプトがソフトウェアのインストールを終了すると、complete-lifecycle-actionコマンドを実行して続行します。
-
スケールイン イベントが発生すると、ライフサイクルフックによってインスタンスが終了される前に一時停止され、Amazon EventBridge を使用して通知が送信されます。インスタンスが待機状態の間に、AWS Lambda関数を呼び出したり、インスタンスに接続して、インスタンスが完全に終了される前にログやその他のデータをダウンロードできます。
ライフサイクルフックの一般的な使用方法は、インスタンスが Elastic Load Balancing に登録されるタイミングを制御することです。Auto Scaling グループに起動ライフサイクルフックを追加すると、ライフサイクルフックの最後にロードバランサーに登録される前に、ブートストラップスクリプトが正常に完了していて、インスタンス上のアプリケーションがトラフィックを受け入れる準備ができていることを確認できます。
紹介ビデオについては、[AWSre: Invent 2018: Amazon EC2 Auto Scaling でキャパシティー管理を容易にする
内容
ライフサイクルフックの考慮事項と制限
ライフサイクルフックを使用するときは、以下の考慮事項と制限事項に留意してください。
-
Amazon EC2 Auto Scaling は、Auto Scaling グループの管理に役立つ独自のライフサイクルを提供します。このライフサイクルは、他の EC2 インスタンスのライフサイクルとは異なります。詳細については、「Amazon EC2 Auto Scaling インスタンスのライフサイクル」を参照してください。
-
ウォームプール内のインスタンスには、ウォームプール内のインスタンスのライフサイクル状態の移行 で説明されている独自のライフサイクルもあります。
-
スポットインスタンスによりライフサイクルフックを使用できますが、使用可能な容量がなくなった場合、ライフサイクルフックはインスタンスの終了を防ぐことができません。これは、2 分間の中断通知により、いつでも起こり得ます。詳細については、[Amazon EC2 の Linux インスタンス用ユーザーガイド] の[スポットインスタンス中断] を参照してください。ただし、容量の再調整を有効にして、Amazon EC2 スポットサービスから再調整のレコメンデーションを受け取ったスポットインスタンスを積極的に置換することができます。これは、スポットインスタンスの中断リスクが高まったときに送信される信号です。詳細については、「キャパシティーの再調整を使用して Amazon EC2 スポットの中断に対処する」を参照してください。
-
スケールアウトするとき、Amazon EC2 Auto Scaling は、起動ライフサイクルフックが終了するまで、Auto Scaling グループの集計 CloudWatch インスタンスメトリクス (CPUUtilization、NetworkIn、NetworkOut など) に新しいインスタンスをカウントしません。インスタンスのデフォルトウォームアップが有効化されていない場合、または有効化されていても 0 に設定されている場合、オートスケーリングインスタンスは、
InService
状態になるとすぐに集計インスタンスメトリクスへの使用状況データの提供を開始します。詳しくは、「Auto Scaling グループに対するインスタンスのデフォルトウォームアップを設定する」を参照してください。スケールインでは、終了するインスタンスの削除が集約インスタンスメトリックスに直ちに反映されない場合があります。Amazon EC2 Auto Scaling の終了ワークフローが開始すると、終了するインスタンスは、グループの集計インスタンスメトリクスへのカウントを停止します。
-
Auto Scaling グループがインスタンスを起動または終了すると、簡易スケーリングポリシーによって開始されたスケーリングアクティビティが一時停止されます。ライフサイクルフックが呼び出されると、簡易スケーリングポリシーに起因するスケーリングアクティビティは、ライフサイクルアクションが完了し、クールダウン期間が終了するまで一時停止されます。クールダウン期間に長い間隔を設定すると、スケーリングが再開されるまでに時間がかかることになります。詳細については、「Amazon EC2 Auto Scaling のスケーリングクールダウン」を参照してください。
-
インスタンスは一定期間、待機状態に維持できます。ライフサイクルフックのデフォルトタイムアウトは 1 時間です (ハートビートタイムアウト)。インスタンスを待機状態に保つことができる最大時間を指定するグローバルタイムアウトもあります。グローバルタイムアウトは、48 時間か、ハートビートタイムアウトの 100 倍の時間のどちらか短い方になります。
ライフサイクルフックを作成するときは、以下の点に留意してください。
-
予期しない障害が発生した場合に起動を中止するように起動ライフサイクルフックを設定できます。その場合、Amazon EC2 Auto Scaling は自動的に終了し、インスタンスが置き換えられます。
-
ライフサイクルフックが繰り返し失敗する場合、Amazon EC2 Auto Scaling はインスタンスの起動を許可する頻度を制限するので、ライフサイクルアクションをテストして永続的なエラーを修正するようにしてください。
-
AWS CLI、AWS CloudFormation、または SDK を使用したライフサイクルフックの作成と更新は、AWS Management Consoleからライフサイクルフックを作成するときには利用できないオプションを提供します。例えば、コンソールには SNS トピックや SQS キューの ARN を指定するフィールドが表示されません。これは、Amazon EC2 Auto Scaling がすでに Amazon EventBridge にイベントを送信しているからです。これらのイベントはフィルタリングして、必要に応じて Lambda、Amazon SNS、および Amazon SQS などの AWS のサービスにリダイレクトできます。
-
AWS CLI、AWS CloudFormation、または SDK を使用して CreateAutoScalingGroup API を呼び出すことによって、Auto Scaling グループの作成中に複数のライフサイクルフックを追加できます。ただし、各フックの通知ターゲットと IAM ロール (指定されている場合) が同じである必要があります。異なる通知ターゲットと異なるロールでライフサイクルフックを作成するには、PutLifecycleHook API に対する別個の呼び出しで、ライフサイクルフックを 1 つずつ作成します。
ライフサイクルフックの可用性
次の表は、さまざまなシナリオで利用できるライフサイクルフックを示しています。
イベント | インスタンスの起動または終了¹ | インスタンスの最大存続期間: 置き換えインスタンス | インスタンスの更新: 置き換えインスタンス | キャパシティーの再調整: 置き換えインスタンス | ウォームプール: ウォームプールに出入りするインスタンス |
---|---|---|---|---|---|
インスタンスの起動 | ✓ | ✓ | ✓ | ✓ | ✓ |
インスタンスの削除 | ✓ | ✓ | ✓ | ✓ | ✓ |
¹ グループの作成または削除時、グループが自動的にスケーリングした時、またはグループの希望するキャパシティーを手動で調整した場合に、起動または終了したインスタンスに適用されます。インスタンスのアタッチまたはデタッチ、インスタンスのスタンバイモードへの切り替え、または強制削除オプションを使用したグループの削除には適用されません。
例
AWS CloudFormation のスタックテンプレートでライフサイクルフックを宣言する方法を理解するために使用できる、JSON および YAML のテンプレートスニペットをいくつかご用意しています。詳細については、AWS CloudFormation ユーザーガイドの AWS::AutoScaling::LifecycleHook のリファレンスを参照してください。
ライフサイクルフックのサンプルテンプレートとユーザーデータスクリプトは、GitHub リポジトリ
ライフサイクルフックの使用例については、以下のブログ記事を参照してください: Building a Backup System for Scaled Instances using Lambda and Amazon EC2 Run Command