¿Cómo puedo solucionar los errores de validación o formato de las plantillas en CloudFormation?
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:
- Cree su pila con AWS CloudFormation Designer.
- Valide la sintaxis de JSON con un editor de texto o una herramienta de línea de comandos como el validador de plantillas de AWS CLI.
- Valide su sintaxis de YAML con el comando aws cloudformation validate-template.
- Valide sus plantillas de JSON o YAML con el linter de AWS CloudFormation en el sitio web de GitHub.
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
- Defina Type con una de las siguientes propiedades compatibles:
- String, Number, List o CommaDelimitedList
- AWS-specific parameter types
- SSM parameter types
- 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.
- 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: <...>
Vídeos relacionados
Contenido relevante
- preguntada hace un meslg...
- preguntada hace un meslg...
- preguntada hace 6 díaslg...
- preguntada hace 6 díaslg...
- Como solucionar el error: Supplied Policy document is breaching Cloudwatch Logs policy length limit.Respuesta aceptadapreguntada hace 13 díaslg...
- OFICIAL DE AWSActualizada hace un año
- OFICIAL DE AWSActualizada hace 3 años
- OFICIAL DE AWSActualizada hace 3 años
- OFICIAL DE AWSActualizada hace 4 años