Comment puis-je résoudre les erreurs de validation ou de format de modèle dans CloudFormation ?

Dernière mise à jour : 23/02/2022

Un message d'erreur s'affiche lorsque je tente de créer ma pile AWS CloudFormation.

Brève description

Choisissez l'une des solutions suivantes, en fonction du message d'erreur qui s'affiche :

  • En cas de message d'erreur de type « Format JSON incorrect » ou « Format YAML incorrect », consultez la section Valider la syntaxe du modèle.
  • En cas de message d'erreur de type « Dépendances de ressource non résolues [XXXXXXXX] dans le bloc Ressources du modèle », consultez la section Valider les ID logiques et les paramètres.
  • En cas de message d’erreur de type « Type de paramètre non reconnu : XXXXXXXX » ou « Propriété de paramètre de modèle non valide XXXXXXXX », consultez la section Valider les définitions de paramètres.
  • En cas de message d’erreur de type « Chaque membre d’une condition doit constituer une chaîne », consultez la section Vérification de la spécification des conditions en tant que chaîne.
  • En cas de message d’erreur de type « Types de ressource non reconnus : [XXXXXXXX] », consultez la section Vérifier la disponibilité de votre type de ressource.
  • En cas de message d'erreur de type « La [ressource environnementale] XXXXXXXX n'existe pas », consultez la section Vérifier l'existence de votre ressource hors de la pile, ou valider les dépendances des ressources se trouvant dans la même pile.
  • En cas de message d'erreur de type « Propriété ou propriétés de modèle non valides [XXXXXXXX] », consultez la section Vérifier les propriétés de modèle.

Résolution

Remarque : si vous recevez des erreurs lors de l'exécution de commandes depuis AWS Command Line Interface (AWS CLI), assurez-vous d'utiliser la version la plus récente d'AWS Command Line Interface (AWS CLI).

Validation de la syntaxe du modèle

Pour respecter la syntaxe JSON ou YAML appropriée dans votre modèle CloudFormation, procédez comme suit :

Valider les ID logiques et les paramètres

Vérifiez que les ID logiques des ressources et les paramètres sont définis dans votre modèle.

Dans les modèles JSON et YAML suivants, test correspond à la propriété ImageID. Toutefois, aucun modèle ne contient un ID logique de ressource ou un paramètre nommé test. Ces modèles renvoient le message d'erreur « Dépendances de ressource non résolues [test] dans le bloc Ressources du modèle ». Pour obtenir des informations supplémentaires sur les définitions de ressources et leur syntaxe, consultez Ressources.

Exemple de modèle JSON (incorrect) :

{
  "Resources" : {
    "EC2Instance01" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : {"Ref": "test"}
      }
    }
  }
}

Exemple de modèle YAML (incorrect) :

Resources:
  EC2Instance01:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref test

Pour résoudre ce problème, ajoutez un ID logique de ressource nommé test. Vous pouvez également créer un paramètre nommé test dans lequel la référence renvoie la valeur imageId. Les exemples de modèles JSON et YAML suivants incluent un paramètre avec le nom test et imageId comme valeur.

Exemple de modèle JSON (correct) :

{
  "Parameters": {
     "test": {
         "Type": "String",
         "Default": "ami-xxx"
       }
  },
  "Resources" : {
    "EC2Instance01" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : {"Ref": "test"}
      }
    }
  }
}

Exemple de modèle YAML (correct) :

Parameters:
  test:
    Type: String
    Default: ami-xxx
Resources:
  EC2Instance01:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: !Ref test

Valider les définitions de paramètres

1.    Définissez Type sur l'une des propriétés prises en charge suivantes :

2.    Dans votre modèle CloudFormation, vérifiez que les paramètres incluent uniquement les propriétés autorisées suivantes :

