ようへいの日々精進XP

よかろうもん

俺のギョームツール達 (1) 〜 ECS サービス (Service) のタスク数を管理するツール tsumikata 〜

tl;dr

俺が俺のギョームの為に作ったツール達を紹介する「俺のギョームツール達」の第一弾です. 第二弾は無いかもしれませんが, 今回, 恥ずかしげもなく紹介するのは, Amazon ECS サービス (Service) のタスク数を操作したり, クラスタの全サービスを起動, 停止できるコマンドラインツールのご紹介でございます. ただの自己満足ですが, 意外とギョームで役に立ったので振り返りも兼ねて書かせて頂きます.

そして, この記事は...

YAMAP エンジニア Advent Calendar 2019 の 8 日目の記事になる予定です.

qiita.com

俺のギョームツール

tsumikata (積み方)

github.com

名前は何がいいかなーって, 適当に「コンテナ」で検索していたら, リアルな荷物を乗せるコンテナを船に載せるときに積み方が色々とあるということを知りました. あー, このツールもサービスのコンテナの積み方 (起動数) 等を管理出来るなーって思って付けました. ネーミングセンスは皆無ですし, プログラミング力も皆無です. すいません.

なんで作ったのか

深夜メンテナンス作業等で, ECS サービスのタスク数を一時的に変更する際にマネジメントコンソールをポチポチするのがあまりに辛かったのでコマンドラインからシュッとクラスタ内の全サービスを停止したり起動したり出来たら幸せになれるなーと思って作りました.

Amazon ECS のサービス (Service) とは

もはや説明不要, これです.

f:id:inokara:20191207183212p:plain

ECS の世界では, タスク 1 つ, 1 つが Docker コンテナとなり, サービス (Service) とはタスクを用いて ELB 等と連動して継続的にリクエストを処理する管理単位となります. 先日の re:Invent では Fargate が Spot で利用出来るようになったりと追いきれないアップデートラッシュの中にあっても, ECS の サービス (Service) という基本的な概念なので必ず覚えておきましょう (自分).

こだわり

たいしたこだわりではないんですが, tsumikata は docker-compose で実行することが可能です. というか, リポジトリの README は docker-compose で実行している例を記載しています. docker-compose というか, Docker をコマンドラインツールのランタイムとして利用することで, 実行する環境依存を出来るだけ減らせると考えています. もちろん, 以下のように実行することも可能です.

$ ruby tsumikata.rb list --cluster=${YOUR_ECS_CLUSTER}

どんな感じなのか

以下は tsumikata を動かしている様子です.

oreno-fargate-cluster クラスタ内のサービス一覧を ruby tsumikata.rb list --cluster=oreno-fargate-cluster で確認. --json オプションを付けると JSON フォーマットで書き出すことが可能です. この JSON フォーマットファイルは後から up サブコマンドでクラスタを起動する場合に利用することが出来ます.

$ docker-compose run --rm list --cluster=oreno-fargate-cluster
+---------+----------+---------+---------+--------+--------+
| Name    | Task     | Desired | Running | Status | MinCap |
+---------+----------+---------+---------+--------+--------+
| sample1 | docker:5 | 0       | 0       | ACTIVE |        |
| sample2 | docker:5 | 0       | 0       | ACTIVE |        |
| sample3 | docker:5 | 0       | 0       | ACTIVE |        |
+---------+----------+---------+---------+--------+--------+
$ docker-compose run -T --rm list --cluster=oreno-fargate-cluster --json
[
  {
    "Name": "sample1",
    "Task": "docker:5",
    "Desired": 0,
    "Running": 0,
    "Status": "ACTIVE",
    "MinCap": ""
  },
  {
    "Name": "sample2",
    "Task": "docker:5",
    "Desired": 0,
    "Running": 0,
    "Status": "ACTIVE",
    "MinCap": ""
  },
  {
    "Name": "sample3",
    "Task": "docker:5",
    "Desired": 0,
    "Running": 0,
    "Status": "ACTIVE",
    "MinCap": ""
  }
]

down サブコマンドを利用すると全てのサービスのタスクを 0 に変更してサービスを停止することが出来ます. 仮にサービスに AutoScaling が設定されている場合, Minimum Capcity の値を 0 に変更して強制的にサービス止めてしまいます.

$ docker-compose run --rm down --cluster=oreno-fargate-cluster
Do you want to continue?: [Y/n] y

Change desired size of tasks in sample1 to 0.
Changed.
Change desired size of tasks in sample2 to 0.
Changed.
Change desired size of tasks in sample3 to 0.
Changed.

改めて, サービスを起動したい場合, 最初に作成した JSON ファイルの Desired キーの値を調整することで, 指定した値のタスクを起動することが可能です. ただし, 起動出来るタスク数はコンテナインスタンスのリソースサイズに影響を受けるので注意が必要です. (コンテナインスタンスのスケールアウト等は自動的に行われません)

$ docker-compose run --rm up --cluster=oreno-fargate-cluster --file=oreno-fargate-cluster.json
Do you want to continue?: [Y/n] y
Change desired size of tasks in sample1 to 1.

Changed.
Change desired size of tasks in sample2 to 1.
Changed.
Change desired size of tasks in sample3 to 1.
Changed.

ある程度ですが, 自在にサービスの起動や停止を行うことが可能となります.

出来ること出来ないこと

出来ること

  • タスクの希望する起動数の変更
  • クラスタ内の全サービスの停止, AutoScaling のキャパシティ変更

出来ないこと

  • タスクそのもののの追加や削除
  • Gem 化出来ていないので, bundle install とかでインストール出来ない

以上

俺のギョームツールを紹介させて頂きました. 素敵な師走をお過ごしください.