¿Cómo puedo solucionar los errores de validación o formato de las plantillas en CloudFormation?

10 minutos de lectura
0

Deseo validar mi plantilla de AWS CloudFormation para asegurarme de que no tiene errores de sintaxis.

Descripción breve

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

  • En el caso de los errores «JSON not well-formed» o «YAML not well-formed», consulte la sección Validación de la sintaxis de la plantilla.
  • En el caso de los errores «Unresolved resource dependencies [XXXXXXXX] in the Resources block of the template», consulte la sección Validación de los parámetros y los ID lógicos.
  • En el caso de los errores «Unrecognized parameter type: XXXXXXXX» o «Invalid template parameter property "'XXXXXXXX"», consulte la sección Validación de las definiciones de parámetros.
  • En el caso de los errores «Every Condition member must be a string», consulte la sección Confirmación de si Conditions se ha especificado como una cadena.
  • En el caso de los errores «Unrecognized resource types: [XXXXXXXX]», consulte la sección Comprobación de la disponibilidad del tipo de recurso.
  • En el caso de los errores «The [environmental resource] 'XXXXXXXX' does not exist», consulte la sección Comprobación de si los recursos existen fuera de la pila o validación de las dependencias para recursos en la misma pila.
  • En el caso de los errores «Invalid template property or properties [XXXXXXXX]», consulte la sección Comprobación de las propiedades de la plantilla.
  • En el caso de los errores «Invalid policy syntax» o «MalformedPolicy», consulte la sección Comprobación de la sintaxis de la política de cualquier recurso relacionado con una política de IAM.

Solución

Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulte Troubleshoot AWS CLI errors. Además, asegúrese de utilizar la versión más reciente de la AWS CLI.

Validación de la sintaxis de la plantilla

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

Validación de los parámetros y los ID lógicos

Confirme si se han definido parámetros e ID lógicos de recursos en su plantilla.

En las siguientes plantillas de JSON y YAML, se hace referencia a test en el caso de la propiedad ImageId. Sin embargo, ninguna plantilla incluye un parámetro ni un ID lógico de recurso llamado test. Estas plantillas devuelven el siguiente error: «Unresolved resource dependencies [test] in the Resources block of the template». Para obtener más información sobre las definiciones de recursos y su sintaxis, consulte Recursos.

Ejemplo de JSON (incorrecto):

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

Ejemplo de YAML (incorrecto):

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

Para solucionar este problema, añada un ID lógico de recurso denominado test. Como alternativa, cree un parámetro denominado test en el que la referencia devuelva el valor ImageId. Los siguientes ejemplos de plantillas de JSON y YAML incluyen un parámetro denominado test con ImageId como valor.

Ejemplo de JSON (correcto):

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

Ejemplo de YAML (correcto):

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

Validación de las definiciones de parámetros

  1. Defina Type con una de las siguientes propiedades compatibles:
  2. En su plantilla de CloudFormation, compruebe que los parámetros solo incluyan las siguientes propiedades permitidas. Para obtener más información sobre las propiedades permitidas, consulte Propiedades.
  3. En su plantilla de CloudFormation, confirme que la sección Parameters no contenga ninguna función intrínseca.

En las siguientes plantillas de ejemplo de JSON y YAML, el valor predeterminado para ParameterC tiene la función intrínseca Fn::Sub. Esta función intrínseca provoca el error de validación: «Every Default member must be a string».

Ejemplo de JSON (incorrecto):

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

Ejemplo de YAML (incorrecto):

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

Confirmación de si Conditions se ha especificado como una cadena

En la plantilla de CloudFormation, especifique Conditions como una cadena.

En las siguientes plantillas de ejemplo de JSON y YAML, la condición en el recurso EC2RouteA se ha especificado como una lista de cadenas en lugar de una única cadena. Estas plantillas dan lugar al siguiente error de validación: «Every Condition member must be a string».

Ejemplo de JSON (incorrecto):

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

Ejemplo de YAML (incorrecto):

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

Para solucionar este error, añada ConditionAandB a la sección Conditions de su plantilla y, a continuación, utilice ConditionAandB como condición para el recurso EC2RouteA. Observe las siguientes plantillas de ejemplo de JSON y YAML.

