AWS ELB cloudformation 按条件为 HTTPS 和 HTTP

AWS ELB cloudformation by conditonsfor both HTTPS & HTTP

因为我正在尝试在 IsSSL = HTTPS/HTTP
的条件下创建 ELB HTTPS=443,HTTP=80。

以上值作为变量从 yaml 文件传递​​。

如果条件为真,则应 select 使用 Fn::If 条件的相应负载均衡器端口。但是我在构建堆栈时遇到错误,下面的子网部分工作正常。对此有任何帮助吗?

错误:属性 loadbalancerport 的值必须是字符串类型

  Conditions:
    IsSSl:
      'Fn::Equals':
        - $(IsSSL)
        - HTTPS

  RsbatchELB:
      DependsOn: RsbatchELBSecurityGroup
      Type: 'AWS::ElasticLoadBalancing::LoadBalancer'
      Properties:
        Listeners:
          - LoadBalancerPort:
              - 'Fn::If':
                  - IsSSL
                  - $(HttpS)
                  - $(HttP)
        Subnets:
          - 'Fn::If':
              - IsPublicELB
              - $(publicSubnet-a)
              - $(private-subnet-a)
          - 'Fn::If':
              - IsPublicELB
              - $(publicSubnet-b)
              - $(private-subnet-b)

您的示例似乎使用了与 AWS Condition Functions documentation

不一致的内部函数语法

那里有这样的语法:

Syntax for the full function name:

Fn::If: [condition_name, value_if_true, value_if_false] 

Syntax for the short form:

!If [condition_name, value_if_true, value_if_false]

尝试:

- LoadBalancerPort:
  - !If [IsSSL, !Ref HttpS, !Ref HttP]

您正在传递 LoadBalancerPort 一个带有那个流浪者 - 的列表。试试这个:

Listeners:
  - LoadBalancerPort:
      'Fn::If':
         - IsSSL
         - $(HttpS)
         - $(HttP)