要件
AドメインとBドメインのリクエストを、1つのALBでhttpとhttpsの両方をリスナーとして捌きたい。
httpsはACMを利用する(ACMは別途取得済)。
ALBの前段にはRoute53があり、Aドメイン・Bドメイン両方のAレコードをALBに向けてある状態(別途設定済)。
今回は、ALBの設定にフォーカスする。
エラー内容
ALB を Terraform で構築している際に、httpsリスナーに複数ドメインを指定したいと思い、aws_lb_listener リソースを複数指定したところ、以下のようなエラーが発生しました。
1 2 3 |
Error creating LB Listener: DuplicateListener: A listener already exists on this port for this load balancer |
エラーメッセージからみるに、1つのリスナー・同一ポートには1つしか指定出来ないみたいです。今回、https 443に複数設定しようとしていた為、エラーとなったようです。
対応内容
調べたところ、1個目のhttpsリスナーは aws_lb_listener
で、2個目以降のhttpsリスナーは aws_lb_listener_certificate
を使用する必要があったようです。
httpのリスナーはaws_lb_listener
で大丈夫です。
AドメインとBドメインを1つのALBのhttpsリスナーとする場合のサンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
resource "aws_lb_listener" "alb_listener_http" { load_balancer_arn = aws_lb.alb.arn port = "80" protocol = "HTTP" default_action { type = "forward" target_group_arn = aws_lb_target_group.alb_target_group.arn } } resource "aws_lb_listener" "alb_listener_https_a" { load_balancer_arn = aws_lb.alb.arn port = "443" protocol = "HTTPS" ssl_policy = "ELBSecurityPolicy-2016-08" certificate_arn = AドメインACMのARN default_action { type = "forward" target_group_arn = aws_lb_target_group.alb_target_group.arn } } resource "aws_lb_listener_certificate" "alb_listener_certificate" { listener_arn = aws_lb_listener.alb_listener_https_a.arn certificate_arn = BドメインACMのARN } |
という形でした。Terraformはドキュメントに色々書いてあるので結局ドキュメントを見ろという事でした。