ECSでAutoScalngを設定している場合、スケールイン時に実行中のタスクを異常終了させないようにタスクがないかチェックしてあげる必要があります。 AWSの公式ブログで自動化している記事があったので、処理を正確に理解するために記事を参考にしながらLambda作り直してみました。
事前準備
- ECS クラスター/タスク定義
- AutoScalingGroup / Lifecyclehook
- SNS : Lambdaトリガー用
- Lambda : タスク数のチェック、コンテナインスタンスのステータス変更、Lifecyclehookのステータス変更等
こちらを参考に設定してみてください。
Amazon ECS におけるコンテナ インスタンス ドレイニングの自動化方法 | Amazon Web Services ブログ
処理の流れ
- AutoScalingでスケールインが実行
- AutoScaling のライフサイクルフックにより、インスタンスの状態が ”Terminating:Wait”となる
- CloudWatchEvents が 2 のアクションを検知し、SNSをトリガーする
- SNSがLambdaをトリガーする
- (Lambda)削除対象のコンテナインスタンスの状態をチェックし、ドレイニングに変更する(新たなタスクが実行されないようにする)
- (Lambda)タスクを実行しているかチェック
- (Lambda)タスクが実行されていない場合、 AutoScaling のライフサイクルフックを再開する。(”Terminating:Processed”となり、コンテナインスタンスが削除される)
- (Lambda)タスクが実行されている場合、30秒WaitしSNSをトリガーし、Lambdaを終了する。 5に戻る。
AWSの公式ドキュメントと基本的には同じです。
Lambda スクリプト
gist3336b130cb8f80bc2875a6756ce2b666
最後に
この設定をすることで安心してコンテナインスタンスのスケールイン、スケールアウトが実装できますね。必要な時に必要なリソースを確保できるようになるので、クラウドネイティブっぽい使い方でコストも最適化できますね。コンテナ面白い。