【问题标题】:How do I add a list of ssl certificates to a list of of alb listeners I have created using one of the Terraform for loop contstructs?如何将 ssl 证书列表添加到我使用 Terraform for 循环构造之一创建的 alb 侦听器列表中?
【发布时间】:2021-02-19 08:34:38
【问题描述】:

在 AWS 上,使用 Terraform 可以向 ALB 侦听器添加多个 ssl 证书。我可以通过创建一个监听器资源并创建多个 aws_lb_listener_certificate 资源来做到这一点。

所以这样的东西可以正常工作:

 resource "aws_alb_listener" "alb_listener" {  
      load_balancer_arn = aws_alb.alb.arn  
      port              = 443  
      protocol          = "HTTPS"
      default_action {    
          target_group_arn = aws_alb_target_group.alb_target_group.arn
          type = lookup(var.alb_listener, "action")  
       }
  } 

resource "aws_lb_listener_certificate" "testme_ssl_cert" {
  listener_arn    = "${aws_alb_listener.alb_listener.arn}"
  certificate_arn = "${data.aws_acm_certificate.testme.arn}" 
}

但我正在尝试通过从 config.xml 构建我的侦听器来减少用于执行此操作的代码量。所以我可以从这样的地图变量中构建我的监听器。这很好用。

    resource "aws_lb_listener" "encrypted_listener" {
      load_balancer_arn       = aws_alb.alb.arn
      for_each = var.ssl_forwarding
          port                = each.key
          protocol            = each.value
          certificate_arn = lookup(var.default_certificate,each.key)
          default_action {
            target_group_arn = aws_alb_target_group.alb_target_group.arn
            type             = "forward"
          }   
    }

    variable "ssl_forwarding" {
        default = { 
            443 =   "HTTPS"
            8081 =   "HTTPS"         
      }

现在我想将其余的证书添加到我刚刚创建的侦听器中。

So I need something that looks like this (I think):

    variable "additional_certificates" {
        default=[
            "arn:aws:acm:eu-west-1:blah_blach_ect-3ba688bab27a", #cert 1
            "arn:aws:acm:eu-west-1:blah_blach_ect-4fa688deb27a", #cert 2
        ]
    }

    resource "aws_lb_listener_certificate" "ssl_certs" 
            listener_arn    = //for every listener that I just created
            certificate_arn = //add every certificate in additional_certificates
    }

我不明白如何处理众多听众。证书的多样性。最后是证书的多样性与听众的多样性。

**感谢所有有关如何解决此问题的建议。变通方法的建议也受到赞赏。谢谢.....

更新: 感谢 Marcin 的回答……但这只允许我添加一个额外的 SSL cer。 我认为 var 会看起来像这样......所以我可以将 n 个证书添加到 n 个负载均衡器。

