curlのタイムアウト設定
curlで接続タイムアウトと転送タイムアウトを設定する方法を解説。--connect-timeout、--max-time、リトライロジック、速度ベースの制限でリクエストのハングを防止しましょう。
詳細な説明
curlのタイムアウト設定
タイムアウトは堅牢なHTTPクライアントを構築するために不可欠です。適切なタイムアウトがなければ、リクエストが無限にハングし、スクリプトをブロックしてリソースを消費する可能性があります。curlは複数のタイムアウト機構を提供しています。
接続タイムアウト
--connect-timeout フラグは、curlがTCP接続の確立を待つ最大時間を秒単位で設定します:
curl --connect-timeout 5 https://api.example.com/data
サーバーが5秒以内に応答しない場合、curlは終了コード28で中断します。
リクエスト全体のタイムアウト
--max-time(または -m)フラグは、DNS解決、接続、転送、レスポンスを含む操作全体の最大時間を設定します:
curl --max-time 30 https://api.example.com/large-download
タイムアウトの組み合わせ
ベストプラクティスは両方のタイムアウトを設定することです:
curl --connect-timeout 5 --max-time 30 https://api.example.com/data
これにより、接続に5秒、リクエスト・レスポンスサイクル全体に30秒の制限が設けられます。
DNSタイムアウト
DNS解決の遅延がボトルネックになることがあります。--dns-servers でより高速なDNSサーバーを指定するか、--resolve でDNSをスキップします:
curl --resolve api.example.com:443:93.184.216.34 \
https://api.example.com/data
速度ベースのタイムアウト
--speed-limit と --speed-time で低速な転送を中断します:
curl --speed-limit 1000 --speed-time 15 https://example.com/file.zip
これは、転送速度が15秒連続で毎秒1000バイト未満に低下した場合に中断します。
リトライ付きタイムアウト
タイムアウトとリトライロジックを組み合わせて、回復力のあるリクエストを実現します:
curl --connect-timeout 5 --max-time 30 \
--retry 3 --retry-delay 2 --retry-max-time 120 \
https://api.example.com/data
これは、2秒間隔で最大3回リトライし、リトライ全体のウィンドウは120秒です。
スクリプトでのタイムアウト
シェルスクリプトでは、ゾンビプロセスを防止するために必ずタイムアウトを設定しましょう:
if ! curl -sf --connect-timeout 5 --max-time 30 https://api.example.com/health; then
echo "Health check failed" >&2
exit 1
fi
終了コード
- 28: 操作がタイムアウトした
- 7: ホストへの接続に失敗した
- 6: ホスト名を解決できなかった
適切なタイムアウト設定は、本番スクリプト、CI/CDパイプライン、無応答のエンドポイントを迅速に検出する必要がある監視システムに不可欠です。
ユースケース
DevOpsエンジニアがヘルスチェックスクリプトを作成する際に、サービスが無応答の場合に素早く失敗し、許容可能なレイテンシウィンドウ内でアラートを発生させる必要がある場合に使用します。