ようへいの日々精進XP

よかろうもん

ECS クラスタをコマンドラインである程度操作出来る ecm というツールについて紹介させて下さい

この記事は

YAMAP エンジニア Advent Calendar 2020 の 21 日目になる予定です。

qiita.com

頑張るぞ。

tl;dr

YAMAP では、アプリケーションの多くを ECS で運用しています。

ECS クラスタ自体は、構築してしまうと、殆ど手がかからないのが魅力の一つですが、唯一、メンテナンスが必要なのが AMI のバージョンアップです。(Fargate であれば、この限りではありません)

クラスタ一覧の取得を自分の好みの情報で出力させたいという思いもあり、AMI メンテナンス作業を出来るだけ手軽に行う為、ちょっとしたコマンドラインツールを作って利用しているので紹介させて下さい。

課題

ECS クラスタを運用管理する際に、個人的に解決したいと思っていたのは、以下のような課題です。

  • クラスタ一覧表示に ecs-agent のバージョンも出力させたい
  • クラスタ一覧表示は、Fargate と EC2 Backend が混在しているので、フィルタしたい
  • そもそも、マネジメントコンソールにアクセスするのが面倒くさいので、コマンドラインで完結出来ないか
  • コマンドラインで操作出来れば、自動化もしやすいのではないか

これらの課題を解決する為、コマンドラインツールを作ってみました。

それが、ecm です。

ecm

リポジトリ

以下の通りです。

github.com

ライセンスは MIT ライセンスです。

インストールは、取り急ぎ、こちら からパスが通ったディレクトリに放り込めば OK です。

ecm で出来ること

ecm では、先述の個人的な課題を解決する為、以下のような操作が行えるように頑張りました。

  • ECS クラスタの一覧表示
    • Launch Type
    • Container Instance 数
    • Running Task 数
    • Pending Task 数
    • Status
    • クラスタ内の Agent Version の状態 (※ Launch Type が EC2 の場合)
  • ECS クラスタ内のコンテナインスタンスのドレイニング
    • Agent Version を指定した一括ドレイニング
    • コンテナインスタンスを指定した個別ドレイニング

ecm で出来ないこと

以下については、別のツールで管理しているので、ecm には実装していません。

ということで、以降、ecm の使い方について簡単に紹介させて頂きます。

使い方

AWS クレデンシャルを設定

ecmdirenv を利用することを前提で実装されています。

# .envrc
export AWS_PROFILE=YOUR_PROFILE_NAME
export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_REGION=ap-northeast-1

設定したら、以下のように設定を有効化します。

$ direnv allow

ヘルプ

  • 実行例
$ ecm --help
  • 出力例

f:id:inokara:20201220183322p:plain

クラスタ一覧取得

  • 実行例
$ ecm
  • 出力例

f:id:inokara:20201220183340p:plain

-type オプションで Launch Type を指定出来ます。

  • 実行例
$ ecm -type=[EC2|FARGATE]
  • 出力例

f:id:inokara:20201220183632p:plain

複数の Agent Version が同一クラスタ内で稼働している場合、AGENT VERSIONS には Mixed Version と表示されます。

クラスタインスタンス一覧取得

  • 実行例
$ ecm -cluster=sample-cluster
  • 出力例

f:id:inokara:20201220183459p:plain

クラスタインスタンスのドレイニング

  • 実行例
# ${AGENT VERSION} ではない、Agent Version が動いているコンテナインスタンスをまとめて draining する
$ ecm -cluster=${CLUSTER NAME} -drain-all -agent-version=${AGENT VERSION}

例えば、最新の Agent Version が、1.47.0 で、1.47.0 以外の Agent Version が動いているインスタンスをすべて drain したい場合には、以下のように実行します。

$ ecm -cluster=sample-cluster -drain-all -agent-version=1.47.0
  • 実行例
# drain したい ${CONTAINER INSTNACE} を指定する
$ ecm -cluser=${CLUSTER NAME} -drain -instance=${CONTAINER INSTNACE}

尚、全てのクラスタインスタンスを一気にドレイニングする場合、一旦、AutoScaling でクラスタ内のインスタンスを増やしてからドレイニングする必要があります。尚、AutoScaling グループ内のインスタンス台数を操作する際には、これまた拙作の asg というツールを使うことで、マネジメントコンソールをポチポチしなくても、コマンドラインから実行出来ます。

github.com

以上

以上、簡単にオレオレツール ecm について紹介させて頂きました。ecm を利用することで、当初、ポチポチ作業で 2 〜 3 時間掛かっていた ECS の AMI 更新作業が 1 時間程度まで短縮することが出来ました。