🌬️

ECSリソースをサクッと一括停止するツール「ecstop」を作リました

2024/12/21に公開

はじめに

2024/12/20にecstopという「ECSリソースをサクッと一括停止」するだけのCLIツールを開発・公開しました。

https://github.com/t-kikuc/ecstop

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さん作のツールを使うのが良いと思います。
https://github.com/fujiwara/ecrm

2. 一括に特化

「どのリソースを停止するか」のセレクタオプションを少なくしています。
個別に停止させるならAWSコンソールで十分ですし、そもそも検証環境(staging等ではない)であれば「停止絶対ダメ」なリソースは無いと思います。特に夜間は停止しましょう。

今後の展望

  • ecstopをAWS上のスケジュール処理として定期実行したい(毎日24:00など)
    • わざわざ呼び出すのが面倒 + ローカルからだとAWS認証が面倒なので
    • EventBridge+LambdaのIaCを作るイメージ
    • 検証環境向けなので、完了通知は不要そう(エラー通知はどうしようか)
  • 今のところ「こんなオプションを追加したい」はないです
    • もしご要望あれば検討します

使用した主なツール

一般的なGo CLIの開発スタックと思います。コードも少ないです。

おわりに

初めてCLIツールを公開しましたが、思想の定め方含めて学びが多かったです。
フィードバックやご要望あれば、https://github.com/t-kikuc/ecstop からよろしくお願いします。

実はもう一つ、ECS外部デプロイ関連のCLIツールを開発中で、いずれ公開予定です。
外部デプロイの詳細はこちら↓
https://zenn.dev/cadp/articles/ecs-external

サイバーエージェント Developer Productivity室

Discussion