"Parameters" : {
  "ParameterName" : {
    "AllowedPattern" : "A regular expression that represents the patterns to allow for String types.",
    "AllowedValues" : "An array containing the list of values allowed for the parameter",
    "ConstraintDescription" : "A string that explains a constraint when the constraint is violated"
    "Default" : "A value of the appropriate type for the template to use if no value is specified when a stack is created. If you define constraints for the parameter, you must specify a value that adheres to those constraints",
    "Description" : "A string of up to 4000 characters that describes the parameter",
    "MaxLength" : "An integer value that determines the largest number of characters you want to allow for String types",
    "MaxValue" : "A numeric value that determines the largest numeric value you want to allow for Number types.",
    "MinLength" : "An integer value that determines the smallest number of characters you want to allow for String types.",
    "MinValue" : "A numeric value that determines the smallest numeric value you want to allow for Number types.",
    "NoEcho" : "Whether to mask the parameter value when a call is made that describes the stack.
                 If you set the value to true, the parameter value is masked with asterisks (*****).",
    "Type" : "The data type for the parameter (DataType)."
 },

3.    Dans votre modèle CloudFormation, vérifiez que la section Paramètres ne contient pas de fonctions intrinsèques.

Dans les exemples de modèles JSON et YAML suivants, la valeur par défaut correspondant à l'élément ParameterC comporte la fonction intrinsèque Fn::Sub. Cette fonction intrinsèque entraîne l’erreur de validation « Chaque membre par défaut doit être une chaîne ».

Exemple de modèle JSON (incorrect) :

{
  "Parameters": {
    "ParameterA": {
      "Type": "String",
      "Default": "abc"
    },
    "ParameterB": {
      "Type": "String",
      "Default": "def"
    },
    "ParameterC": {
      "Type": "String",
      "Default": {
        "Fn::Sub": "${ParameterA}-${ParameterB}"
      }
    }
  },
  "Resources": {
    "MyS3Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "BucketName": {
          "Ref": "ParameterC"
        }
      }
    }
  }
}

Exemple de modèle YAML (incorrect) :

Parameters:
 ParameterA:
  Type: String
  Default: abc
 ParameterB:
  Type: String
  Default: def
 ParameterC:
  Type: String
  Default: !Sub '${ParameterA}-${ParameterB}'
Resources:
 MyS3Bucket:
  Type: 'AWS::S3::Bucket'
  Properties:
   BucketName: !Ref ParameterC

Vérifier la spécification des conditions en tant que chaîne

Dans votre modèle CloudFormation, spécifiez Conditions sous forme de chaîne.

Dans les exemples de modèles JSON et YAML suivants, la condition de la ressource EC2RouteA est spécifiée sous la forme d'une liste de chaînes plutôt qu'une chaîne unique. Ces modèles entraînent l'erreur de validation « Chaque membre de condition doit être une chaîne ».

Exemple de modèle JSON (incorrect) :

{
  "Conditions": {
    "ConditionA": {
      "Fn::Not": [
        {
          "Fn::Equals": [
            "",
            "Sample"
          ]
        }
      ]
    },
    "ConditionB": {
      "Fn::Not": [
        {
          "Fn::Equals": [
            "",
            "Sample"
          ]
        }
      ]
    }
  },
  "Resources": {
    "EC2RouteA": {
      "Type": "AWS::EC2::Route",
      "Condition": [
        "ConditionA",
        "ConditionB"
      ],
      "Properties": {
       ...
      }
    }
  }
}

Exemple de modèle YAML (incorrect) :

Conditions:
 ConditionA: !Not 
  - !Equals 
   - ''
   - Sample
 ConditionB: !Not 
  - !Equals 
   - ''
   - Sample
Resources:
  EC2RouteA:
  Type: 'AWS::EC2::Route'
  Condition:
   - ConditionA
   - ConditionB
  Properties:

Pour corriger ce problème, ajoutez l’élément ConditionAandB à la section Conditions de votre modèle, puis utilisez ConditionAandB comme condition pour la ressource EC2RouteA. Consultez les exemples de modèles JSON et YAML suivants.

Exemple de modèle JSON (correct) :

{
  "Conditions": {
    "ConditionA": {
      "Fn::Not": [
        {
          "Fn::Equals": [
            "",
            "Sample"
          ]
        }
      ]
    },
    "ConditionB": {
      "Fn::Not": [
        {
          "Fn::Equals": [
            "",
            "Sample"
          ]
        }
      ]
    },
    "ConditionAandB": {
      "Fn::And": [
        {
          "Condition": "ConditionA"
        },
        {
          "Condition": "ConditionB"
        }
      ]
    }
  },
  "Resources": {
    "EC2RouteA": {
      "Type": "AWS::EC2::Route",
      "Condition": "ConditionAandB",
      "Properties": {
        ...
      }
    }
  }
}

Exemple de modèle YAML (correct) :

Conditions:
  ConditionA:
    Fn::Not:
    - Fn::Equals:
      - ''
      - Sample
  ConditionB:
    Fn::Not:
    - Fn::Equals:
      - ''
      - Sample
  ConditionAandB:
    Fn::And:
    - Condition: ConditionA
    - Condition: ConditionB
