2014-05-23 4 views
4

Essayer d'utiliser Fn :: Rejoindre dans les Fn :: FindInMap, comme ci-dessous:AWS Cloudformation: Fn :: Jointure dans une instruction Fn :: FindInMap?

"SubnetId": { 
    "Fn::FindInMap": [ 
     { 
      "Ref": "OrganizationName" 
     }, 
     "AZ", 
     { 
      "Fn::Join": [ 
       "", 
       [ 
        { 
         "Ref": "Environment" 
        }, 
        { 
         "Ref": "Member1AZ" 
        } 
       ] 
      ] 
     } 
    ] 
} 

Le Nom_organisation, l'environnement et Member1AZ sont tous les paramètres. Essentiellement, il devrait raccorder à mes applications et de produire, par exemple:

"SubnetId" : { "Fn::FindInMap" : [ "Organization2", "AZ", "prod1c" ]} 

Cependant, il ne semble pas prendre la sortie de la Fn :: Inscrivez-vous comme une seule entité sur la touche Fn :: FindInMap, il valide correctement si je code en dur cette section du modèle.

A client error (ValidationError) occurred when calling the ValidateTemplate operation: Template error: every Fn::FindInMap object requires three parameters, the map name, map key and the attribute for return value 

Mes Mappages sont les suivantes:

Mappings" : { 
     "OrganizationDefaults" : { 
      "AZ" : { 
       "prod1a" : "subnet-foobar1", 
       "qa1a" : "subnet-foobar2", 
       "prod1c" : "subnet-foobar3", 
       "qa1c" : "subnet-foobar4" 
      } 
     }, 
     "OrganizationTwo" : { 
      "AZ" : { 
       "prod1a" : "subnet-foobar5", 
       "qa1a" : "subnet-foobar6", 
       "prod1c" : "subnet-foobar7", 
       "qa1c" : "subnet-foobar8" 
      } 
     }, 
}, 

peut-elle aider quelqu'un à ce sujet, ou ont dû faire quelque chose de semblable auparavant? J'ai besoin d'utiliser le même modèle pour toutes les organisations listées, donc Mappings devrait résoudre cela pour moi, si je peux le faire correctement.

Répondre

1

Je vous suggère de refactoriser vos mappings pour éviter le Fn :: Join imbriqué.

Mappings" : { 
     "OrganizationDefaults" : { 
      "1a" : { 
       "prod" : "subnet-foobar1", 
       "qa" : "subnet-foobar2" 
      }, 
      "1c" 
       "prod" : "subnet-foobar3", 
       "qa" : "subnet-foobar4" 
      } 
     }, 
     "OrganizationTwo" : { 
      "1a" : { 
       "prod" : "subnet-foobar5", 
       "qa" : "subnet-foobar6" 
      }, 
      "1c" : { 
       "prod" : "subnet-foobar7", 
       "qa" : "subnet-foobar8" 
      } 
     }, 
}, 

Cela simplifie votre référence.

"SubnetId" : { "Fn::FindInMap" : [ { "Ref" : "OrganizationName" }, { "Ref" : "Member1AZ" }, { "Ref" : "Environment" }]} 
1

Bien que je suis d'accord avec @ Jason que dans votre cas, un refactoring de votre mise en page de la carte est la meilleure solution pour vous, il y a des cas où les limites 2D des cartes en CloudFormation peut limiter, donc je vais poster une solution possible ici.

la date de ce poste, la fonction intrinsèque Fn::FindInMap prend en charge que les fonctions imbriquées suivantes:

  • Fn::FindInMap
  • Ref

l'aide d'un Join vous donnera l'erreur un peu cryptique vous publiez ci-dessus. Cependant, parce que vous pouvez imbriquer FindInMap appels, vous pouvez obtenir un « 3ème dimention » pour voir la carte en créant une autre carte de recherche:

Mappings" : { 
    "OrganizationDefaults" : { 
     "AZ" : { 
      "prod1a" : "subnet-foobar1", 
      "qa1a" : "subnet-foobar2", 
      "prod1c" : "subnet-foobar3", 
      "qa1c" : "subnet-foobar4" 
     } 
    }, 
    "OrganizationTwo" : { 
     "AZ" : { 
      "prod1a" : "subnet-foobar5", 
      "qa1a" : "subnet-foobar6", 
      "prod1c" : "subnet-foobar7", 
      "qa1c" : "subnet-foobar8" 
     } 
    }, 
    "EnvMemberMap" : { 
     "prod": { 
      "1a" : "prod1a", 
      "1c" : "prod1c", 
     }, 
     "qa": { 
      "1a" : "qa1a", 
      "1c" : "qa1c", 
     }  
    } 
}, 

Et puis effectuer la récupération de carte comme ceci:

"SubnetId": { 
    "Fn::FindInMap": [ 
     { 
      "Ref": "OrganizationName" 
     }, 
     "AZ", 
     { 
      "Fn::FindInMap": [ 
       "EnvMemberMap", 
       { 
        "Ref": "Environment" 
       }, 
       { 
        "Ref": "Member1AZ" 
       } 
      ] 
     } 
    ] 
} 
Questions connexes