これは何
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