3

Je rencontre des difficultés pour créer un sous-groupe ElastiCache qui référence dynamiquement les sous-réseaux corrects. Je voudrais utiliser le même modèle dans la région est et ouest, donc je spécifie les sous-réseaux pour le groupe de sous-réseau dans les mappages. Cependant, lorsque je tente de lancer la mise à jour ma pile, je reçois l'erreur suivante:Cloudformation: sous-réseaux créés de référence dans ElastiCache SubnetGroup

Value of property SubnetIds must be of type List of String 

est ici un point essentiel montrant à peu près ce que je suis en train de faire: https://gist.github.com/brockhaywood/b71ed34c6a554a0a0fec

Cette question sans réponse sur les forums AWS semble être un problème très similaire: https://forums.aws.amazon.com/message.jspa?messageID=532454

Répondre

0

Je pense SubnetIds should be an array, où vous avez un seul objet.

"ElastiCacheSubnetGroup": { 
    "Type": "AWS::ElastiCache::SubnetGroup", 
    "Properties": { 
    "SubnetIds": [ 
     { 
      "Fn::FindInMap":["RegionMap", { "Ref":"AWS::Region" }, AppSubnets" ] 
     } 
    ] 
    } 
} 
+0

Oh vraiment? la référence 'AppSubnets' est un tableau de Refs, cela ne satisferait-il pas à ce que ce soit un tableau? –

+0

Une personne raisonnable pourrait penser ainsi, mais il vous donne un message d'erreur se plaindre du type de données :). – James

+0

J'ai essayé aussi, fournir ce qui suit à SubnetIds mais il produit la même erreur: "SubnetIds": [{ "Fn :: FindInMap": [ "RegionMap", { "Ref": » AWS :: Region " ", "AppSubnets" ] }] –

0

La question spécifique est que vous ne pouvez pas utiliser Ref dans une valeur Mappings, comme il est indiqué dans la documentation Mappings:

You cannot include parameters, pseudo parameters, or intrinsic functions in the Mappings section.

Comme alternative, vous pouvez utiliser Conditions pour accomplir ce que votre modèle tente. Voici un exemple de travail complet:

Launch Stack

{ 
    "Description": "Create an ElastiCache SubnetGroup with different subnet depending on the current AWS region." 
    "Conditions": { 
    "us-east-1": {"Fn::Equals": [{"Ref":"AWS::Region"}, "us-east-1"]}, 
    "us-west-2": {"Fn::Equals": [{"Ref":"AWS::Region"}, "us-west-2"]} 
    }, 
    "Resources": { 
    "VPC": { 
     "Type": "AWS::EC2::VPC", 
     "Properties": { 
     "CidrBlock": "10.0.0.0/16" 
     } 
    }, 
    "AppSubnetA": { 
     "Type": "AWS::EC2::Subnet", 
     "Properties": { 
     "VpcId": {"Ref": "VPC"}, 
     "CidrBlock": "10.0.0.0/24", 
     "AvailabilityZone": {"Fn::Select": [1, {"Fn::GetAZs": ""}]} 
     } 
    }, 
    "AppSubnetB": { 
     "Type": "AWS::EC2::Subnet", 
     "Properties": { 
     "VpcId": {"Ref": "VPC"}, 
     "CidrBlock": "10.0.1.0/24", 
     "AvailabilityZone": {"Fn::Select": [1, {"Fn::GetAZs": ""}]} 
     } 
    }, 
    "ElastiCacheSubnetGroup": { 
     "Type": "AWS::ElastiCache::SubnetGroup", 
     "Properties": { 
     "Description": "SubnetGroup", 
     "SubnetIds": {"Fn::If": ["us-east-1", [ 
      {"Ref": "AppSubnetA"} 
      ], 
      {"Fn::If": ["us-west-2", 
      [ 
       {"Ref": "AppSubnetB"} 
      ], 
      {"Ref":"AWS::NoValue"} 
      ]} 
     ]} 
     } 
    } 
    } 
} 
+0

Cela devrait être la réponse acceptée. Il n'est pas possible d'utiliser des valeurs dynamiques dans la section Mappages du modèle CloudFormation. – Aditya