これは何
TerraformでAWS環境を構築した際、ALBのHealth checkでrequest timed outになったので、解決のメモ。
つまり…
request timed outなので、ググって以下を参考に対応。
"AWSのDocumentより"
HTTP 408: Request timeout
アイドルタイムアウト期間の期限が切れる前に、クライアントからデータが送信されませんでした。
TCP キープアライブを送信しても、このタイムアウトを防ぐことはできません。
各アイドルタイムアウト期間が経過する前に、1 バイト以上のデータを送信します。必要に応じて、アイドルタイムアウト期間を長くします。
"Qiitaより"
リクエストが通るには、
ロードバランサに設定したセキュリティグループのアウトバウンドルール
インスタンスに設定したセキュリティグループのインバウンドルール
の双方で接続を許可する必要があります。
ふ〜む、なるほど。
どうやら、タイムアウト値が短すぎるのか、SGのルールを見直す必要がありそうです。
参考
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-troubleshooting.html
https://qiita.com/koseki/items/61372f25dfe8c8bb7a63
結論
SGのルールは問題なく、どうやらTimeoutの期間が短すぎた模様。
"Terraform Document より"
timeout - (Optional) Amount of time, in seconds, during which no response means a failed health check.
For Application Load Balancers, the range is 2 to 120 seconds, and the default is
5 seconds for the instance target type and 30 seconds for the lambda target type.
For Network Load Balancers, you cannot set a custom value,
and the default is 10 seconds for TCP and HTTPS health checks and 6 seconds for HTTP health checks.
ALBのHealth checkについては、デフォルトのまま、特に値を変えることなくapplyしていたので、適当に以下に変更。
resource "aws_lb_target_group" "main" {
name = "lb-tg"
port = 80
protocol = "HTTP"
vpc_id = aws_vpc.main.id
health_check {
interval = 90
timeout = 60
}
}
これで、request timed outは解決しました。
結局はデフォルトの値だとrequest timed outになる、ということだったのですが、他にも原因があるのかもしれません。
timeoutって普通はしっかり考えてデフォルト値にはしない(?)から、そんなに同じような問題を抱えている人がいないんでしょうか。
Terraformのデフォルトに従うとエラーになる、なんて天下のHashi Corpがするかなあと思ったりします。
なので他にも原因がありそうだなあと思いつつ、これで解決はしたので何だかなあという感じです。
参考
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lb_target_group