Fargate で ECS Exec の SSM エージェントログを取得する方法を教えてください

2023.09.12

困っていた内容

Fargate タスクに ECS Exec で接続できません。
トラブルシューティングのため SSM エージェントのログを取得したいので、取得方法を教えてください。

どう対応すればいいの?

タスク定義のcommandに次の値を指定してください。

bin/bash,-c,sleep 2m && cat /var/log/amazon/ssm/amazon-ssm-agent.log

タスク定義パラメータ - Amazon Elastic Container Service

command
型: 文字列配列

必須: いいえ

コンテナに渡されるコマンド。このパラメータは Docker Remote API のコンテナの作成セクションの Cmd にマッピングされ、COMMAND パラメータは docker run にマッピングされます。

Amazon ECS Exec ではコンテナ内で SSM エージェントが実行されています。

トラブルシューティングで SSM エージェントのログを確認したい場合、タスク定義のコンテナ定義内で設定するcommandにログを取得するコマンドを指定してください。

取得されたログは、ログドライバーを経由して (awslogs ログドライバーの場合)CloudWatch Logsに保管されます。

なお、タスク定義のcommandは Dockerfile のCMDを上書きするので、コンテナで実行されるはずのアプリケーション等が起動しなくなる場合がありますので、ご注意ください。

Dockerfile リファレンス — Docker-docs-ja 24.0 ドキュメント

docker run で引数を指定すると、 CMD で指定されているデフォルトの挙動を上書きできます。

やってみた

Amazon ECS コンソールの「タスク定義」から変更したいタスク定義名を選択します。

ベースとなるタスク定義を選択し、「新しいリビジョンの作成」→「新しいリビジョンの作成」をクリックします。

「Docker 設定」セクションをクリックします。

「コマンド」にエージェントログを取得するコマンドを入力し、「作成」をクリックします。

bin/bash,-c,sleep 2m && cat /var/log/amazon/ssm/amazon-ssm-agent.log

タスク定義が正常に作成されたことを確認します。

ECS サービスなどの設定を更新し、作成したタスク定義でタスクを実行してください。

タスク起動後、約2分後に CloudWatch Logs に SSM エージェントログが記録されます。

ログのサンプル

2023-09-01 01:01:01 INFO Proxy environment variables:
2023-09-01 01:01:01 INFO no_proxy: 
2023-09-01 01:01:01 INFO https_proxy: 
2023-09-01 01:01:01 INFO http_proxy: 
2023-09-01 01:01:01 INFO Agent will take identity from ECS
2023-09-01 01:01:01 INFO [amazon-ssm-agent] using named pipe channel for IPC
2023-09-01 01:01:01 INFO [amazon-ssm-agent] using named pipe channel for IPC
2023-09-01 01:01:01 INFO [amazon-ssm-agent] using named pipe channel for IPC
2023-09-01 01:01:01 INFO [amazon-ssm-agent] amazon-ssm-agent - v3.2.582.0
2023-09-01 01:01:01 INFO [amazon-ssm-agent] OS: linux, Arch: amd64
2023-09-01 01:01:01 INFO [amazon-ssm-agent] Starting Core Agent

なお、ログの出力先はタスク定義で指定した設定に依存し、CloudWatch Logs 以外になる場合があります。
ログの出力先はタスク定義をご確認ください。

参考資料

Amazon ECS Exec が問題を特定するためのログを生成する