ECSにて、コンテナ内のcrondで起動したアプリケーションログがログドライバで指定した箇所に出力されません

テクニカルサポートノート。サービス名: ECS, Docker
2020.04.13

困っていた内容

ECSで起動したコンテナ内でcrondにて色々なアプリケーションを起動させています。
タスクのログドライバにはawslogsを指定しているのですが、CloudWatch Logsにログが出力されません。どうしてでしょうか?

どう対応すればいいの?

ログドライバは、コンテナのメインプロセス(PID1)の標準出力・標準エラー出力が処理対象になります。
crondで起動したプロセスのPIDは1にならないため、ロギングドライバのログ収集対象にはなりません。
(ログドライバがawslogs以外の場合も、対象にはなりません)

対処法は以下の2通りあります。

(1) コンテナ内crondの利用をやめる場合
対象のアプリケーションをPID1としたコンテナイメージを用意し、
ECSのタスクスケジューリング機能を利用してタスクを定期起動する。
タスクのスケジューリング (cron) - Amazon Elastic Container Service

(2) コンテナ内crondの利用をやめられない場合
cronで起動するプログラムのログをコンテナにマウントしたボリューム内にファイルとして出力。
同タスク内のサイドカーコンテナ(CloudWatch Logs Agent, Fluentdなど)にも同じボリュームをマウントし、希望の場所にログを転送する。

参考情報

Docker - Docker Reference Architecture: Docker Logging Design and Best Practices

テクニカルサポートノートとは?

クラスメソッドのカルチャー(CLP) の「情報発信を通じて、全ての人々の創造活動に貢献し続ける」という考えから、クラスメソッド メンバーズをご利用のお客様よりいただいたお問い合わせより、他の AWS ユーザーにとっても 有益な情報を一般的な TIPS としてご紹介しています。