ECSにて、コンテナ内のcrondで起動したアプリケーションログがログドライバで指定した箇所に出力されないときの対処方法

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

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

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