Fargate で ECS Exec の SSM エージェントログを取得する方法を教えてください
困っていた内容
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 が問題を特定するためのログを生成する