雲のメモ帳

猫とクラウドと旅行が好きなインフラエンジニアです。 日々の調べたことや興味が持ったことをこのブログにアウトプットします。

ECS コンテナインスタンスのスケールイン時のタスク実行チェックとドレイニング自動化

ECSでAutoScalngを設定している場合、スケールイン時に実行中のタスクを異常終了させないようにタスクがないかチェックしてあげる必要があります。 AWSの公式ブログで自動化している記事があったので、処理を正確に理解するために記事を参考にしながらLambda作り直してみました。

aws.amazon.com

事前準備

  • ECS クラスター/タスク定義
  • AutoScalingGroup / Lifecyclehook
  • SNS : Lambdaトリガー用
  • Lambda : タスク数のチェック、コンテナインスタンスのステータス変更、Lifecyclehookのステータス変更等

こちらを参考に設定してみてください。
Amazon ECS におけるコンテナ インスタンス ドレイニングの自動化方法 | Amazon Web Services ブログ

処理の流れ

  1. AutoScalingでスケールインが実行
  2. AutoScaling のライフサイクルフックにより、インスタンスの状態が ”Terminating:Wait”となる
  3. CloudWatchEvents が 2 のアクションを検知し、SNSをトリガーする
  4. SNSがLambdaをトリガーする
  5. (Lambda)削除対象のコンテナインスタンスの状態をチェックし、ドレイニングに変更する(新たなタスクが実行されないようにする)
  6. (Lambda)タスクを実行しているかチェック
  7. (Lambda)タスクが実行されていない場合、 AutoScaling のライフサイクルフックを再開する。(”Terminating:Processed”となり、コンテナインスタンスが削除される)
  8. (Lambda)タスクが実行されている場合、30秒WaitしSNSをトリガーし、Lambdaを終了する。 5に戻る。

AWSの公式ドキュメントと基本的には同じです。

f:id:ykoomaru:20200613105310p:plain

Lambda スクリプト

github.com

gist3336b130cb8f80bc2875a6756ce2b666

最後に

この設定をすることで安心してコンテナインスタンスのスケールイン、スケールアウトが実装できますね。必要な時に必要なリソースを確保できるようになるので、クラウドネイティブっぽい使い方でコストも最適化できますね。コンテナ面白い。