Terraform 将负载均衡器侦听器附加到 Elastic Beanstalk 负载均衡器。不是有效的负载均衡器 ARN

Terraform attaching a load balancer listener to an Elastic Beanstalk load balancer. Not a valid load balancer ARN

我正在尝试将 SSL 证书附加到通过 Terraform 创建并在启动时附加的 Elastic Beanstalk 负载均衡器。启动的 EBS 环境将成为一个网络 api,这就是为什么我需要将 https ssl 证书附加到环境,因为我想根据命令启动它 up/down 而无需手动附加每次都发送给服务。

我所做的是下面的代码,但我一直收到错误:

Error: error creating ELBv2 Listener (arn:aws:elasticloadbalancing:us-east-1:profile:loadbalancer/name: ValidationError: 'arn:aws:elasticloadbalancing:us-east-1:profile:loadbalancer/name' is not a valid load balancer ARN
status code: 400, request id: xxxxxxxxxxxxxxxxxxx

我最初尝试过: load_balancer_arn = "${aws_elastic_beanstalk_environment.ebs-env.load_balancers[0].arn}" 但是 aws_elastic_beanstalk_environment.ebs-env.load_balancers[0] returns 这个名字,所以我不能只做 .arn,这导致我通过为 arn 编写一个自定义字符串并从 EBS 环境负载均衡器中获得名称并附加它来做到这一点到 ARN。

EBS 创建了一个经典的负载均衡器,我在 AWS 网站上找到的 ARN 如下所示,我对所有内容进行格式化的方式进行了四重检查,但我仍然收到该错误,表明它不是有效的 ARN。

我已经检查过 EBS 名称是 AWS 控制台中负载均衡器的实际名称,并且它与 terraform 在启动时命名。所以它是负载均衡器的有效名称,但即使我手动验证该名称是正确的,我仍然出现上面描述的错误。 AWS 文档引导我使用: arn:partition:service:region:account-id:resource-id 对于 arn 自定义名称,并发现: arn:aws:elasticloadbalancing:region:account-id:loadbalancer/name 是我正在使用的负载均衡器的正确 ARN。

这是我用来旋转 up/down 这个基础设施的 terraform 代码:​​

provider "aws" {
  region = "us-east-1"
}
resource "aws_elastic_beanstalk_application" "ebaTest" {
  name        = "EBA-test"
  description = "Development test EBS system"
}

resource  "aws_elastic_beanstalk_environment" "ebs-env" {
  name = "ebs-env"
  application = aws_elastic_beanstalk_application.ebaTest.name
  solution_stack_name = "64bit Amazon Linux 2 v2.2.10 running .NET Core" 
  cname_prefix = "ebsp-env"
  setting {
    namespace = "aws:autoscaling:launchconfiguration"
    name = "IamInstanceProfile"
    value = "aws-elasticbeanstalk-ec2-role"
  }
  setting {
    namespace = "aws:autoscaling:launchconfiguration"
    name = "InstanceType"
    value = "t3a.micro"
  }
}
resource "aws_lb_listener" "cert-listener" {
  load_balancer_arn = "arn:aws:elasticloadbalancing:us-east-1:aws-id:loadbalancer/${aws_elastic_beanstalk_environment.ebs-env.load_balancers[0]}"
  port = "443"
  protocol = "HTTPS"
  certificate_arn = "arn:aws:acm:us-east-1:aws-id:certificate/cert-id"
  default_action {
    type = "fixed-response"
  }
}

如果您有任何其他需要澄清的问题 questions/confused,我会尽快回复。

aws_lb_listener 是 AWS ELBv2 的一部分,仅适用于应用程序负载均衡器和网络负载均衡器。你说你正在创建一个经典的负载均衡器。如果 Terraform 本身不管理负载均衡器,我认为您不能通过 Terraform 更新 CLB 的证书。

您使用 CLB 而不是较新的 ALB 有什么原因吗?无论哪种方式,the correct method to do this 都是将 SSL 证书的 ARN 作为设置直接传递给 Elastic Beanstalk 资源:

  setting {
    namespace = "aws:elb:listener:443"
    name = "SSLCertificateId"
    value = "arn:aws:acm:us-east-1:aws-id:certificate/cert-id"
  }