¿Cómo soluciono los errores de formato o de validación de plantillas en CloudFormation?

Última actualización: 25-06-2021

Recibo un mensaje de error cuando intento crear mi pila de AWS CloudFormation.

Descripción corta

Elija una de las siguientes soluciones según el mensaje de error que reciba:

  • Para los errores “JSON not well-formed” (JSON con forma no válida) o “YAML not well-formed” (YAML con forma no válida), consulte la sección Validar síntaxis de plantilla.
  • Para los errores “Unresolved resource dependencies [XXXXXXXX] in the Resources block of the template” (Dependencias de recursos [XXXXXXXX] no resueltas el bloque de recursos de la plantilla), consulte la sección Validar ID lógicas y físicas.
  • Para los errores “Unrecognized parameter type: XXXXXXXX” (Tipo de parámetro no reconocido: XXXXXXXX) o “Invalid template parameter property 'XXXXXXXX'” (Propiedad de parámetro de plantilla XXXXXXXX no válida), consulte la sección Validar definiciones de parámetros.
  • En el caso de errores “Every Condition member must be a string” (Todos los miembros de condiciones deben ser una cadena), consulte la sección Confirmar que las condiciones se especifican como una cadena.
  • Para los errores “Unrecognized resource types: [XXXXXXXX]” (Tipos de recurso no reconocidos: [XXXXXXXX]), consulte la sección Verifique la disponibilidad de su tipo de recurso.
  • Para los errores “Encountered unsupported property XXXXXXXX” (Encontrada propiedad no compatible XXXXXXXX), consulte la sección Validar propiedades, valores y tipos de valores.
  • Para los errores “The [environmental resource] 'XXXXXXXX' does not exist” ([Recurso de entorno] 'XXXXXXXX' no existe), consulte la sección Verificar que su recurso existe fuera de la pila, o validar dependencias para recursos en la misma pila.
  • Para los errores “At least one Resources member must be defined” (Al menos debe definirse un miembro de recursos), consulte la sección Incluir una sección de recursos en su plantilla.
  • Para los errores “Invalid template property or properties [XXXXXXXX]” (Propiedad o propiedades de plantilla [XXXXXXXX] no válidas), consulte la sección Verificar propiedades de plantilla.

Resolución

Nota: Si recibe errores al ejecutar comandos de AWS Command Line Interface (AWS CLI), asegúrese de que está utilizando la versión más reciente de AWS CLI.

Validar sintaxis de plantilla

Para seguir una sintaxis de JSON o YAML apropiada en su plantilla de CloudFormation, tenga en cuenta lo siguiente:

Validar ID lógicas y físicas

1.    Confirme que los ID lógicos de recursos están definidos en su plantilla.

2.    Confirme que los ID físicos de recursos existen en su entorno.

Por ejemplo, test está referenciado para la propiedad ImageId en las siguientes plantillas de JSON y YAML. Ninguna plantilla incluye un ID lógico de recurso o parámetro llamado test.

El ID de recurso no está definido correctamente en las siguientes plantillas de JSON y YAML. Estas plantillas devuelven el siguiente error: “Unresolved resource dependencies [test] in the Resources block of the template” (Dependencias de recursos no resueltas [test] en el bloque de recursos de la plantilla). Para obtener más información sobre definiciones de recursos y sus sintaxis, consulte Recursos.

JSON:

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

YAML:

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

Validar definiciones de parámetros

1.    Configure Type (Tipo) para solamente una de las siguientes propiedades: String, Number, List<Number> o CommaDelimitedList.

Nota: Estas propiedades incluyen tipos de parámetros específicos de AWS y tipos de parámetros de AWS Systems Manager Agent (SSM Agent).

2.    En su plantilla de CloudFormation, verifique que los parámetros solo incluyen las siguientes propiedades permitidas:

"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.    En su plantilla de CloudFormation, confirme que la sección Parameters (Parámetros) no contiene ninguna función intrínseca.

