Amazon EC2 Auto Scaling のライフサイクルフック - Amazon EC2 Auto Scaling (日本語)

Amazon EC2 Auto Scaling のライフサイクルフック

Amazon EC2 Auto Scaling は、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 で容量管理を容易にする] の [YouTube] をご覧ください。

注記

Amazon EC2 Auto Scaling は、Auto Scaling グループのデプロイに役立つ独自のライフサイクルを提供します。このライフサイクルは、他の EC2 インスタンスのライフサイクルとは異なります。詳細については、「Amazon EC2 Auto Scaling インスタンスのライフサイクル」を参照してください。

ライフサイクルフックの動作

Auto Scaling グループにライフサイクルフックを追加すると、以下のように機能します。

  1. Auto Scaling グループはスケールアウト イベントに応答し、インスタンスの起動を開始します。

  2. ライフサイクルフックはインスタンスを待機状態 (Pending:Wait) にし、カスタムアクションを実行します。

    [complete-lifecycle-action] CLI コマンドまたは [CompleteLifecycleAction] アクションを使用してライフサイクルアクションを完了するか、タイムアウト期間が終了するまで、インスタンスは待機状態のままになります。デフォルトでは、インスタンスは 1 時間にわたり待機状態になった後、Auto Scaling グループは起動処理を継続します(Pending:Proceed)。さらに時間が必要な場合は、ハートビートを記録することにより、タイムアウト期間を再開できます。タイムアウト期間が切れる前にライフサイクルアクションを完了すると、その期間が終了し、Auto Scaling グループは起動プロセスを続行します。

  3. インスタンスはInService状態になり、ヘルスチェックの猶予期間がスタートします。Auto Scaling グループが Elastic Load Balancing ロードバランサーに関連付けられている場合、インスタンスはロードバランサーに登録され、ロードバランサーはその状態のヘルスチェックをスタートします。ヘルスチェックの猶予期間が終了すると、Amazon EC2 Auto Scaling はインスタンスのヘルス状態のチェックを開始します。

  4. Auto Scaling グループはスケールイン イベントに応答し、インスタンスの終了を開始します。Auto Scaling グループが Elastic Load Balancing で使用されている場合、まず、終了するインスタンスがロードバランサーから登録解除されます。ロードバランサーの Connection draining が有効になっている場合、インスタンスは新しい接続の受け入れを停止し、既存の接続のドレインを待ってから登録解除プロセスを完了します。

  5. ライフサイクルフックはインスタンスを待機状態 (Terminating:Wait) にし、カスタムアクションを実行します。

    インスタンスは、ライフサイクルアクションを完了するまで、またはタイムアウト期間が終了するまで (デフォルトでは 1 時間)、待機状態のままになります。ライフサイクルフックを完了するか、タイムアウト期間が終了すると、インスタンスは次の状態 (Terminating:Proceed)に移行します。

  6. インスタンスが終了しました。

次の図は、このプロセスの Auto Scaling インスタンス状態の移行を示しています。


                ライフサイクルフックを使用するインスタンスのライフサイクル。

考慮事項と制約事項

ライフサイクルフックを使用する場合は、以下のキーとなる考慮事項と制限事項に留意してください。

  • 予期しない障害が発生した場合に起動を中止するように起動ライフサイクルフックを設定できます。その場合、Amazon EC2 Auto Scaling は自動的に終了し、インスタンスが置き換えられます。

  • Amazon EC2 Auto Scaling は、ライフサイクルフックが一貫して障害が発生した場合に、インスタンスの起動を許可する速度を制限します。

  • ライフサイクルフックはスポットインスタンスと共に使用できます。ただし、ライフサイクルフックでは、使用可能な容量がなくなった場合にインスタンスが終了するのを防ぐことはできません。これは、2 分間の中断通知があれば、いつでも起こり得ます。詳細については、[Amazon EC2 の Linux インスタンス用ユーザーガイド] の[スポットインスタンス中断] を参照してください。

  • スケールアウトするとき、Amazon EC2 Auto Scaling は、起動ライフサイクルフックが終了するまで(およびスケーリング ポリシーのウォームアップ時間が完了するまで)、Auto Scaling グループの CloudWatch メトリクスの集約に対して新しいインスタンスをカウントしません。スケールインすると、終了するインスタンスは、終了ライフサイクルフックが終了するまでグループの集計メトリクスのパートとしてカウントされ続けます。

  • 簡易スケーリング ポリシーによって Auto Scaling グループがインスタンスを起動または終了した場合、クールダウン期間が実施されます。クールダウン期間は、以前の簡易スケーリングの影響が表示される前に、Auto Scaling グループが必要以上に多くのインスタンスを起動または終了しないようにするのに役立ちます。ライフサイクルアクションが発生し、インスタンスが待機状態になると、簡易スケーリングポリシーによるスケーリングアクティビティが一時停止されます。ライフサイクルアクションが終了すると、クールダウン期間がスタートします。クールダウン期間に長い間隔を設定すると、スケーリングが再開されるまでに時間がかかります。詳細については、「Amazon EC2 Auto Scaling のスケーリングクールダウン」を参照してください。

  • Auto Scaling グループごとに作成できるライフサイクルフックの最大数を指定するクォータがあります。詳細については、「Amazon EC2 Auto Scaling サービスクォータ」を参照してください。

  • ライフサイクルフックの使用例については、以下のブログ記事を参照してください。Lambda および Amazon EC2 の Run Command を使用した、スケーリングされたインスタンスの Backup システムの構築および EC2 Auto Scaling インスタンスを終了する前にコードを実行する

