AWS Load Balancerを使用する際、常に405(Method Not Allowed)が出る場合

AWS Load Balancerを使用する際、常に405(Method Not Allowed)が出る場合

2023年11月23日

会社のAPIサーバでウェブフック関連のAPIを作成することになり、POSTリクエストを受け取るウェブフックエンドポイントを生成しました。

しかし、確かにリクエストを送信するサーバでは正常にPOSTでリクエストを送っているのに、受信するサーバのログでは405(Method Not Allowed)が表示されました。

image

原因

AWS Load Balancerを使用する際、HTTPリクエストをHTTPSにリダイレクトする機能があります。

image

一般的には上記のように設定されますが、この場合301(Moved Permanently)でリダイレクトを行うため、HTTPでPOSTリクエストを送るとHTTPSにリダイレクトされる際にGETリクエストに変わります。

サーバはLoad Balancerの背後にあるため、GETリクエストを受け取るエンドポイントがないので405(Method Not Allowed)が表示されました。

これを図で示すと以下のようになります。

image

リダイレクトの原理

通常のリダイレクトは、クライアント(ウェブブラウザなど)がサーバから301(Moved Permanently)のようなリダイレクト応答を受け取ると、クライアントはリダイレクト応答に含まれるLocationヘッダのアドレスに再リクエストを行います。

リダイレクトの場合、以前送信したRequest、HTTP Methodなどの情報を通常保持していないため、GETリクエストおよび以前送信したBodyを失った状態で再リクエストを行います。

解決方法

解決方法は非常に簡単です。リダイレクトされないように最初からHTTPSでリクエストを送れば良いのです。

Load Balancerが提供するこの機能は、staticなページを受け渡す際(例:text/htmlのようなcontent-typeを持つリクエスト)にHTTPSプロトコルを通じて受信するようリダイレクトするために使用するものであり、REST APIサーバのような場合は、URLにhttpではなくhttpsを明記してリクエストを送るようにすればよいです。

参考文献