🧩

ecstaを使ってAmazon ECSコンテナ開発効率を上げよう!

2022/11/24に公開

Amazon ECSでコンテナ開発・運用していると、デバッグのためにコンテナに入って調査したり、タスク起動失敗時のログを調査したり、Fargateを踏み台にポートフォワードなどのように、アドホックにコンテナを操作したいことがあります。

そんなときにぴったりなのが、ecspressoの開発でもお馴染み @fujiwara さん作による ecsta("ECS Task Assistant") です。

https://github.com/fujiwara/ecsta

ECS利用者にとって、スイスアーミーナイフのように役立ってくれるでしょう。

https://twitter.com/fujiwara/status/1594946509937684480

注意

ecsta はアルファ版です。
バグや将来的な仕様変更は大いにあります。

自己責任でご利用ください。

機能一覧

helpコマンドから、以下の機能を確認できます

  • タスクをlist
  • タスクをdescribe
  • タスクのログを表示
  • タスクのイベント・ログを時系列順に表示
  • タスクの停止
  • ECS Exec
  • タスクを踏み台にしたポートフォワード
$ ecsta --help
Usage: ecsta <command>

Flags:
  -h, --help              Show context-sensitive help.
  -c, --cluster=STRING    ECS cluster name ($ECS_CLUSTER)
  -r, --region=STRING     AWS region ($AWS_REGION)
  -o, --output="table"    output format (table, tsv, json)

Commands:
  configure
    Create a configuration file of ecsta

  describe
    Describe tasks

  exec
    Execute a command on a task

  list
    List tasks

  logs
    Show log messages of a task

  portforward --local-port=INT --remote-port=INT
    Forward a port of a task

  stop
    Stop a task

  trace
    Trace a task

  version
    Show version

Run "ecsta <command> --help" for more information on a command.

以下では、いくつかの機能を実際に触ってみます。

すべて直感的に操作可能です。

インストール方法

Macから

$ brew install fujiwara/tap/ecsta

バイナリをダウンロード

タスクを一覧表示

$ ecsta list --cluster test
|                ID                |  TASKDEFINITION  | INSTANCE | LASTSTATUS | DESIREDSTATUS |      CREATEDAT       |    GROUP    |  TYPE   |
+----------------------------------+------------------+----------+------------+---------------+----------------------+-------------+---------+
| ae8bd3553e9247308fd488b268de766b | sample-fargate:1 |          | RUNNING    | RUNNING       | 2022-11-23T14:39:55Z | service:web | FARGATE |

タスクのイベント・ログを時系列順に表示

対象のタスクをドリルダウンしながら、タスクのイベント・ログを時系列順に表示します。

$ ecsta trace  
test
Enter cluster name: test
cluster name=test
ae8bd3553e9247308fd488b268de766b        sample-fargate:1                RUNNING RUNNING 2022-11-23T14:39:55Z    service:web     FARGATE
Enter task ID: ae8bd3553e9247308fd488b268de766b
task ID=ae8bd3553e9247308fd488b268de766b
Tracer: arn:aws:ecs:eu-central-1:123456789012:task/test/ae8bd3553e9247308fd488b268de766b on test
2022-11-23T14:39:55.818Z        TASK    Created
2022-11-23T14:39:55.848Z        SERVICE (service web) has started 1 tasks: (task ae8bd3553e9247308fd488b268de766b).
2022-11-23T14:39:59.199Z        TASK    Connected
2022-11-23T14:40:07.354Z        TASK    Pull started
2022-11-23T14:40:11.905Z        TASK    Pull stopped
2022-11-23T14:40:13.113Z        TASK    Started
2022-11-23T14:40:14.504Z        SERVICE (service web) has reached a steady state.
2022-11-23T17:11:54.763Z        CONTAINER:fargate-app   LastStatus:RUNNING HealthStatus:UNKNOWN
2022-11-23T17:11:54.763Z        TASK    LastStatus:RUNNING

ドリルダウンは他のコマンドでも利用可能です。

クラスターとタスクIDを直接指定することもできます。

$ ecsta trace --cluster test --id ae8bd3553e9247308fd488b268de766b
Tracer: arn:aws:ecs:eu-central-1:123456789012:task/test/ae8bd3553e9247308fd488b268de766b on test
2022-11-23T14:39:55.818Z        TASK    Created
2022-11-23T14:39:55.848Z        SERVICE (service web) has started 1 tasks: (task ae8bd3553e9247308fd488b268de766b).
...

fujiwara さん作のtracertというツールがありますが、その機能が ecsta の1機能として取り込まれています。

ECS Exec

Amazon ECS にはコンテナをインタラクティブにシェル操作する ECS Exec という機能があります(docker execのECS版)。

ecsta exec はそのラッパーです。クラスター名とタスクIDを指定します。

$ ecsta exec --cluster test --id ae8bd3553e9247308fd488b268de766b

Starting session with SessionId: ecs-execute-command-0195ed1b7b9b3d795
# 

ポートフォワード

ECS ExecはAWS Systems Manager Session Managerを利用して機能が実現されています。
別の言い方をすると、同サービスで提供されている機能は、SSM AgentがインストールされたECS Fargate環境でも利用できるということです。

ポートフォワードの設定

Systems Manager Session Managerの便利な機能の一つにポートフォワードがあります。

この機能を利用し、ECS Faragetを踏み台にして、同じVPC内のRDSに接続するには、以下のコマンドを実行します。

$ ecsta portforward \
  --local-port=3306 \
  --remote-port=3306 \
  --remote-host=テスト.XXX.リージョン.rds.amazonaws.com \
  --cluster=test \
  --id=ae8bd3553e9247308fd488b268de766b

Starting session with SessionId: xxx-0b67d5c7e0df166e9
Port 3306 opened for sessionId xxx-0b67d5c7e0df166e9.
Waiting for connections...

Connection accepted for session [xxx-0b67d5c7e0df166e9]

このコマンドでは、リモートホスト(テスト.XXX.リージョン.rds.amazonaws.com)の 3306 ポートをローカルの 3306 ポートにフォワードしています。

クライアント環境から接続

ポートフォワードした状態で、クライアント環境の別ターミナルから、ローカルホストの 3306 ポートに接続します。

$ mysql -h localhost --protocol=tcp -u admin -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 39
Server version: 10.3.34-MariaDB-log Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

無事接続できました。

最後に

fujiwaraさん作のECSタスク関連操作にフォーカスした新しいツールecstaを紹介しました。

まだアルファ版ですが、主要機能は実装済みであり、過去の資産を活かしているためか、高品質に感じました。

ECS利用者は一度評価してみましょう。

Discussion