Ejemplo de JSON (correcto):

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

Ejemplo de YAML (correcto):

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:

Comprobación de la disponibilidad del tipo de recurso

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

No todos los tipos de recursos están disponibles en todas las regiones de AWS. Las plantillas que incluyan tipos de recursos que no estén disponibles en su región de AWS generarán el siguiente error: «Unrecognized resource types: [XXXXXXXX]».

2. Si su plantilla está compuesta por algún recurso sin servidor, entonces incluya una declaración Transform. Observe las siguientes plantillas de ejemplo de JSON y YAML.

Ejemplo de 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"
            }
        }
   }
}

Ejemplo de 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'

Comprobación de si los recursos existen fuera de la pila o validación de las dependencias para recursos en la misma pila

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

  • El nombre del 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, un recurso AWS::EC2::Instance en su pila que especifique un grupo de seguridad (sg-1234567890) generará un error si:

  • El grupo de seguridad no existe.
  • El grupo de seguridad no existe en la región de AWS de la pila.

Como resultado, se mostrará el mensaje de error: «The sg-1234567890 does not exist». Observe 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.>

Comprobación de las propiedades de la plantilla

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

En las siguientes plantillas de ejemplo de JSON y YAML, el recurso del bucket se encuentra en el mismo nivel que la sección Resources. Esto devuelve el siguiente error: «Template validation error: Invalid template property or properties [Bucket]». Este error se debe a que el validador de plantillas de CloudFormation interpreta el recurso del bucket como una especificación en el nivel de sección. No se permite una especificación en el nivel de sección como propiedad de plantilla.

Ejemplo de JSON (incorrecto):

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

Ejemplo de YAML (incorrecto):

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

Para solucionar este problema, corrija el formato de modo que el recurso del bucket se especifique dentro de la sección Resources. Observe las siguientes plantillas de ejemplo de JSON y YAML con formato correcto.

Ejemplo de JSON (correcto):

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

Ejemplo de YAML (correcto):

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

Comprobación de la sintaxis de la política de cualquier recurso relacionado con una política de IAM

Si está creando un recurso de política de Identity and Access Management (IAM) o una configuración relacionada en las propiedades de sus recursos, compruebe que la política sea válida con esta base de estructura.

{  
    "Resources": {  
        "Policy": {  
            "Type": "AWS::IAM::Policy",  
            "Properties": {  
                "PolicyName": "IamPolicyName",  
                "PolicyDocument": {  
                    "Version": "2012-10-17",  
                    "Statement": [  
                        {  
                            "Effect": "effect",  
                            "Action": [  
                                "<service>:<API_action>",  
                                "<...>"  
                            ],  
                            "Resource": "desiredResourceARN",  
                            "Condition": {  
                                "ConditionConfiguration": {  
                                    "conditionKey": [  
                                        "values"  
                                    ]  
                                },  
                                "ConditionConfiguration2": "<...>"  
                            }  
                        }  
                    ]  
                }  
            }  
        }  
    }  
}

Nota: Sustituya <service> por el nombre de servicio que desee. Sustituya <APIaction> por la acción de API para el servicio seleccionado. Para obtener más información, consulte IAM JSON policy.

Integración del documento de política JSON con un formato YAML

Es posible que desee integrar un documento de política JSON con una plantilla en formato YAML para aprovisionar CloudFormation. Para ello debe cambiar la apariencia del documento en la plantilla.

Tras la integración, los elementos de la política tienen un aspecto similar al que se muestra a continuación:

Resources:  
  Policy:  
    Type: 'AWS::IAM::Policy'  
    Properties:  
      PolicyName: IamPolicyName  
      PolicyDocument:  
        Version: 2012-10-17  
        Statement:  
          - Effect: effect  
            Action:  
              - '<service>:<API_action>'  
              - <...>  
            Resource: desiredResourceARN  
            Condition:  
              ConditionConfiguration:  
                conditionKey:  
                  - values  
              ConditionConfiguration2: <...>
OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 meses