[アップデート] 2025年06月25日より Amazon ECS のデフォルトのログドライバーモードが blocking から non-blocking へ変更されます

[アップデート] 2025年06月25日より Amazon ECS のデフォルトのログドライバーモードが blocking から non-blocking へ変更されます

Clock Icon2025.05.12

こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。

AWS Health やメールなどで、通知がすでに飛んでいる方もいらっしゃるかもしれませんが、2025年06月25日より Amazon ECS のデフォルトのログドライバーモードが blocking から non-blocking へ変更となります。

2025-05-12 at 18.59.00-Amazon ECS task definition parameters for the Fargate launch type - Amazon Elastic Container Service.png

Note
On June 25, 2025, Amazon ECS is changing the default log driver mode from blocking to non-blocking to prioritize task availability over logging. To continue using the blocking mode after this change, do one of the following:

Set the mode option in your container definition's logConfiguration as blocking.

Set the defaultLogDriverMode account setting to blocking.

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html

ログドライバーモード

ログドライバーのブロッキングモード(通称、ログドライバーモード)とは、awslogs ログドライバーがログ送信先(CloudWatch Logs)へ送信不良を起こした際に、どのような挙動を取るか指定するためのオプションです。

image.png
AWSLogs コンテナログドライバーのノンブロッキングモードによるログ損失の防止 | Amazon Web Services ブログ より画像引用

モードは 2 種類あり、次のような違いがあります。

blocking

標準出力/標準エラー出力への書き込み呼び出しがブロックされ、コードの実行が停止します。ロギングスレッドがブロックされるため、アプリケーションが機能しなくなり、ヘルスチェックの失敗やタスクの終了につながる可能性があります。必要なロググループまたはログストリームを作成できない場合、コンテナの起動に失敗します。

ビジネスクリティカルなトランザクションを記録する場合や、ログの完全性が規制で義務付けられている場合は、こちらのモードを選びます。

non-blocking

送信不良が発生した場合、インメモリバッファにログを格納するモードです。バッファを使い切ると、ログが失われますが、stdout または stderr への書き込み呼び出しはブロックされません。ただし、ECS on Fargate でホストするコンテナの場合、コンテナ起動時にロググループまたはログストリームを作成できない場合、コンテナの起動が失敗します。

ログルーティング先が利用できなくなってもアプリケーションは動作を継続できるため、ログの取得がアプリケーションにとって重要でない場合は可用性が向上します。

バッファサイズはタスク定義内の max-buffer-size で指定します。

"logConfiguration": {
    "logDriver": "awslogs",
    "options": {
        "mode": "non-blocking",
        "max-buffer-size": "25m",
    }
}

https://aws.amazon.com/jp/blogs/news/preventing-log-loss-with-non-blocking-mode-in-the-awslogs-container-log-driver/

このように、アプリケーションの可用性とログ損失にはトレードオフがあります。

アップデート内容

2025年06月25日より以前では、アカウント設定/タスク定義の両方でログドライバーモードを明示的に指定しない場合、 blocking モードが利用されていました。

今回のアップデートで blocking モードから、non-blocking へ変更となります。

Note
On June 25, 2025, Amazon ECS is changing the default log driver mode from blocking to non-blocking to prioritize task availability over logging. To continue using the blocking mode after this change, do one of the following:

Set the mode option in your container definition's logConfiguration as blocking.

Set the defaultLogDriverMode account setting to blocking.

awslogs ドライバーが対象

そもそも論なのですが、このログドライバーモードは awslogs ドライバーが対象です。たとえば、ログドライバーに FireLens を利用している場合は、この仕様変更を受けません。

ただし、FireLens のログを awslogs で転送している部分に関しては、対象となります。図にすると、次のイメージです。

Untitled(171).png

元の blocking モードを利用したい

ログの完全性を優先したいため、blocking モードを引き続き利用したい方もいると思います。その場合、アカウント設定にて設定または、タスク定義内に明示的に指定が必要になります。

Set the mode option in your container definition's logConfiguration as blocking.
Set the defaultLogDriverMode account setting to blocking.

mode

アカウント設定

アカウント設定はアカウント自体のデフォルトのログドライバーモードを変更する機能です。

以下は参考になりますが、AWS CLI で設定するコマンド例です。

