💻

ECSとローカル間でファイルをコピーしたり、対話形式でrun-taskやexecできるデバッグ特化のCLIツールを作りました

2021/06/10に公開
1

はじめに

2021年3月、実行中のコンテナに入ることができる「ECS Exec」がリリースされました。
これがリリースされるまで、ECSでコンテナに入る方法としては、

  • ECS on EC2
    • EC2にsshした後にdocker execする
  • ECS on Fargate
    • そもそもできない(Session Managerを使った非公式な方法は除く)

といった状況だったため、このリリースでECS(特にFargate)でのデバッグトラブルシューティングが一気に楽になりました。

aws ecs execute-command --task [タスクID] ... --command '/bin/bash'


ただ、人間欲深い生き物でして、実際にaws ecs execute-commandを使い始めると、今度は、

  • タスクIDをマネコン等で調べるのが手間なので対話形式で選択したい
  • ECSとローカル間でファイルをコピーしたい(scpしたい)

などの欲が新たに発生してしまいます。

「探せばそういうことができるツールがあるんじゃないの」とも思いましたが、現存するECS系ツールはデプロイツールとしての役割を担うものが主で、これらの機能(特にscp)を持つツールは見つけられませんでした。

そこで今回、ECSのデバッグやトラブルシューティングに特化したCLIツールを作りました。

https://github.com/yukiarrr/ecsk

機能紹介

ecsk

https://github.com/yukiarrr/ecsk

今回作成したecskでは、デバッグ・トラブルシューティング時に欲しくなる機能はもれなく突っ込んでいます。

  • クラスタ、タスクIDなどのリソースを対話形式で選択可能
    • タスクIDなどコマンドを実行する上で必要なリソースを指定しなくても、リソース一覧で選択肢が提示されるため、マネコン等で調べる必要がありません
    • ecskに実装されているコマンドは全て、対話形式で選択可能です
    • 類似した機能を持つツール
  • scpのようにECSとローカル間でファイルをコピー
    • 双方向にファイル、ディレクトリをコピーできます
    • 現状、これと同じ機能を持つツールは他で見つけられませんでした
  • 1コマンドでタスクを実行しログを流す
    • AWS CLIで同じことをしようとすると、aws ecs run-taskしてaws ecs waitでRUNNINGになるまで待機してaws logs tailする、といった手順が必要となりますが、それが1コマンドで完結できます
    • 類似した機能を持つツール
  • docker logsのように既存タスクのログを表示
    • uternを利用させていただいるため、タスクのログをコンテナごとにカラー分けして表示できます
    • 類似した機能を持つツール
  • インストールが簡単
    • Go製なので、Releasesからバイナリをダウンロードするだけです
    • Macの方は、brewコマンド一つでインストール可能です

コマンド例

ここでは、よく使うコマンドを紹介します。
詳しいフラグについては、ecsk [コマンド] --helpを実行して確認してください。

ecsk run

ecsk run

フラグを一切指定しない場合は、対話形式でタスク情報を選択した後、docker runと同じようにタスクが起動し終了するまでログが流れ続けます。

ecsk run -e -i --rm -c [コンテナ名] -- /bin/bash

タスクを起動させた後、execute-commandで指定したコマンドを実行します。
合わせて--rmを指定することで、セッション終了時に自動でタスクが終了するため、踏み台サーバーのように運用することが可能になります。

ecsk run -d

対話形式でタスク情報を選択した後、タスクの開始・終了を待たずにコマンドを終了させます。

ecsk exec

ecsk exec -i -- /bin/bash

対話形式でタスク・コンテナを選択し、コマンドを実行します。

ecsk cp

ecsk cp ./ [コンテナ名]:/etc/nginx/

対話形式でタスクを選択し、ローカルからECSへファイルをコピーします。
内部的にはS3 Bucketを使用してファイルを転送しているので、タスクロールに該当Bucketのアクセス許可を追加する必要があります(詳しくはREADME参照)。

なお、コンテナも対話形式で選択する場合は、ecsk cp ./ :/etc/nginx/としてください。

ecsk cp [コンテナ名]:/var/log/nginx/access.log ./

ECSからローカルにファイルをコピーします。

ecsk logs

ecsk logs

対話形式でタスクを選択し、ログを表示します。
このタスクは複数指定することができます。

なお、ログ表示はuternを利用させていただいています。

ecsk-logs

ecsk stop

ecsk stop

対話形式でタスクを選択し、終了します。
こちらも複数指定可能です。

ecsk describe

ecsk describe

対話形式でタスクを選択し、詳細情報を表示します。
また、タスク一覧を確認する用途としても利用できます。

ecsk-describe

インストール

MacOS

brew install yukiarrr/tap/ecsk

Linux

wget https://github.com/yukiarrr/ecsk/releases/download/v0.6.1/ecsk_Linux_x86_64.tar.gz
tar zxvf ecsk_Linux_x86_64.tar.gz
chmod +x ./ecsk
sudo mv ./ecsk /usr/local/bin/ecsk

Windows

Releasesからダウンロードしてください。

まとめ

ecskはコンテナ(タスク)を取り扱うことに長けているので、

  • ECSサービスやタスク定義の管理 → AWS CDKやCopilot、Terraformなどを使用
  • デバッグやトラブルシューティング → ecskを使用 😁

などの利用を想定しています。

基本手元でのみ使う便利ツールで、AWS CDKやCopilotのように一度導入したら取り替えが難しいものでもないので、気楽に試していただければと思います。

https://github.com/yukiarrr/ecsk

Discussion

takayukitakayuki

普段業務でECSを使っており「これすごく便利じゃん!」とこちらのツールを使ってみたのですが、
どうやら Windows だと一部?使えない機能があるみたいです。

取り急ぎ ecsk cp は The remote path must be absolute. Try "ecsk cp --help". と出てエラーになります。
https://github.com/yukiarrr/ecsk/blob/main/pkg/cmd/cp.go#L123
Gitのソースコードを見るに cp.go の filepath.IsAbs(src[1]) が Windowsの絶対パス形式で判断しちゃうため、ECS(Linux系のコンテナ)の送り元(送り先)パスが C:\\hogehoge みたいな形式になっていない!と理不尽な怒られ方をしてしまうようです。

ちなみに、MACで動かす分には全く問題無いのでMACユーザー間では重宝させていただいております。
ありがとうございます!