ECSリソースをサクッと一括停止するツール「ecstop」を作リました
はじめに
2024/12/20にecstopという「ECSリソースをサクッと一括停止」するだけのCLIツールを開発・公開しました。
ECS+Stopでecstopという安直な命名。「イーシーストップ」と呼んでいます。
本記事では、ecstopの概要、思想、今後の展望などを紹介します。
3行まとめ
- ecstopはECSのサービス、タスク、コンテナインスタンス(EC2)をサクッと一括停止できます
- 検証環境において楽にコスト削減することが主目的です
-
brew install t-kikuc/tap/ecstop
したら設定ファイルも不要で即使えます
開発背景
ECS自体の検証やPipeCDの開発・検証時に、ECSのリソースをよく作っていました。
ECSは稼働中のタスク&コンテナインスタンスに課金されるので、使っていないものは停止したいです。
検証ということもあり、クラスターやサービスは削除しないでおきたいです(無料ですし)。
しかしリソースをたくさん作るので、AWSコンソールから一つ一つ停止させるのは面倒くさいです。
- コンソールからサービスを停止させる場合、[1]ECSコンソールに移動 [2]サービスを選択して「更新」 [3]タスク数を0にして「更新確定」 という3ステップを各サービスに対して行う必要があります
- IaCやデプロイツールは本格構築向けなこともあり、丁寧に設定ファイル変更から行う必要があるなど、「複数のリソースをサクッと止める」には向いていません
シェルスクリプト/Goを書いて一括停止していたものの、呼び出し方を忘れたりしてたので、せっかくなら少し真面目にCLIツールにしようと考えました。
インストール方法
以下のコマンドでインストールできます。(Homebrew)
$ brew install t-kikuc/tap/ecstop
入力補完を有効化する場合は、こちらを参照してください。
機能一覧
オプションの詳細はREADMEを参照してください。
1. サービスを一括でゼロスケール
$ ecstop services --cluster xxx
xxxクラスター内の全てのサービスのdesiredCount
を0にします。これによりサービスに紐づくタスクも自動で停止できます。
2. タスクを一括停止
$ ecstop tasks --cluster xxx --standalone
--standalone
フラグは、サービスに紐づいていないタスクを停止します。
タスクのgroup
のprefixがservice:
でないタスクが該当します。
サービスに紐づいたタスクに関しては、停止してもサービスが自動で新しくタスクを起動してしまうので、ecstop services
を使います。
3. コンテナインスタンス(EC2)を一括停止
$ ecstop instances --cluster xxx
xxxクラスターに紐づけられた全てのコンテナインスタンスを停止(≠Terminate)します。
4. 上記3つを一発で実行
$ ecstop all --cluster xxx
このコマンドは下記に相当します。
$ ecstop services --cluster xxx
$ ecstop tasks --cluster xxx --standalone
$ ecstop instances --cluster xxx
その他便利なフラグ
-
--all-cluster
:--cluster xxx
の代わりに、リージョン内の全ECSクラスターに対して停止処理を行います -
--profile yyy
: AWSのプロファイルを指定できます -
--region zzz
: AWSリージョンを指定できます
思想
1. 削除はしない
ecstopは不要なECRイメージやタスク定義の削除はしません。
タスクとコンテナインスタンス(EC2)は稼働コストが高いですが、ECRイメージは比較的安価、タスク定義は無料なので無視しました。サービスとクラスター自体も無料なので削除はしません。
※ そのため、ツール名にcleanやdeleteを入れませんでした。
「もう使ってなくて目障りだから削除したい」ケースでは、どれを削除するのか人間が判断した上で、AWSコンソールから複数選択して削除するのが楽です。
また、ECRイメージの掃除には ecrm というfujiwaraさん作のツールを使うのが良いと思います。
2. 一括に特化
「どのリソースを停止するか」のセレクタオプションを少なくしています。
個別に停止させるならAWSコンソールで十分ですし、そもそも検証環境(staging等ではない)であれば「停止絶対ダメ」なリソースは無いと思います。特に夜間は停止しましょう。
今後の展望
- ecstopをAWS上のスケジュール処理として定期実行したい(毎日24:00など)
- わざわざ呼び出すのが面倒 + ローカルからだとAWS認証が面倒なので
- EventBridge+LambdaのIaCを作るイメージ
- 検証環境向けなので、完了通知は不要そう(エラー通知はどうしようか)
- 今のところ「こんなオプションを追加したい」はないです
- もしご要望あれば検討します
使用した主なツール
一般的なGo CLIの開発スタックと思います。コードも少ないです。
- Go言語
- cobra
- GoReleaser
- Homebrew Taps
おわりに
初めてCLIツールを公開しましたが、思想の定め方含めて学びが多かったです。
フィードバックやご要望あれば、https://github.com/t-kikuc/ecstop からよろしくお願いします。
実はもう一つ、ECS外部デプロイ関連のCLIツールを開発中で、いずれ公開予定です。
外部デプロイの詳細はこちら↓
Discussion