ECSとローカル間でファイルをコピーしたり、対話形式でrun-taskやexecできるデバッグ特化のCLIツールを作りました
はじめに
2021年3月、実行中のコンテナに入ることができる「ECS Exec」がリリースされました。
これがリリースされるまで、ECSでコンテナに入る方法としては、
- ECS on EC2
- EC2にsshした後に
docker exec
する
- EC2にsshした後に
- 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ツールを作りました。
機能紹介
今回作成したecskでは、デバッグ・トラブルシューティング時に欲しくなる機能はもれなく突っ込んでいます。
-
クラスタ、タスクIDなどのリソースを対話形式で選択可能
- タスクIDなどコマンドを実行する上で必要なリソースを指定しなくても、リソース一覧で選択肢が提示されるため、マネコン等で調べる必要がありません
- ecskに実装されているコマンドは全て、対話形式で選択可能です
- 類似した機能を持つツール
-
scpのようにECSとローカル間でファイルをコピー
- 双方向にファイル、ディレクトリをコピーできます
- 現状、これと同じ機能を持つツールは他で見つけられませんでした
-
1コマンドでタスクを実行しログを流す
- AWS CLIで同じことをしようとすると、
aws ecs run-task
してaws ecs wait
でRUNNINGになるまで待機してaws logs tail
する、といった手順が必要となりますが、それが1コマンドで完結できます - 類似した機能を持つツール
- AWS CLIで同じことをしようとすると、
-
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 stop
ecsk stop
対話形式でタスクを選択し、終了します。
こちらも複数指定可能です。
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のように一度導入したら取り替えが難しいものでもないので、気楽に試していただければと思います。
Discussion
普段業務でECSを使っており「これすごく便利じゃん!」とこちらのツールを使ってみたのですが、
どうやら Windows だと一部?使えない機能があるみたいです。
取り急ぎ ecsk cp は
The remote path must be absolute. Try "ecsk cp --help".
と出てエラーになります。 Gitのソースコードを見るに cp.go のfilepath.IsAbs(src[1])
が Windowsの絶対パス形式で判断しちゃうため、ECS(Linux系のコンテナ)の送り元(送り先)パスがC:\\hogehoge
みたいな形式になっていない!と理不尽な怒られ方をしてしまうようです。ちなみに、MACで動かす分には全く問題無いのでMACユーザー間では重宝させていただいております。
ありがとうございます!