[アップデート] 2025年06月25日より Amazon ECS のデフォルトのログドライバーモードが blocking から non-blocking へ変更されます
こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。
AWS Health やメールなどで、通知がすでに飛んでいる方もいらっしゃるかもしれませんが、2025年06月25日より Amazon ECS のデフォルトのログドライバーモードが 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
ログドライバーがログ送信先(CloudWatch Logs)へ送信不良を起こした際に、どのような挙動を取るか指定するためのオプションです。
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",
}
}
このように、アプリケーションの可用性とログ損失にはトレードオフがあります。
アップデート内容
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
で転送している部分に関しては、対象となります。図にすると、次のイメージです。
blocking
モードを利用したい
元の ログの完全性を優先したいため、blocking モードを引き続き利用したい方もいると思います。その場合、アカウント設定にて設定または、タスク定義内に明示的に指定が必要になります。
Set the mode option in your container definition's logConfiguration as blocking.
Set the defaultLogDriverMode account setting to blocking.
アカウント設定
アカウント設定はアカウント自体のデフォルトのログドライバーモードを変更する機能です。
以下は参考になりますが、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
タスク定義
以下のように、各タスク定義の 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 ドライバーのノンブロッキングモードではログ損失を監視することはできません。
Issue で取り上げられていますが、動きがなさそうです。
代替手段として FireLens を設定し、ログやメトリクスから検出する方法が考えられます。
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 を起こさないよう意識する必要があります。
タスクのメモリ量に対して、極端に大きい値を設定しないことをオススメします。必要に応じて、タスクメモリ増強をご検討ください。
参考文献
- AWSLogs コンテナログドライバーのノンブロッキングモードによるログ損失の防止 | Amazon Web Services ブログ
- Choosing container logging options to avoid backpressure | Containers
- Benchmark results for log loss for AWSLogs in non-blocking mode with different values of max-buffer-size · Issue #45999 · moby/moby
- amazon-ecs-firelens-examples/examples/fluent-bit/oomkill-prevention at mainline · aws-samples/amazon-ecs-firelens-examples
- amazon-ecs-firelens-examples/examples/fluent-bit/send-fb-internal-metrics-to-cw at mainline · aws-samples/amazon-ecs-firelens-examples
まとめ
以上、「2025年06月25日より Amazon ECS のデフォルトのログドライバーモードが blocking から non-blocking へ変更されます」でした。
クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!