インスタンスを待機状態に維持する

インスタンスは一定期間、待機状態に維持できます。デフォルトは 1 時間 (3,600 秒) です。

タイムアウト期間は次の方法で調整できます。

  • ライフサイクルフックを作成するときに、ライフサイクルフックのハートビートタイムアウトを設定します。[put-lifecycle-hook] コマンドで、--heartbeat-timeoutオプションを使用します。

  • タイムアウト期間が終了する前に終了したときに次の状態に移るには、[complete-lifecycle-action] コマンドを使用します。

  • ハートビートを記録することにより、タイムアウト期間を延期するには、[record-lifecycle-action-heartbeat] コマンドを使用します。これにより、ライフサイクルフックを作成するときに指定するタイムアウト時間によってタイムアウト期間が延長されます。たとえば、タイムアウト値が 1 時間に設定されている場合、30 分後にこのコマンドを呼び出すと、追加した時間に応じてインスタンスが待機状態のままになります (合計 90 分)。

インスタンスを待機状態に保つことができる最大時間は、48 時間またはハートビートのタイムアウトの 100 倍の、どちらか短い方です。

ライフサイクルフック通知の受信

インスタンスが待機状態になり、Amazon EC2 Auto Scaling がライフサイクルアクションのイベントを EventBridge に送信したときに、Lambda 関数を呼び出したり、通知を送信したりするように、さまざまな EventBridge ルールを設定できます。イベントには、起動または終了されるインスタンスに関する情報と、ライフサイクルアクションをコントロールするために使用できるトークンが含まれています。ライフサイクルフックを作成するためのチュートリアルスタイルの入門ガイドについては、チュートリアル:Lambda 関数を呼び出すライフサイクルフックの設定を参照してください。ライフサイクルアクションが発生したときに発行されるイベントの例については、Auto Scaling イベントを参照してください。

あるいは、起動した後にインスタンスを設定するユーザーデータまたは cloud-init スクリプトがある場合は、通知を設定する必要はありません。このスクリプトは、それが実行されているインスタンスの ID を使用してライフサイクルアクションを制御できます。まだそうしていない場合は、インスタンスメタデータからインスタンスのインスタンス ID を取得するためのスクリプトを更新します。詳細については、Linux インスタンス用 Amazon EC2 ユーザーガイドの「インスタンスメタデータを取得する」を参照してください。設定スクリプトの完了時にスクリプトがライフサイクルフックに知らせることで、インスタンスが次の状態に進むように許可することができます。

注記

Amazon EC2 Auto Scaling コンソールには、ライフサイクルフックの Amazon SNS または Amazon SQS 通知ターゲットを定義するオプションはありません。これらのライフサイクルフックは、AWS CLIまたは SDK のいずれかを追加する必要があります。詳細については、「通知の設定」を参照してください。

GitHub リポジトリ

ライフサイクルフックのテンプレートとスクリプトは、[GitHub リポジトリ] でダウンロードできます。

ライフサイクルフックの可用性

次の表は、さまざまなシナリオで利用できるライフサイクルフックを示しています。

イベント インスタンスの起動または終了¹ インスタンスの最大存続期間: 置き換えインスタンス インスタンスの更新: 置き換えインスタンス 容量の再調整: 置き換えインスタンス ウォームプール: ウォームプールに出入りするインスタンス
インスタンスの起動
インスタンスの削除

¹ グループの作成または削除時、グループが自動的にスケーリングした時、またはグループの希望する容量を手動で調整した場合に、起動または終了したインスタンスに適用されます。インスタンスのアタッチまたはデタッチ、インスタンスのスタンバイモードへの切り替え、または強制削除オプションを使用したグループの削除には適用されません。