要件
AドメインとBドメインのリクエストを、1つのALBでhttpとhttpsの両方をリスナーとして捌きたい。
httpsはACMを利用する(ACMは別途取得済)。
ALBの前段にはRoute53があり、Aドメイン・Bドメイン両方のAレコードをALBに向けてある状態(別途設定済)。
今回は、ALBの設定にフォーカスする。
エラー内容
ALB を Terraform で構築している際に、httpsリスナーに複数ドメインを指定したいと思い、aws_lb_listener リソースを複数指定したところ、以下のようなエラーが発生しました。
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リスナーとする場合のサンプル
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はドキュメントに色々書いてあるので結局ドキュメントを見ろという事でした。
![[Terraform AWS]ALBにACMで複数ドメインを指定しようとしたら出たエラー Error creating LB Listener: DuplicateListener: A listener already exists on this port for this load balancer](https://normalblog.net/system/wp-content/uploads/2019/08/terraform-logo.png)