[小ネタ] curl コマンドでステータスコード 000 のときは -v を付けてみよう

ステータスコードがないと 000 が設定される場合があります
2023.06.22

アノテーション・テクニカルサポートチームの hato です。

curl コマンドでサービス監視をしていますが、まれにステータスコード「000」が記録されています。
サーバー側で「000」を返却する実装はしていないのですが、どこで生成されているかわかりますか。
と、お問い合わせをいただくことがあり少し調べてみました。

HTTP レスポンスステータスコード - HTTP | MDN

メモ: この一覧にないレスポンスを受け取った場合、それは標準外のレスポンスであり、おそらくそのサーバーソフトウェアに固有のものです。

結論

存在しないホストなど、レスポンスステータスコードがない場合に--write-outオプションでステータスコードを取得すると curl の場合はステータスコード「000」が設定されるようです。

$ curl -sI -w '%{http_code}\n' -o /dev/null http://hato.example.com/     
000

試しに-vを追加した場合は、Could not resolve hostのエラーが発生していることが確認できます。 ステータスコード「000」が記録されている場合は、ステータスコードが存在しない可能性を疑いましょう。

$ curl -sI -w '%{http_code}\n' -o /dev/null http://hato.example.com/ -v
* Could not resolve host: hato.example.com
* Closing connection 0
000

最後に

AWS 側の仕様やネットワーク構成なども調査しましたが、生成場所がわからず試しに行ったエラーでやっと解決できたので、ブログにしました。

なお、ALB の場合は次のトラブルシューティングが該当する場合があります。

Application Load Balancer のトラブルシューティング - Elastic Load Balancing

ロードバランサーは、レスポンスコード 000 を送信します。

HTTP/2 接続では、いずれかのヘッダーの圧縮された長さが 8 K バイトを超える場合、または 1 つの接続を介して処理されるリクエスト数が 10,000 を超える場合、ロードバランサーは GOAWAY フレームを送信し、TCP FIN を使用して接続を閉じます。

この記事が誰かのお役にたてば幸いです。

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。