はじめに
この記事は、AWS Batch ジョブ実行中に発生した S3 へのオブジェクト PUT 失敗に関するエラーについて、その原因と対処法をまとめたものです。
概要
AWS Batch ジョブの実行中に、CSVファイルを S3 にアップロードしようとしたところ、エラーが発生しました。一度目の試行ではエラーで停止しましたが、再度実行したところ正常に完了しました。
エラー詳細
Caused by: software.amazon.awssdk.services.s3.model.S3Exception: Your socket connection to the server was not read from or written to within the timeout period. Idle connections will be closed. (Service: S3, Status Code: 400, Request ID: XXXXXXXXXXXXXXXXX)
翻訳
原因: software.amazon.awssdk.services.s3.model.S3Exception: サーバーへのソケット接続がタイムアウト時間内に読み取りまたは書き込みされませんでした。アイドル接続は閉じられます。(サービス: S3、ステータスコード: 400
原因
AWS 基盤側の問題
Batch ジョブが配置されたコンテナインスタンスの仮想サーバーホストには、事象発生時間帯とその前後で問題は見受けられませんでした。
S3 側でも、当該時間帯にエラーの原因となるような問題は確認されていません。
推測される原因
Batch ジョブから S3 までのネットワーク経路において、一時的な問題が生じ、オブジェクトの PUT に失敗したと推察されます。再実行時に正常に動作したことから、この問題は一時的なものであったと考えられます。
解決策・対処法
AWS Batch には、失敗したジョブを自動的に再試行する機能が備わっています。
対象のジョブ定義の retryStrategy が現在 attempts: 1 と設定されています。
この attempts の値を 2 以上に設定することで、今回のような一時的なネットワークの問題によるジョブの失敗に対して、自動的にリトライされるようになります。
参考資料
ジョブの再試行の自動化 - AWS Batch
再試行戦略 - AWS Batch ジョブ定義パラメーター
おわりに
AWS の基盤は日々改善されていますが、ネットワーク上の問題が完全に0になることはありません。
本記事で紹介したリトライ戦略の導入は、このような一時的なエラーに対するシステムの耐障害性を高めるための有効な手段です。