O FindInMap pode retornar uma lista?

3

Estou usando o CloudFormation para implantar um ELB em um VPC pré-existente que tenha sub-redes pré-existentes. Eu listei as sub-redes em uma seção de Mapeamentos do modelo e selecione o mapeamento com base no parâmetro Environment. Isso funciona bem se o Mapeamento for para um único valor, mas quero que o Mapeamento retorne uma lista, pois quero que o ELB seja multi-AZ. Eu tentei várias combinações do exemplo abaixo, mas sempre recebo o mesmo erro Value of property Subnets must be of type List of String . Existe uma maneira que FindInMap pode retornar uma lista de valores?

Exemplo de configuração do ELB

"ElasticLoadBalancerAPI": {
            "Properties": {
                "ConnectionDrainingPolicy": {
                    "Enabled": true,
                    "Timeout": 30
                },
                "ConnectionSettings": {
                    "IdleTimeout": 60
                },
                "CrossZone": "false",
                "Subnets" : [
                    {
                        "Fn::FindInMap": [
                            "AWSEnv2PublicSubnets",
                            {
                                "Ref": "Env"
                            },
                            "subList"
                        ]
                    }
                ],
                "SecurityGroups" : [ { "Ref" : "LoadBalancerSecurityGroup" }],
etc...

Exemplo de Parâmetros

"Parameters": {
  "Env": {
            "Description": "Environment",
            "Type": "String",
            "Default": "DEV",
            "AllowedValues": [
                "DEV",
                "TEST"
            ]
        }
}

Exemplos de mapeamentos

"Mappings": {
  "AWSEnv2PublicSubnets": {
            "DEV": {
                "subList": ["subnet-1111","subnet-2222","subnet-3333"]
            },
            "TEST": {
                "subList": ["subnet-4444"]
            }
        }
}
    
por user3188040 14.04.2017 / 19:00

1 resposta

5

A função Split funciona:

JSON

"Mappings": {
   "AWSEnv2PublicSubnets": {
        "DEV": {
            "subList": "subnet-1111,subnet-2222,subnet-3333"
        }
    }
}

então:

"Subnets" : { 
  "Fn::Split" : [
    ",", 
    { "Fn::FindInMap": [
      "AWSEnv2PublicSubnets",
      { "Ref": "Env" },
      "subList"
    ] }
  ]
}

YAML

Mappings: 
  AWSEnv2PublicSubnets:
    DEV:
      subList: subnet-1111,subnet-2222,subnet-3333

então:

Subnets: !Split [",", !FindInMap [ AWSEnv2PublicSubnets, !Ref Env, subList] ]

Eu usei uma vírgula ( , ) como meu caractere separador, mas você pode usar o que quiser, desde que não seja usado também como parte do valor.

    
por 26.04.2017 / 20:13