Amazon Elastic Container Service (Amazon ECS) タスク、または Amazon Elastic Kubernetes Service (Amazon EKS) ポッドのコンテナログを見つけることができません。
簡単な説明
コンテナ化されたアプリケーションは、以下の場合にログの書き込みの一部、またはすべてを実行しません。
- Amazon ECS にあるコンテナインスタンスで「docker logs yourContainerName」コマンドを実行する。
- Amazon ECS のタスクに awslogs ログドライバー を使用する。
- Amazon EKS クラスターに「kubectl logs yourPodName」コマンドを実行する。
以下の場合に問題が発生する可能性があります。
- ホストインスタンスに問題がある。
- コンテナ化されたアプリケーションが適切な場所に書き込みを行っていないので、Docker デーモンがログを認識できない。
解決方法
Amazon ECS タスクのログを見つける
ログを見つけることができるようにタスクが正しく設定されているかを知るには、以下の点を確認してください。
タスクが awslogs ログドライバを使用している場合は、以下の条件が当てはまります。
- ログは Amazon CloudWatch Logs にストリーミングされる。これらのログがコンテナインスタンスに書き込まれることはありません。
- 「docker logs yourContainerName」コマンドが「Error response from daemon: configured logging driver does not support reading」というメッセージを返す。
EC2 起動タイプが CloudWatch Logs にストリームできるようにするには、コンテナインスタンスが使用する IAM ロールにアクセス許可を付与します。
AWS Fargate 起動タイプが CloudWatch Logs にストリームできるようにするには、タスクが使用するタスク実行ロールにアクセス許可を付与します。
それでもログが欠落している場合は、「コンテナをトラブルシューティングする」セクションにある手順を実行してください。
Amazon EKS で Kubernetes ポッドのログを見つける
ポッドのコンテナから生成されたログファイルを戻すには、以下の kubectl コマンドを実行します。
kubectl logs yourPodName
注意: kubelet はポッドの終了後にログファイルを自動的に削除します。詳細については、Kubernetes ウェブサイトの「Container collection」を参照してください。ワーカーノードでのログファイルの維持期間を長くするには、kubelet がガベージコレクションを実行する頻度を減らします。
それでもログが欠落している場合は、「コンテナをトラブルシューティングする」セクションにある手順を実行してください。
コンテナのトラブルシューティング
アプリケーションで次のオプションを検討してください。
- コンテナの構築時に、アプリケーションを正しいログレベルに設定する。
注意: お使いのアプリケーションによっては、環境変数経由で、または設定ファイル内でログ記録を設定することが必要となる場合があります。
- アプリケーションをコンテナの ENTRYPOINT に設定する。詳細については、Docker Docsのウェブサイトの「ENTRYPOINT」を参照してください。
注意: dockerfile 内の ENTRYPOINT は、STDOUT と STDERR I/O の各ストリームが Docker Docs ウェブサイトにログされるプロセスです。詳細については、Docker Docs ウェブサイトの「View logs for a container or service」を参照してください。
- STDOUT と STDERR にリンクされたアプリケーションログファイルでコンテナを構築、または /proc/1/fd/1 (stdout) と /proc/1/fd/2 (stderr) に直接ログを記録するようにアプリケーションを設定する。例については、Docker Hub ウェブサイトで公式の nginx および httpd コンテナイメージを参照してください。
注意: 可能な場合は、アプリケーションプロセスをコンテナ内の親プロセスにしてください。コンテナが ENTRYPOINT としてシェルスクリプトを使用している場合は、ランタイムにコンテナデータを初期化するようスクリプトを設定してください。詳細については、Docker Docsのウェブサイトの「ENTRYPOINT」を参照してください。