ECS タスクで OutOfMemoryError が記録されてタスクが終了するときの対処方法

2023.01.11

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

困っていた内容

Fargate で自社アプリを稼働させていますが、一部 ECS タスクがOutOfMemoryErrorで突然停止しました。調べてみると Java 関係のエラーのようですが、自社アプリでは Java は使っていません。
Fargate 基盤側のエラーでしょうか?対処法を教えてください。

どう対応すればいいの?

メモリ消費が増加した原因の修正、もしくはタスクサイズの見直しを検討してください。

仕様としてタスク定義で割り当てられているメモリを越えようとすると、コンテナが強制停止されます。そのためOutOfMemoryErrorで停止したコンテナは、メモリ消費量が指定値を超えてしまったことが停止の理由となります。なお、Out Of Memory(OOM)は一般的なエラーの一つです。

停止したタスクのエラーコード - Amazon ECS

OutOfMemoryError
このエラーは、タスク定義で割り当てられているよりも多くのメモリをコンテナ内のプロセスで消費しているためにコンテナーが終了したときに発生します。

メモリ消費量が増加した原因は、アプリケーションが出力したログや、CloudWatch メトリクス等から確認できることが期待されます。メモリ消費量が増加した原因に応じて、タスクサイズの見直しや、アプリケーションの修正等をご検討ください。

なお、Fargate 起動タイプでタスクサイズで指定できる CPU とメモリの組み合わせには制約がありますのでご注意ください。

Fargate タスク定義の考慮事項 - Amazon ECS

また、EC2 起動タイプの場合は一時的なメモリ需要に備えて、スワップの有効化も選択肢となります。

参考資料

メモリ不足エラーは、下記のようなシステムログで示されます。

[115879.769795] Out of memory: kill process 20273 (httpd) score 1285879