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

Dernière mise à jour : 08/10/2020

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 Validation de 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 Validation des ID logiques et physiques.
  • 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 Validation des définitions de paramètre.
  • 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érification de la disponibilité de votre type de ressources.
  • En cas de message d'erreur de type « Propriété non prise en charge détectée XXXXXXXX », consultez la section Validation des propriétés, des valeurs et des types de valeur.
  • En cas de message d'erreur de type « La [ressource environnementale] XXXXXXXX n'existe pas », consultez la section Vérification de l'existence de votre ressource hors de la pile, ou validation des dépendances des ressources se trouvant dans la même pile.
  • En cas de message d'erreur de type « Au moins un membre de ressources doit être défini », consultez la section Insertion d'une section Ressources à votre modèle.
  • En cas de message d'erreur de type « Propriété ou propriétés de modèle non valides [XXXXXXXX] », consultez la section Vérification des propriétés de modèle.

Résolution

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

Valider la syntaxe du modèle

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

Valider les identifiants logiques et physiques

1.    Vérifiez que les identifiants logiques des ressources sont définis dans votre modèle.

2.    Vérifiez que les identifiants physiques des ressources existent dans votre environnement.

Par exemple, test correspond à la propriété ImageId dans le modèle JSON suivant et à la propriété ImageID dans le modèle YAML suivant. Aucun de ces modèles ne comporte un identifiant logique de ressource ou un paramètre test.

L'identifiant de ressource n'est pas correctement défini dans les modèles JSON et YAML suivants. Ces modèles renvoient le message d'erreur « Dépendances de ressource non résolues [test] dans le bloc Ressources de votre modèle ». Pour obtenir des informations supplémentaires sur les définitions de ressources et leur syntaxe, consultez la section Ressources.

JSON :

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

YAML :

Parameters:
Resources:
  EC2Instance01:
    Type: AWS::EC2::Instance
    Properties:
      ImageID: !Ref: test

Validation des définitions de paramètre

1.    Définissez l'élément Type sur l'une des propriétés suivantes uniquement : String, Number, List<Number> ou CommaDelimitedList.

Remarque : ces propriétés incluent des types de paramètres spécifiques à AWS et des types de paramètres AWS Systems Manager Agent (SSM Agent).

2.    Dans votre modèle AWS 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 AWS CloudFormation, vérifiez que la section Paramètres ne contient pas de fonctions intrinsèques.

Par exemple, la valeur par défaut correspondant à l’élément ParameterC, dans les modèles JSON et YAML suivants, est associée à la fonction intrinsèque Fn::Sub. Cette dernière entraîne l’affichage du message d’erreur « Chaque membre par défaut doit constituer une chaîne ».

JSON :

{
  "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"
        }
      }
    }
  }
}

YAML :

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érification de la définition des conditions sous forme de chaînes

Dans votre modèle AWS CloudFormation, configurez l'élément Conditions sous forme de chaîne.

Par exemple, la condition de la ressource EC2RouteA est spécifiée sous la forme d'une liste de chaînes, et non d'une chaîne unique dans les exemples de modèle JSON et YAML suivants. Ces modèles renvoient l'erreur de validation « Chaque membre de condition doit constituer une chaîne ».

JSON :

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

YAML :

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

Pour remédier à ce problème, ajoutez l’élément ConditionAandB à votre modèle, puis utilisez l’élément ConditionAandB en tant que condition pour la ressource EC2RouteA. Consultez les exemples de modèles JSON et YAML suivants.

JSON :

{
  "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": {
        ...
      }
    }
  }
}

YAML :

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érification de 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. Par exemple, le type de ressource AWS::WAFRegional::IPSet, dans les modèles JSON et YAML suivants, n'est pas disponible actuellement dans la région ap-south-1. Ces modèles renvoient le message d'erreur « Types de ressources non reconnus : [XXXXXXXX] ».

JSON :

{
  "IPSetlistA": {
    "Type": "AWS::WAFRegional::IPSet",
    "Properties": {
      "Name": "IPSet for IP addresses that are not allowed",
      "IPSetDescriptors": [
        {
          "Type": "IPV4",
          "Value": "x.x.x.x/x"
        },
        {
          "Type": "IPV4",
          "Value": "x.x.x.x/x"
        }
      ]
    }
  }
}

YAML :

IPSetlistA:
 Type: 'AWS::WAFRegional::IPSet'
 Properties:
  Name: IPSet for IP addresses that are not allowed
  IPSetDescriptors:
   - Type: IPV4
    Value: x.x.x.x/x
   - Type: IPV4
    Value: x.x.x.x/x

Remarque : les modèles AWS CloudFormation sont stockés en tant que fichiers texte dans un format conforme aux normes JSON et YAML. Les modèles JSON et YAML ci-dessus sont de même type, mais d'un format différent. Pour plus d'informations sur la prise en charge de YAML, consultez Concepts de base des modèles et Mise à jour d'AWS CloudFormation – YAML, références entre piles, substitution simplifiée.

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

JSON :

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

YAML :

Transform: AWS::Serverless-2016-10-31
Resources:
  MyServerlessFunctionLogicalID:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: 's3://testBucket/mySourceCode.zip'

Validation des propriétés, valeurs et types de valeur

Assurez-vous que les sections de modèle et les définitions de ressources comportent des propriétés, des valeurs et des types de valeurs valides.

Vérification de l’existence de votre ressource hors de la pile, ou validation des dépendances des ressources de la même pile

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

  • le nom de la ressource ou le nom 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, si le groupe de sécurité n'existe tout simplement pas, ou s'il n'existe pas dans la région AWS de la pile pour une ressource AWS::EC2::Instance qui spécifie un groupe de sécurité (sg-1234567890), la ressource AWS::EC2::Instance entraîne un échec. Vous recevrez le message d'erreur suivant : « Le groupe de sécurité sg-1234567890 n'existe pas ». 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.>

Inclusion d'une section Ressources à votre modèle

Vous devez inclure une section Ressources à votre modèle AWS CloudFormation. Dans le cas contraire, un message d'erreur s'affiche.

Vérification des propriétés du modèle

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

Dans les exemples JSON et YAML suivants, la ressource de compartiment se trouve au même niveau que la section Ressources. Ceci entraîne l'affichage du message d'erreur « Erreur de validation du modèle : propriété ou propriétés de modèle non valides [Compartiment] », car le valideur de modèle AWS CloudFormation considère la ressource de compartiment comme une spécification au niveau de la section, ce qui n’est pas autorisé en tant que propriété de modèle.

JSON :

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

YAML :

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

Remarque : dans les modèles JSON et YAML précédents, remplacez BucketName par le nom de votre compartiment.</p


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


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