web-dev-qa-db-fra.com

Conditions multiples dans la création de ressources de formation de nuages

J'utilise une condition de plate-forme pour contrôler le type d'environnement généré sur AWS. Il y a beaucoup de ressources partagées, mais j'ai besoin de certaines instances EC2 avec des AMI précuites en fonction de certaines conditions.

"Parameters": {
"Platform": {
  "Description": "Select platform type - linux or windows",
  "Default": "linux",
  "Type": "String",
  "AllowedValues": [ "linux", "windows", "both" ],
  "ConstraintDescription": "Must enter either linux, windows, or both"
},

Ensuite, j'ai défini le conditions.

"Conditions" : {
  "LinuxPlatform" : {"Fn::Equals" : [{"Ref" : "Platform"}, "linux"]},
  "WindowsPlatform" : {"Fn::Equals" : [{"Ref" : "Platform"}, "windows"]},
  "BothPlatform" : {"Fn::Equals" : [{"Ref" : "Platform"}, "both"]}
},

Dans une ressource, j'aimerais utiliser Linux ou Windows pour déclencher une création Windows ou Linux Ec2, ou utiliser les deux pour déployer chaque ressource ec2 déclarée.

J'ai essayé ce qui suit en utilisant fn:or de plusieurs façons.

"Fn::Or": [{"Condition": "LinuxPlatform"}, {"Condition": "BothPlatform" }],

et...

"Condition" : {
   "Fn::Or" : [
      {"Condition" : "LinuxPlatform"},
      {"Condition" : "BothPlatform"}
   ]
}

Je reçois toujours l'erreur suivante lorsque j'essaie de déployer et de valider à l'aide du aws cli.

aws cloudformation validate-template --template-body       file://./cloudformation/deploy.json

A client error (ValidationError) occurred when calling the ValidateTemplate operation: Template format error: Every Condition member must be a string.

Est-il possible d'évaluer plusieurs conditions pour contrôler la création de ressources? Sinon, existe-t-il des alternatives que je pourrais essayer?

13
Joe Gardiner

Essayez d'ajouter

"MyCondition": {"Fn::Or": [{"Condition": "LinuxPlatform"}, {"Condition": "BothPlatform" }]}

au bas de votre Conditions comme ça:

    "Conditions" : {
        "LinuxPlatform" : {"Fn::Equals" : [{"Ref" : "Platform"}, "linux"]},
        "WindowsPlatform" : {"Fn::Equals" : [{"Ref" : "Platform"}, "windows"]},
        "BothPlatform" : {"Fn::Equals" : [{"Ref" : "Platform"}, "both"]},
        "MyCondition": {"Fn::Or": [{"Condition": "LinuxPlatform"}, {"Condition": "BothPlatform" }]}
    },
8
Vor

Je cherchais la même chose avec différents scénarios au format YAML. Voici le format YAML pour la référence.

CreateResources: !Or [!Equals [!Ref "Environment", prod], !Equals [!Ref "Environment", dev], !Equals [!Ref "Environment", preprod], !Equals [!Ref "Environment", test]]
2
mahendra rathod