# 設定値の確認
aws ecs list-account-settings --name defaultLogDriverMode --effective-settings
# Blocking モードへの変更
aws ecs put-account-setting-default --name defaultLogDriverMode --value "blocking"
# 再度、設定値の確認
aws ecs list-account-settings --name defaultLogDriverMode --effective-settings

https://dev.classmethod.jp/articles/amazon-ecs-set-default-log-driver-blocking-mode/

タスク定義

以下のように、各タスク定義の logConfiguration にて設定します。

"logConfiguration": {
    "logDriver": "awslogs",
    "options": {
        "mode": "blocking"
    }
}

優先順位

AWS のデフォルト(non-blocking)> デフォルトのログドライバーモード > タスク定義のログドライバーモードの順番で適用されます。

想定質問

ここからは、個人的に本仕様の変更において、想定される質問をまとめてました。

アカウント設定はリージョンごとに必要か?

はい、必要です。

利用しているリージョンごとに PutAccountSettingDefault を指定してください。

for region in $(aws ec2 describe-regions --query "Regions[].RegionName" --output text); do
  echo "=== $region ==="
  
  echo "[1] 設定値の確認"
  aws ecs list-account-settings --name defaultLogDriverMode --effective-settings --region "$region"
  
  echo "[2] Blocking モードへの変更"
  aws ecs put-account-setting-default --name defaultLogDriverMode --value "blocking" --region "$region"
  
  echo "[3] 再度、設定値の確認"
  aws ecs list-account-settings --name defaultLogDriverMode --effective-settings --region "$region"
  
  echo ""
done

ログの損失を通知できるか?

いいえ、執筆時点で AWSLogs ドライバーのノンブロッキングモードでは、ログ損失を監視することはできません。

AWSLogs ドライバーのノンブロッキングモードではログ損失を監視することはできません。

https://aws.amazon.com/jp/blogs/news/preventing-log-loss-with-non-blocking-mode-in-the-awslogs-container-log-driver/

Issue で取り上げられていますが、動きがなさそうです。

https://github.com/moby/moby/issues/45953

代替手段として FireLens を設定し、ログやメトリクスから検出する方法が考えられます。

Overlimit warnings

Send Fluent Bit internal Metrics to CloudWatch

既存の ECS タスクは自動的にノンブロッキングモードに切り替わるか?

いいえ、タスクの置き換え後に変更が反映されます。

ノンブロッキングモードを利用する際の推奨バッファサイズはありますか?

AWS Blog では、次のようなテスト結果が記載されています。

  • max-buffer-size が >= 4MB の場合、コンテナーからのログ出力速度が <= 2 MB/s であれば、ログ損失は発生しません。
  • max-buffer-size が >= 25 MB の場合、コンテナーからのログ出力速度が <= 5MB/s であれば、ログ損失は発生しません。
  • 6 MB/秒を超えると、AWSLogs ドライバーのパフォーマンスは予測しにくくなり、一貫性も失われます。例えば、100 MB のバッファで 7 MB/秒という例外的なテストで失敗しました。6 MB/秒以上(持続またはバースト)でログを記録する場合、時折発生するログの損失を防げない可能性があります。
  • Amazon EC2 起動タイプ上の Amazon ECS と AWS Fargate 起動タイプを比較した場合、結果は同様です。

AWSLogs コンテナログドライバーの非ブロッキングモードでログ損失を防ぐ
Benchmark results for log loss for AWSLogs in non-blocking mode with different values of max-buffer-size #45999

あくまで検証データですので、利用状況(ログの流量)に合わせて調整/検証しましょう。

Max Buffer Size の大きさはアプリケーションに影響があるのか

ノンブロッキングモードの仕組み上、送信不良を起こした際、インメモリバッファに Max Buffer Size で指定した大きさ分ログを保持する可能性があります。

その分、メモリを保持することになりますので、アプリケーションプロセス側で OOM を起こさないよう意識する必要があります。

タスクのメモリ量に対して、極端に大きい値を設定しないことをオススメします。必要に応じて、タスクメモリ増強をご検討ください。

参考文献

まとめ

以上、「2025年06月25日より Amazon ECS のデフォルトのログドライバーモードが blocking から non-blocking へ変更されます」でした。

クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.