Auto Scaling のライフサイクルフックで注意するポイント

Posted on

Auto Scaling でインスタンスの起動 or 終了時に任意の処理を実行できるのがライフサイクルフック機能です。この機能を実際に使ってみたのですが、いくつかハマりました(実際には公式ドキュメントにちゃんと書いてます)。

待機状態時のスケーリングアクション

Auto Scaling にライフサイクルフックを設定すると Pending:Wait / Terminating:Wait という状態が追加され、Pending / Terminating が実行されるまで 3600 秒(変更可能)の猶予を作ってくれます。

この猶予期間の間に、プロビジョニングツールでインスタンスをセットアップしたり、シャットダウンされる前にログを退避させるなど任意の処理を行います(ドキュメントではカスタムアクションと呼ばれています)。

Auto Scaling にライフサイクルフックを設定したときの流れ

注意点を公式ドキュメントから引用します。

Auto Scaling グループに対してライフサイクルフックを設定すると、インスタンスの待機状態が終了するまでスケーリングアクションが停止されます。インスタンスの待機状態が終了すると、クールダウン期間が開始されます。

具体的な例で説明します。 CPU Usage に応じて Auto Scaling を設定した場合、しきい値を下回ればスケールインさせたいわけですが、ログを退避させるためにライフサイクルフックを設定して Terminate の前に 3600 秒の猶予を作ります。このとき Auto Scaling の流れは次のようになります。

  1. CPU Usage がしきい値を下回る
  2. スケーリングポリシーに従ってスケールインが実行される
  3. ライフサイクルフックが実行され Terminating:Wait になる
  4. Terminating:Wait 状態で 3600 秒待つ
  5. Terminating:Proceed に移行し Terminate される
  6. (設定していれば)クールダウンが始まる
  7. 最初に戻って次のスケールインが実行される

待機状態になるとスケーリングアクションが停止されるので、機敏にスケールアウト / スケールインできなくなります。仮に 4 番のときに CPU Usage がしきい値を上回っても、スケーリングアクションが停止しているのでスケールアウトしません。 Web サーバだったら大きな機会損失になりかねません。

ライフサイクルフックで注意するポイント

この仕様を踏まえてライフサイクルフックで注意するポイントをまとめてみました。

  • ライフサイクルフックの待機期間は極力短くする
  • カスタムアクションの進捗を監視し、間に合わないときはハートビートを実行して待機期間を延長する
  • カスタムアクションが待機期間より早く終わったときは CompleteLifecycleAction を実行して待機状態を素早く抜ける
  • 待機状態でスケーリングアクションが待たされる可能性があるため、余裕を持って多めにスケールアウトする

待機期間が長くなると、状況の変化に機敏に対応できなくなります。そのため、できる限り待機期間を短くするのがポイントだと思います。

ライフサイクルフックはうまく活用できれば非常に便利な機能ですが、その仕様をちゃんと理解して使わないと痛い目を見ます。場合によっては、ライフサイクルフックに頼らず自分で Auto Scaling の仕組みを構築する必要があるかもしれません。