ECS + Task = ecsk 😆
ecskは、インタラクティブにAmazon ECS API(run-task, execute-command, stop-task)を呼び出したり、ECSとローカルの間でファイルをコピーしたり、ログを表示したりできるCLIツールです。
ecskはコンテナ(タスク)を取り扱うことに特化しているので、
- ECSサービスやタスク定義の管理 → CDKやTerraformなどを使用
- デバッグ → ecskを使用 😁
などの利用を想定しています。
brew install yukiarrr/tap/ecsk
wget https://github.com/yukiarrr/ecsk/releases/download/v0.9.3/ecsk_Linux_x86_64.tar.gz
tar zxvf ecsk_Linux_x86_64.tar.gz
chmod +x ./ecsk
sudo mv ./ecsk /usr/local/bin/ecsk
Releasesからダウンロードしてください。
ここでは、よく使うコマンドを紹介します。
詳しいフラグについては、ecsk [command] --help
を実行して確認してください。
ecsk run
フラグを一切指定しない場合は、インタラクティブにタスク情報を入力した後、docker run
と同じようにタスクが起動し終了するまでログが流れ続けます。
ecsk run -e -i --rm -c [container_name] -- /bin/sh
タスクを起動させた後、execute-command
で指定したコマンドを実行します。
合わせて--rm
を指定することで、セッション終了時に自動でタスクが終了するため、踏み台サーバーのように運用することが可能になります。
ecsk run -d
インタラクティブにタスク情報を入力した後、タスクの開始・終了を待たずにコマンドを終了させます。
ecsk exec -i -- /bin/sh
インタラクティブにタスク・コンテナを選択し、コマンドを実行します。
ecsk cp ./ [container_name]:/etc/nginx/
インタラクティブにタスクを選択し、ローカルからリモートへファイルをコピーします。
内部的にはS3 Bucketを使用してファイルを転送しているので、タスクロールに該当Bucketのアクセス許可を追加する必要があります。
なお、コンテナもインタラクティブに選択する場合は、ecsk cp ./ :/etc/nginx/
としてください。
ecsk cp [container_name]:/var/log/nginx/access.log ./
リモートからローカルにファイルを転送します。
ecsk logs
インタラクティブにタスクを選択し、ログを表示します。
このタスクは複数指定することができます。
なお、ログ表示はknqyf263/uternを利用させていただいています。
ecsk stop
インタラクティブにタスクを選択し、終了します。
ecsk describe
インタラクティブにタスクを選択し、詳細情報を表示します。
また、タスク一覧を確認する用途としても利用できます。
内部でexecute-command
を実行しているため、いくつかの前提条件があります。
ここでは、公式ドキュメントを参考に、必須項目を紹介します。
下記を参考にしてください。
SSMエージェントとSSMサービス間の通信に必要なアクセス許可を追加する必要があります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
]
}
すでに作成されているサービスのタスクでexecute-command
するためには、ECS Execを有効化する必要があります。
AWS CLIであれば--enable-execute-command
フラグを、CFnであればEnableExecuteCommand
を追加してください。
なお、ecsk run
で起動するタスクに関しては、-e
か--enable-execute-command
フラグを使用してください。
これらのように、前提条件が多めとなっているので、ecskではエラー時にaws-containers/amazon-ecs-exec-checkerを実行するようにしています。
ファイルの受け渡しにS3 Bucketを用いているため、タスクロールに該当Bucketのアクセス許可を追加する必要があります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::[bucket_name]",
"arn:aws:s3:::[bucket_name]/ecsk_*"
]
}
]
}