アゴ乗せ日記

適当なポジティブ日記

スポンサーリンク

【解決済み】Elasticsearchで413「FULL head」が返ってきたときの対応方法

若手な、な、なんか413 FULL head ってエラーが起きててやべぇです

ワイやべぇな

先に原因と解決方法

原因

Laravel(Guzzle)からElasticsearchへの検索クエリがリクエストBodyではなくて、クエリ文字列として送られていた。

解決方法

queryとしていた箇所をbodyに変更。content-typeが必要なので、headersも追加した。

$client = new \GuzzleHttp\Client();
$result = $client->request(
    'GET',
    $url,
    [
        // 'query' => array (
        //     'source' => json_encode($query),
        //     'source_content_type' => 'application/json',
        // )
        'headers'  => ['content-type' => 'application/json', 'Accept' => 'application/json'],
        'body' => json_encode($query)
    ]
);

現象

  • Elasticsearch検索時のクエリ文字数が増えると発生する
  • 「413 FULL head」関連で調べても答えが見つからない
  • 該当クエリを直接 kibanaのdevtool から叩くと問題ない(実際には送っていたリクエストと差異があった)

環境

  • Nginx
  • Laravel(HTTP通信にGuzzleを使用)
  • Amazon Elasticsearrch Servic

試したこと

  • Nginxのclient_max_body_sizeの設定 参考
  • php.iniのpost_max_sizeの設定 参考
  • php.iniの memory_limitの設定 参考

どれもダメで結局解決までに3時間もかかった。

時間がかかった理由

該当クエリを直接 kibanaのdevtool から叩くと問題ない(実際には送っていたリクエストと差異があった)

ここの確認が正しくできていなかったから時間がかかった。 クエリ文字列で送っているわけがないと思い込んでしまっていた

そして、「413 FULL head」にヒットする記事が圧倒的に少なかった

ちなみにちゃんとcurlでElasticsearchにクエリ文字列数が大きいリクエストを投げると以下のようなエラーメッセージが得られる。

  • {"status": 413,"errors": "FULL head"}
  • Request failed to get to the server (status code: 413)

結局、以下のように'exceptions' => TRUEdebugを追加することによって原因に気づけた。

$client = new \GuzzleHttp\Client();
$result = $client->request(
    'GET',
    $url,
    [
       'exceptions' => TRUE,
        // 'query' => array (
        //     'source' => json_encode($query),
        //     'source_content_type' => 'application/json',
        // )
        'headers'  => ['content-type' => 'application/json', 'Accept' => 'application/json'],
        'body' => json_encode($query),
        'debug'=>true,
        'otheroptions'=>array()
    ]
);

エラーで吐かれるリクエストURLが明らかに長くて、クエリ文字列で送られていた。

イメージ

Client error: `GET https://hoge/test_index/_search?source=%HOGE%FUGA%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%%HOGE%FUGA%....がかなり長く続く

みたいな感じだ。

おわり

思い込みのせいで問題の切り分けが甘かった。
分かってしまえば大したことはない。

以上!!

スポンサーリンク