variable "additional_certificates" {
     default = { 
       443 = ["arn:aws:acm:eu-west-1:blah_blah_ect1",
              "arn:aws:acm:eu-west-1:blah_blah_ect2"
              ""arn:aws:acm:eu-west-1:blah_blah_ect....n" //could be any number of certs here                                                                                                                      
             ]
       8081 = "arn:aws:acm:eu-west-1:blah_blach_ect-4fa688deb27a"
    }

【问题讨论】:

    标签: amazon-web-services terraform terraform-provider-aws


    【解决方案1】:

    我假设您的 aws_lb_listener.encrypted_listener 是有效的并且它有效,因为它没有在问题中另行指定。此外,如果additional_certificates 是一张地图会更好,因为您正在使用ssl_forwarding 的地图。因此,您的 ssl_certs 可能是:

    
    variable "additional_certificates" {
         default = {
           443 = "arn:aws:acm:eu-west-1:blah_blach_ect-3ba688bab27a",
           8081 = "arn:aws:acm:eu-west-1:blah_blach_ect-4fa688deb27a"
        }
    }
    
    resource "aws_lb_listener_certificate" "ssl_certs" {
        
        for_each =  aws_lb_listener.encrypted_listener
    
        listener_arn    = each.value.arn
        certificate_arn = var.additional_certificates[each.key]
    }
    

    更新

    如果您可以拥有随机数量的端口和随机数量的证书,我可以提出以下建议:

    variable "additional_certificates" {
    
       default = { 
         443 = ["arn:aws:acm:eu-west-1:blah_blah_ect1",
                "arn:aws:acm:eu-west-1:blah_blah_ect2",
                "arn:aws:acm:eu-west-1:blah_blah_ect....n"
               ]
         8081 = ["arn:aws:acm:eu-west-1:blah_blach_ect-4fa688deb27a"]
         
         9999 = ["arn:aws:acm:eu-west-1:blah_blach_ect-223332",
                 "arn:aws:acm:eu-west-1:blah_blach_ect-22222"]
      }
    }
    
    
    locals {
      # flatten the additional_certificates
      additional_certificates_flat = merge([
          for port, certs in var.additional_certificates:
            {for cert in certs: 
              "${port}-${cert}" => {"port" = port, "cert" = cert}
            }
      ]...)
    
    }
    

    var.additional_certificates 扁平化为 local.additional_certificates_flat 将是:

    {
      "443-arn:aws:acm:eu-west-1:blah_blah_ect....n" = {
        "cert" = "arn:aws:acm:eu-west-1:blah_blah_ect....n"
        "port" = "443"
      }
      "443-arn:aws:acm:eu-west-1:blah_blah_ect1" = {
        "cert" = "arn:aws:acm:eu-west-1:blah_blah_ect1"
        "port" = "443"
      }
      "443-arn:aws:acm:eu-west-1:blah_blah_ect2" = {
        "cert" = "arn:aws:acm:eu-west-1:blah_blah_ect2"
        "port" = "443"
      }
      "8081-arn:aws:acm:eu-west-1:blah_blach_ect-4fa688deb27a" = {
        "cert" = "arn:aws:acm:eu-west-1:blah_blach_ect-4fa688deb27a"
        "port" = "8081"
      }
      "9999-arn:aws:acm:eu-west-1:blah_blach_ect-22222" = {
        "cert" = "arn:aws:acm:eu-west-1:blah_blach_ect-22222"
        "port" = "9999"
      }
      "9999-arn:aws:acm:eu-west-1:blah_blach_ect-223332" = {
        "cert" = "arn:aws:acm:eu-west-1:blah_blach_ect-223332"
        "port" = "9999"
      }
    }
    

    那么,

    resource "aws_lb_listener_certificate" "ssl_certs" {
        
        for_each =  local.additional_certificates_flat
    
        listener_arn    = aws_lb_listener.encrypted_listener[each.value.port].arn
        certificate_arn = each.value.cert
    }
    

    【讨论】:

    • 感谢您解决部分问题的快速回复。这只会添加第二个证书。我希望在哪里添加 n。因此,如果使用地图,它将是这样的...... { 443 = ["arn:aws:acm:eu-west-1:blah_blah_ect1", "arn:aws:acm:eu-west-1: blah_blah_ect2" ""arn:aws:acm:eu-west-1:blah_blah_ect....n" //这里可以是任意数量的证书] 8081 = "arn:aws:acm:eu-west-1:blah_blach_ect- 4fa688deb27a" }
    • @DarrenWhite 在这种情况下,最好将其拆分为两个 aws_lb_listener_certificate 资源,一个用于 443,第二个用于 8081。两个资源会更容易读取、写入、调试和维护出现了一些复杂的循环机制。你考虑过吗?
    • 谢谢。我考虑过这一点。这些只是示例端口...我可以拥有 100 个。或其中 n 个。我不会提前知道的。所以我需要'n'个端口。带有'n'个证书。这里的想法是解决这个问题,所以我不需要提前知道我需要多少证书或端口。
    • @DarrenWhite 这些证书是唯一的,即端口之间不会有通用证书吗?
    • 我当然做到了...感谢您的所有帮助。我相信这个答案会帮助很多其他人。
    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多