はじめに
みなさんこんにちは。
突然ですが、みなさんはElasticsearchをFargateでデプロイしたことありますか?意外にサイトが少なく、情報が少ないまま私はデプロイしたわけですが。まぁAmazon OpenSearch Serviceがありますから、それ使えばいいじゃんという話ですよねすいません....存在に気づいた時にはすでにFargate使ってたもんですから......
それはそうとして、せっかくならとFargateにHTTPS通信つけてみたんですよね。そしたらElasticsearchから
"java.lang.IllegalArgumentException: Unexpected http method: PRI"
と吐かれまして.....そんでこの原因がめちゃくちゃしょうもなかったので共有したいと思い記事にしました。
TL;DR
ってことでどのようにして解決したのかって話ですよね。
EC2 > ロードバランサー > Fargateと紐付けてあるNLBを選択 > リスナーの編集 > ALPNポリシー
この部分を「None」にすることで解決しました。
というのも、私何を血迷ったのかここの項目「HTTP2Preferred」にしてたんですよね。
それが原因でElasticsearchがエラーを吐いたようです。
なぜエラーを吐いたのか
エラーコードを見る限り、「PRIとかいうHTTPメソッドは知りませんよ」と言ってるようです。
ではこのPRIとは何者なのか、調べてみると以下の記事が気になるようなことを書いてありました。
クライアントが、接続先サーバーが HTTP/2 対応済みであることを知ってる場合は事前知識(Prior Knowledge)があると言う。
HTTP/2: ちょっと詳細: プロトコルネゴシエーション編
はい、そうです。PRIはPrior Knowledgeの先頭3文字を取った単語だったのです。
さらにちょっと深掘りすると、HTTPS/2にサーバーが対応していることがわかった後、HTTP/2コネクションプリフェイスという定められた文字列を接続先サーバーに送信するようです。そういえば、上の「HTTP2Preferred」も、「プリフェイス」と読めそうな言葉......
要は、上の設定にすると、接続先のサーバーはHTTP/2でリクエストを受ける必要があり、その挨拶がわりとして決められた文字列が送られるわけですね。
それを「HTTP/2ってHTTP/1より強いんだ!じゃあよくわからんけどこれにしよ!」という感覚でよくわからない項目を選んだがゆえにこんなエラーに悩まされました......
反省点
まず、よくわからない項目は下手にいじらない。これをとても実感しました。
そして、HTTP/1とHTTP/2の大まかな通信の仕組みもしっかりと把握する必要がありますね。
P.S. Elasticsearchのバージョン載せ忘れました......Dockerを使って動かしてます。
FROM elasticsearch:7.17.6