Por ejemplo, el valor predeterminado para ParameterC en las siguientes plantillas de JSON y YAML tiene la función intrínseca Fn::Sub. La función intrínseca causa el error de validación: “Every Default member must be a string” (Todos los miembros predeterminados deben ser una cadena).

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

Confirmar que las condiciones están especificadas como una cadena

En su plantilla de CloudFormation, especifique Conditions (Condiciones) como una cadena.

Por ejemplo, la condición en el recurso EC2RouteA se especifica como una lista de cadenas en lugar de una única cadena en las siguientes plantillas de JSON y YAML de ejemplo. Estas plantillas dan lugar al siguiente error de validación: “Every Condition member must be a string” (Todos los miembros de Condición deben ser una cadena).

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:

Para resolver este error, agregue ConditionAandB a su plantilla, y luego utilice ConditionAandB como la condición para el recurso de EC2RouteA. Vea el siguiente ejemplo de plantillas de JSON y YAML.

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:

Verificar la disponibilidad de su tipo de recurso

1.    Verifique que el recurso esté disponible en su región de AWS.

No todos los tipos de recurso están disponibles en todas las regiones de AWS. Por ejemplo, el tipo de recurso AWS::WAFRegional::IPSet en las siguientes plantillas de JSON y YAML no está disponible actualmente en ap-south-1. Estas plantillas dan lugar al siguiente error: “Unrecognized resource types: [XXXXXXXX]” (Tipos de recursos no reconocidos: [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

Nota: Las plantillas de CloudFormation están almacenadas como archivos de texto en un formato que cumple con los estándares de JSON o YAML. Las plantillas de JSON o YAML anteriores utilizan la misma plantilla, pero con un formato diferente. Para obtener más información sobre la compatibilidad con YAML, consulte Conceptos básicos sobre plantillas y Actualización de AWS CloudFormation: YAML, referencias entre pilas, sustitución simplificada.

2.    Si su plantilla se compone de algún recurso sin servidor, entonces incluya una declaración de Transform (Transformación). Consulte los siguientes ejemplos de JSON y YAML.

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'

Validar propiedades, valores y tipos de valores

Utilice propiedades, valores y tipos de valores válidos en las secciones y definiciones de recursos de la plantilla.

Verifique que sus recursos existen fuera de la pila, o valida dependencias para recursos en la misma pila

Si está codificando un recurso o nombre de recurso de Amazon (ARN) para un recurso que existe fuera de la pila de CloudFormation en uno de los recursos de su pila, verifique lo siguiente:

  • El nombre de recurso o ARN es correcto.
  • El recurso existe.
  • El recurso existe en la misma región de AWS que la pila. Tenga en cuenta que algunos recursos aceptan propiedades entre cuentas o regiones de AWS.

Por ejemplo, si el grupo de seguridad no existe o no existe en la región de AWS de la pila para un recurso AWS::EC2::Instance en su pila que especifica un grupo de seguridad (sg-1234567890), entonces el recurso AWS::EC2::Instance dará error. Recibirá el siguiente mensaje de error: “The sg-1234567890 does not exist” (sg-1234567890 no existe). Consulte el siguiente ejemplo:

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.>

Incluir una sección Resources (Recursos) en su plantilla

Debe incluir una sección Resources (Recursos) en su plantilla de CloudFormation, o recibirá un error.

Verificar propiedades de plantilla

Utilice solo propiedades de plantilla permitidas en su plantilla de CloudFormation.

En los siguientes ejemplos de JSON y YAML, el recurso del bucket está en el mismo nivel que la sección Resources (Recursos). Esto hace que se produzca el siguiente error: “Template validation error: Invalid template property or properties [Bucket]” (Error de validación de plantilla: Propiedad o propiedades de plantilla [Bucket] no válidas). Esto error se debe a que el validador de plantillas de CloudFormation ve al recurso del bucket como una especificación a nivel de sección, lo cual no está permitido como propiedad de plantilla.

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

Nota: En las plantillas JSON y YAML anteriores, sustituya BucketName por el nombre de su bucket.


¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?