🐋

ECSでのデバッグが捗るツールを作成しました

2024/12/11に公開

この記事はポート株式会社 サービス開発部 Advent Calendar 2024の11日目の記事です。

はじめに

こんにちは。ポート株式会社でSREチームのマネージャーをしているTaiki130です。

今回は、私が開発したECSでのデバッグに役立つツールecsexecをご紹介します。
このツールは、AWS ECS(on Fargate)で稼働するコンテナに対し、インタラクティブにログインできる機能を提供します。普段からECSでの運用やトラブルシューティングに携わっている方々にとって、役立つものになれば幸いです。

https://github.com/Taiki130/ecsexec

Amazon ECS Exec について

⁠概要

Amazon ECS Exec は、AWS Systems Manager (SSM) セッションマネージャーを活用して、コンテナへのシェルアクセスを可能にする機能です。これにより、コンテナ内で直接デバッグ作業ができるようになります。

⁠感じていた課題

ECS Exec を AWS CLI 経由で利用する際、次のような煩雑なコマンドを実行する必要があります。

aws ecs execute-command --cluster $cluster-name \
    --task $task-id \
    --container $container-name \
    --interactive \
    --command "/bin/sh"

オプションにECSクラスター名、タスクID、コンテナ名を入力する必要があり、毎回AWSコンソールにログインして確認していました。普通にめんどくさいですよね。

ecsexecとは

ecsexecでは、aws ecs execute-commandをする際に必要なオプション(cluster名など)をインタラクティブなセレクタ経由で指定できます。
そのため、クラスタ名やコンテナ名を把握したり、タスク名を確認し、自分で指定する必要がなくなります。

kubectl プラグインの kube-iexec から着想を得ました。

https://github.com/gabeduke/kubectl-iexec

利用前の準備

以下のツールがローカルマシンにインストールされている必要があります(すでにECS Exec を使用している方は準備済みのはずです)

  1. AWS CLI: コマンドラインから AWS リソースを管理するには、AWS Command Line Interface (CLI) が必要です。インストール手順は、AWS ドキュメントに記載されています。
  2. Session Managerプラグイン: ecsexecは内部でsession-manager-pluginを実行しているため、Session Managerプラグインが必要です。インストール手順は、AWSドキュメントに記載されています。

⁠インストール方法

ecsexec は以下の方法で簡単にインストールできます。

Homebrew を使用する場合

brew install Taiki130/ecsexec/ecsexec

Go を使用する場合

ecsexec はGo製なので、go install でインストールできます。

go install -a github.com/Taiki130/ecsexec/cmd/ecsexec@latest

⁠使用方法

特にオプションを指定しないと、インタラクティブなセレクタが表示されます。

% ecsexec

フラグや環境変数でも制御することができます。

# 一部フラグで制御
% ecsexec --region us-east-1 --cluster my-cluster

# 環境変数と併用
% AWS_PROFILE=my-profile ecsexec
% AWS_REGION=us-east-1 ecsexec --cluster my-cluster

フラグと環境変数一覧

% ecsexec -h

NAME:
   ecsexec - Access a shell session within a container running in an ECS task.

USAGE:
   ecsexec [global options] command [command options]

COMMANDS:
   help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --region value     AWS region name. [$AWS_REGION]
   --profile value    AWS profile name. [$AWS_PROFILE]
   --cluster value    ECS cluster name. [$ECSEXEC_CLUSTER]
   --service value    ECS service name. [$ECSEXEC_SERVICE]
   --container value  container name. [$ECSEXEC_CONTAINER]
   --command value    login shell. default: /bin/sh [$ECSEXEC_COMMAND]
   --help, -h         show help

まとめ

普段の業務でも ecsexecを活用することで、デバッグ作業が効率的になりました。ただし、まだ開発したばかりのツールであり、特にmacOS以外の環境では動作確認が十分ではありません。不具合や改善点が出てくると思います。
問題や提案があれば、ぜひ GitHubリポジトリに Issue や Pull Requestを作成していただけると嬉しいです!

明日のアドベントカレンダーは ayaka さんの「Figmaビジネスプラン契約への道【前編】」です!お楽しみに!

GitHubで編集を提案
ポート株式会社 エンジニアブログ

Discussion