Resources:
  EC2RouteA:
    Type: AWS::EC2::Route
    Condition: ConditionAandB
    Properties:

Vérifier la disponibilité de votre type de ressource

1.    Vérifiez que votre ressource est disponible dans votre région AWS.

Les types de ressources ne sont pas tous disponibles dans chaque région AWS. Les modèles qui incluent des types de ressources qui ne sont pas disponibles dans votre région AWS génèrent l'erreur suivante : « Types de ressources non reconnus : [XXXXXXXX] ».

2.    Si votre modèle est composé de ressources sans serveur, incluez une déclaration Transform. Consultez les exemples de modèles JSON et YAML suivants.

Exemple de modèle JSON :

{
    "Transform": "AWS::Serverless-2016-10-31", #Please make sure to include this.
    "Resources": {
        "MyServerlessFunctionLogicalID": {
            "Type": "AWS::Serverless::Function",
            "Properties": {
                "Handler": "index.handler",
                "Runtime": "nodejs8.10",
                "CodeUri": "s3://testBucket/mySourceCode.zip"
            }
        }
    }
}

Exemple de modèle YAML :

Transform: AWS::Serverless-2016-10-31 #Please make sure to include this.
Resources:
  MyServerlessFunctionLogicalID:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: 's3://testBucket/mySourceCode.zip'

Vérifier l'existence de votre ressource hors de la pile, ou valider les dépendances des ressources se trouvant dans la même pile

Si vous codez en dur une ressource ou Amazon Resource Name (ARN), dans l'une des ressources de votre pile pour une ressource qui se trouve hors de la pile CloudFormation, vérifiez que :

  • le nom de la ressource ou ARN est correct ;
  • la ressource existe ;
  • la ressource existe dans la même région AWS que la pile. N'oubliez pas que certaines ressources acceptent des propriétés au niveau des régions ou des comptes AWS.

Par exemple, une ressource AWS::EC2::Instance dans votre pile qui spécifie un groupe de sécurité (sg-1234567890) échoue dans les cas suivants :

  • Il n’existe aucun groupe de sécurité.
  • Il n’existe aucun groupe de sécurité dans la région AWS de la pile.

Par conséquent, le message d'erreur suivant s’affiche : « Il n’existe aucun groupe de sécurité sg-1234567890 ». Consultez l'exemple suivant :

LinuxInstance:
    Type: AWS::EC2::Instance
    Properties:
      SubnetId: !Ref ServerSubnetID 
      KeyName: !Ref EC2KeyPairName
      SecurityGroupIds: sg-1234567890 #<This resource must exist and be in the same AWS Region as the stack.>

Vérifier les propriétés de modèle

Utilisez uniquement les propriétés de modèle autorisées dans votre modèle CloudFormation.

Dans les exemples de modèles JSON et YAML suivants, la ressource de compartiment se trouve au même niveau que la section Ressources. L’erreur suivante s’affiche « Erreur de validation du modèle : propriété ou propriétés de modèle non valides [Compartiment] ». Cette erreur est due au fait que le validateur de modèle CloudFormation considère la ressource de compartiment comme une spécification au niveau de la section. Une spécification au niveau de la section n'est pas autorisée comme propriété de modèle.

Exemple de modèle JSON (incorrect) :

{
   "Resources": {
      "WaitCondition": {
         "Type": "AWS::CloudFormation::WaitCondition"
      }
   },  #<There is an extra '}' causing the Resources section to be closed off after the WaitCondition resource.>
   "Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
         "Name": "BucketName"
      }
   }
}

Exemple de modèle YAML (incorrect) :

Resources:
  WaitCondition:
    Type: AWS::CloudFormation::WaitCondition
Bucket: # <The spacing for the entire Bucket resource is incorrect and needs to be shifted 2 spaces to the right.>
  Type: AWS::S3::Bucket
  Properties:
    Name: BucketName

Pour résoudre ce problème, corrigez le formatage afin de spécifier la ressource du compartiment dans la section Ressources. Consultez les exemples de modèles JSON et YAML suivants qui sont correctement formatés.

Exemple de modèle JSON (correct) :

{
   "Resources": {
      "WaitCondition": {
         "Type": "AWS::CloudFormation::WaitCondition"
      },
   "Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
         "Name": "BucketName"
      }
   }
}
}

Exemple de modèle YAML (correct) :

Resources:
  WaitCondition:
    Type: 'AWS::CloudFormation::WaitCondition'
  Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      Name: BucketName

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?