Amazon Elastic Container Service (Amazon ECS) タスクまたは Amazon Elastic Kubernetes Service (Amazon EKS) ポッドのコンテナログが見つかりません。
簡単な説明
Amazon ECS または Amazon EKS のコンテナログが見つからない場合は、ホストインスタンスに問題がある可能性があります。また、コンテナ化されたアプリケーションが正しい場所に書き込んでいない場合、ログが Docker デーモンから不可視になる可能性があります。
コンテナ化されたアプリケーションがログの一部またはすべてを書き込んでいない場合の、一般的なシナリオを次に示します。
- Amazon ECS のコンテナインスタンスで docker logs yourContainerName コマンドを実行します。
- Amazon ECS のタスクに awslogs log driver を使用します。
- Amazon EKS クラスターに対して kubectl logs yourPodName コマンドを実行します。
解決策
Amazon ECS タスクに関するログのトラブルシューティング
タスクが正しく設定されていることを確認する
- ログが保存されているコンテナのログ設定を確認します。ログドライバーは、ECS タスク定義のコンテナ定義セクションにある、logConfiguration パラメータによって設定されます。ログドライバーはコンテナごとに設定されます。ECS タスクに複数のコンテナ定義がある場合は、ログを含むコンテナのログ設定が正しいことを確認します。
- コンテナインスタンスのタスククリーンアップ設定を確認します。Amazon ECS コンテナエージェントは、ログファイルを自動的に削除して空き容量を再確保します。コンテナインスタンスでログファイルをより長く保存するには、タスクのクリーンアップ頻度を減らしてください。
CloudWatch ログを確認する
タスクが awslogs ログドライバーを使用する場合、ログは Amazon CloudWatch Logs にストリーミングされます。これらのログはコンテナインスタンスに書き込まれることはありません。docker logs yourContainerName コマンドは、次のエラーメッセージを返します。 「デーモンからのエラー応答: 設定されたロギングドライバーは読み取りをサポートしていません。」
正しいアクセス許可を付与する
Amazon Elastic Compute Cloud (Amazon EC2) 起動タイプを CloudWatch Logs にストリーミングできるようにするには、コンテナインスタンスの IAM ロールにアクセス許可を付与します。
AWS Fargate 起動タイプを CloudWatch Logs にストリーミングできるようにするには、タスクが使用するタスク IAM ロールにアクセス許可を付与します。
それでもログが見つからない場合は、「アプリケーションコンテナのトラブルシューティング」セクションの手順を実行してください。
Amazon EKS 上の Kubernetes ポッドに関するログのトラブルシューティング
ポッドのコンテナから生成されたログファイルを返すには、次の kubectl コマンドを実行します。
kubectl logs yourPodName
注: ポッドが終了した後、kubelet は自動的にログファイルを削除します。詳細については、Kubernetes のウェブサイトで「未使用のコンテナとイメージのガベージコレクション」を参照してください。これらのログファイルをワーカーノードに長く保存するには、ガベージコレクションの実行頻度を低くするように kubelet を設定します。
それでもログが見つからない場合は、「アプリケーションコンテナのトラブルシューティング」セクションの手順を実行してください。
アプリケーションコンテナのトラブルシューティング
アプリケーションコンテナのトラブルシューティングを行うには、次のタスクを実行します。
- コンテナのビルド中に、アプリケーションを正しいログレベルに設定します。
注: アプリケーションによっては、環境変数または設定ファイルを使用してログ記録を設定する必要がある場合があります。
- アプリケーションをコンテナの ENTRYPOINT にします。詳細については、Docker Docs のウェブサイトで「ENTRYPOINT」を参照してください。
注: dockerfile 内の ENTRYPOINT は、STDOUT および STDERR I/O ストリームをログに記録するプロセスです。詳細については、Docker Docs のウェブサイトで「コンテナログの表示」を参照してください。
- STDOUT と STDERR にリンクされたアプリケーションログファイルを使用してコンテナを構築します。または、/proc/1/fd/1 (stdout) および /proc/1/fd/2 (stderr) に直接ログを記録するようにアプリケーションを設定します。例については、Docker Hub のウェブサイトで nginx と httpd の公式コンテナイメージを参照してください。
注: ユースケースで許容される場合、アプリケーションがコンテナ内の親プロセスを処理するようにしてください。コンテナが ENTRYPOINT としてシェルスクリプトを使用している場合は、実行時にコンテナデータを初期化するようにスクリプトを設定します。