🎃
AWS Elastic Beanstalkで301レスポンスを許可する
起きたこと
先日、AWS Elastic BeanstalkでWebアプリをデプロイしました。
数々のエラーと戦い、完全に潰しきったと思っていたのですが、ダッシュボードをみるとHealthステータスが"Severe"でなにやらあかんっぽい。
でもログを見てもエラーはないし、ドメインにもアクセスできる...一体何がダメなんだと思ってAWSサポートさんに問い合わせてみたところこのような回答が。
curl 操作から、レスポンスコードが「301」であることがわかりました。EnvironmentのロードバランサーはHTTP 200をレスポンスコードとして期待していますが、アプリケーションはHTTP 301を返していることをお知らせします。バックエンドでリダイレクトを設定すると、301 または 302 のレスポンスコードが返され、アプリケーションが正常に動作していてもヘルスチェックに失敗することがあります。
したがって、成功コードの不一致により、「Target.responseCodemIsMatch」[2] でヘルスが失敗します。その結果、健康状態は深刻になっています。
この問題を解決するには、以下の手順を参照して、HTTP 301 を成功コードとして受け入れるようにロードバランサーを設定することをお勧めします。
要するに「今301レスポンスが返ってきていて、これがなんらかのエラーと認識しちゃっているのが原因。 Elastic Beanstalkにこのレスポンスはエラーじゃないよと認識させれば解決できる」ということみたいです。
実際、curlでリクエスト投げてみたところ、それっぽいレスポンスが。
curl -Ivk {myAppDomain.ap-northeast-1.elasticbeanstalk.com}
* Trying xx.xxx.xxx.xx:80...
* Connected to {myAppDomain.ap-northeast-1.elasticbeanstalk.com} (xx.xxx.xxx.xx) port 80 (#0)
> HEAD / HTTP/1.1
> Host: {myAppDomain.ap-northeast-1.elasticbeanstalk.com}
> User-Agent: curl/7.79.1
> Accept: /
> Mark bundle as not supporting multiuse
< HTTP/1.1 301 Moved Permanently
HTTP/1.1 301 Moved Permanently
301レスポンス=リダイレクトですが、独自ドメイン設定したりHTTP->HTTPSへのリダイレクト設定などしたのでその影響のよう。
解決法
ロードバランサーに301レスポンスを受け入れるよう設定する。
具体的には下記のようにする。
-
Configuration -> Load balancer -> Edit をクリック
-
Processes -> 「Port: 80, Protocol: HTTP」のプロセスにチェック -> Action -> Edit をクリック
-
HTTP code に
301
を追加。200
がなければこれも追加する。その場合は200,301
という風にスペースなしカンマで区切る。その後、 Saveボタンを押して閉じる
-
最後にページ最下部の 「Applyを押して、その後Contiuneを押す」を忘れずに。これをしないと適応されない。以上!
Discussion