👻

ECSコンテナインスタンスの更新作業を楽にするツールを作った

2022/09/23に公開

はじめに

インスタンスのマシンイメージを更新したいなど,ECSのコンテナインスタンスを入れ替えたいタイミングってありますよね.
開発環境ならmax instance lifetimeを適当に設定しておけばいいかもですが,本番環境ではタイミングを慎重に見測って,サービスの稼働状況に影響しないように済ませたい作業だと思います.

https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/asg-max-instance-lifetime.html

この辺りを丁寧にやる手法の一つとして,

  1. ASGを更新する
  2. コンテナインスタンスのうち1つをDrainする
  3. そのインスタンスをASGから解除→terminate
  4. 新しいインスタンスが立ち上がりクラスタに登録されるのを待つ
  5. ECSサービスを更新してタスクの偏りを解消
  6. 2.に戻り,クラスタのコンテナインスタンス全てが更新されるまで続ける

というものが考えられます.この一連の作業をなるたけ簡素化するコマンドツールを作ってみました.

解説

https://github.com/noritama73/update-ami

説明はREADMEにもあるので手短に.

update-ami replace-instances --region <region> --profile <user>@<account> --cluster <cluster>

最低限これで動きます.必須パラメータは環境変数からでも指定できます.

動作イメージ

2023/02/02 17:46:54 successfully initialize sessions
2023/02/02 17:46:54 Instance is found: i-XXXXXXXXXXXXXXXXX
2023/02/02 17:46:54 Instance is found: i-YYYYYYYYYYYYYYYYY
2023/02/02 17:46:54 Instance is found: i-ZZZZZZZZZZZZZZZZZ
2023/02/02 17:46:54 Desired capacity: 3
2023/02/02 17:46:55 waiting for a new instance to be registered
2023/02/02 17:46:55 Still new instance isn't registerd
2023/02/02 17:47:15 Still new instance isn't registerd
2023/02/02 17:47:36 Still new instance isn't registerd
2023/02/02 17:47:56 Still new instance isn't registerd
2023/02/02 17:48:16 Still new instance isn't registerd
2023/02/02 17:48:37 Still new instance isn't registerd
2023/02/02 17:48:57 Still new instance isn't registerd
2023/02/02 17:49:23 increased desired capacity: 4
2023/02/02 17:49:23 **************************************************
2023/02/02 17:49:23 working on: i-XXXXXXXXXXXXXXXXX (1 / 3)
2023/02/02 17:49:23 Draining: i-XXXXXXXXXXXXXXXXX
2023/02/02 17:49:23 Still 1 tasks remained
2023/02/02 17:49:44 Drained: i-XXXXXXXXXXXXXXXXX
2023/02/02 17:49:44 Deregistered: i-XXXXXXXXXXXXXXXXX
2023/02/02 17:49:44 Terminated: i-XXXXXXXXXXXXXXXXX
2023/02/02 17:49:44 waiting for a new instance to be registered
2023/02/02 17:49:45 Still new instance isn't registerd
2023/02/02 17:50:05 Still new instance isn't registerd
2023/02/02 17:50:25 Still new instance isn't registerd
2023/02/02 17:50:46 Still new instance isn't registerd
2023/02/02 17:51:06 Still new instance isn't registerd
2023/02/02 17:51:26 Still new instance isn't registerd
2023/02/02 17:51:47 Still new instance isn't registerd
2023/02/02 17:52:07 Still new instance isn't registerd
2023/02/02 17:52:38 **************************************************
2023/02/02 17:52:38 working on: i-YYYYYYYYYYYYYYYYY (2 / 3)
...
2023/02/02 18:00:57 Still 1 tasks remained
2023/02/02 18:01:17 Drained: i-ZZZZZZZZZZZZZZZZZ
2023/02/02 18:01:17 Deregistered: i-ZZZZZZZZZZZZZZZZZ
2023/02/02 18:01:18 Terminated: i-ZZZZZZZZZZZZZZZZZ
2023/02/02 18:01:18 Reseted desired capacity
2023/02/02 18:01:18 Success!

一度コンテナインスタンスに手を付けだしてからは,エラーハンドリングはロギングのみに留め,全てのコンテナインスタンスをDrainすることを最優先に作動する形にしています.古いインスタンスの後片付けが中途半端なままプログラムが終了しないための仕様です.

Special Thanks

https://github.com/atsushi-ishibashi/cosmosmonkey
https://github.com/abicky/ecsmec

Discussion