ELBからのヘルスチェックに失敗する
AWSでLoadBalancerのテストをしていて、突然バックエンドにつながらなくなったり、ヘルスチェックに失敗したりするようになった。
セキュリティグループの設定がおかしいのかと思っていろいろ確認してみても問題なし。
で、ネットワークACLをもう一度確認してみたら、ELBがいるサブネットの設定がこうなってた。
カスタム TCP ルール TCP (6) 32768-61000 0.0.0.0/0 許可
原因はこれだった。
リクエストを開始するクライアントは、一時ポートの範囲を選択します。範囲は、クライアントのオペレーティングシステムによって変わります。多くの Linux カーネル(Amazon Linux カーネルを含む)は、ポート 32768~61000 を使用します。Elastic Load Balancing が送信元のリクエストは、ポート 1024~65535 を使用します。Windows Server 2003 を介する Windows オペレーティングシステムは、ポート 1025~5000 を使用します。Windows Server 2008 は、ポート 49152~65535 を使用します。そのため、インターネット上の Windows XP クライアントから、お使いの VPC のウェブサーバーにリクエストが送信される場合、ネットワーク ACL には、ポート 1025~5000 あてのトラフィックを可能にするアウトバウンドルールを用意する必要があります。
http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_ACLs.html#VPC_ACLs_Ephemeral_Ports
ネットワークACLがステートレスだということを理解していたし、適切に設定しているつもりだったけどサブネットの中にはLinuxしかいないからこれで大丈夫だろうと思っていたのが失敗だった。
で、ポートの範囲を広げたら無事ヘルスチェックがとおるようになりました。
カスタム TCP ルール TCP (6) 1024-65535 0.0.0.0/0 許可
Requests originating from Elastic Load Balancing use ports 1024-65535.
http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html