Como resolver erros de validação ou de formato de modelos no CloudFormation?

Última atualização: 2021-06-25

Recebo uma mensagem de erro quando tento criar minha pilha do AWS CloudFormation.

Descrição breve

Escolha uma das seguintes soluções com base na mensagem de erro recebida:

  • Para erros “JSON not well-formed” (JSON não bem formado) ou “YAML not well-formed” (YAML não bem formado), consulte a seção Validar a sintaxe do modelo.
  • Para erros “Unresolved resource dependencies [XXXXXXXX] in the Resources block of the template” (Dependências de recursos não resolvidas [XXXXXXXX] no bloco Resources do modelo), consulte a seção Validar IDs lógicos e físicos.
  • Para erros “Unrecognized parameter type: XXXXXXXX” (Tipo de parâmetro não reconhecido: XXXXXXXX) ou “Invalid template parameter property 'XXXXXXXX” (Propriedade de parâmetro de modelo inválida 'XXXXXXXX'), consulte a seção Validar definições de parâmetros.
  • Para erros “Every Condition member must be a string” (Cada membro Conditions deve ser uma string), consulte a seção Confirmar que Conditions está especificada como uma string.
  • Para erros “Unrecognized resource types: [XXXXXXXX]” (Tipos de recursos não reconhecidos: [XXXXXXXX]), consulte a seção Verificar a disponibilidade do tipo de recurso.
  • Para erros “Encountered unsupported property XXXXXXXX” (Propriedade sem suporte encontrada XXXXXXXX), consulte a seção Validar propriedades, valores e tipos de valor.
  • Para erros “The [environmental resource] 'XXXXXXXX' does not exist” (O [recurso ambiental] 'XXXXXXXX' não existe), consulte a seção Verificar se o seu recurso existe fora da pilha ou validar dependências para recursos na mesma pilha.
  • Para erros “At least one Resources member must be defined” (Pelo menos um membro Resources deve ser definido), consulte a seção Incluir uma seção Resources no seu modelo.
  • Para erros “Invalid template property or properties [XXXXXXXX]” (Uma ou mais propriedades de modelo inválidas [XXXXXXXX]), consulte a seção Verificar propriedades de modelos.

Resolução

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), certifique-se de estar usando a versão mais recente da AWS CLI.

Validar a sintaxe do modelo

Para seguir a sintaxe JSON ou YAML apropriada no modelo do CloudFormation, considere o seguinte:

Validar IDs lógicos e físicos

1.    Confirme se IDs lógicos de recursos estão definidos no modelo.

2.    Confirme se existem IDs físicos de recursos no ambiente.

Por exemplo, test é referenciado para a propriedade ImageId nos seguintes modelos JSON e YAML. Nenhum dos modelos inclui um ID lógico de recurso ou um parâmetro chamado test.

O ID do recurso não está definido corretamente nos seguintes modelos JSON e YAML. Esses modelos retornam o erro “Unresolved resource dependencies [test] in the Resources block of the template” (Dependências de recursos não resolvidas [test] no bloco Resources do modelo). Para obter mais informações sobre definições de recursos e sua sintaxe, 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 definições de parâmetros

1.    Defina Type para uma das seguintes propriedades apenas: String, Number, List<Number> ou CommaDelimitedList.

Observação: essas propriedades incluem tipos de parâmetros específicos da AWS e tipos de parâmetros do AWS Systems Manager Agent (SSM Agent).

2.    No modelo do CloudFormation, verifique se os parâmetros incluem apenas as seguintes propriedades 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.    No modelo do CloudFormation, confirme se a seção Parameters não contém funções intrínsecas.

Por exemplo, o valor padrão para ParameterC nos seguintes modelos JSON e YAML tem a função intrínseca Fn::Sub. Essa função intrínseca causa o erro de validação “Every Default member must be a string” (Cada membro Default deve ser uma string).

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 Conditions está especificada como uma string

No modelo do CloudFormation, especifique Conditions como uma string.

Por exemplo, a condição no recurso EC2RouteA é especificada como uma lista de strings em vez de uma única string nos seguintes modelos JSON e YAML de exemplo. Esses modelos resultam no seguinte erro de validação: “Every Condition member must be a string” (Cada membro Conditions deve ser uma string).

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 esse erro, adicione ConditionAandB ao seu modelo e use ConditionaAndB como condição para o recurso EC2RouteA. Veja os seguintes exemplos de modelos JSON e 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 a disponibilidade do tipo de recurso

1.    Verifique se o recurso está disponível na sua Região da AWS.

Nem todos os tipos de recursos estão disponíveis em todas as Regiões da AWS. Por exemplo, o tipo de recurso AWS::WAFRegional::IPSet nos seguintes modelos JSON e YAML não está disponível no momento em ap-south-1. Esses modelos resultam no erro “Unrecognized resource types: [XXXXXXXX]” (Tipos de recursos não reconhecidos: [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

Observação: modelos do CloudFormation são armazenados como arquivos de texto usando um formato que está em conformidade com os padrões JSON ou YAML. Os modelos JSON e YAML anteriores usam o mesmo modelo, mas um formato diferente. Para obter mais informações sobre o suporte ao YAML, consulte Noções básicas sobre modelos e Atualização do AWS CloudFormation — YAML, referências entre pilhas, substituição simplificada.

2.    Se o modelo consistir em recursos sem servidor, inclua uma declaração Transform. Veja os seguintes exemplos de JSON e 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 propriedades, valores e tipos de valor

Use propriedades, valores e tipos de valor válidos em seções e definições de recursos do seu modelo.

Verificar se o seu recurso existe fora da pilha ou validar dependências para recursos na mesma pilha

Se você estiver codificando um recurso ou nome do recurso da Amazon (ARN) para um recurso existente fora da pilha do CloudFormation em um dos recursos da sua pilha, verifique o seguinte:

  • Se o nome do recurso ou ARN está correto.
  • Se o recurso existe.
  • Se o recurso existe na mesma Região da AWS que a pilha. Considere que alguns recursos aceitam propriedades em todas as contas ou Regiões da AWS.

Por exemplo, se o grupo de segurança não existir ou não existir na Região da AWS da pilha para um recurso AWS::EC2::Instance na sua pilha que esteja especificando um grupo de segurança (sg-1234567890), o recurso AWS::EC2::Instance falhará. Você receberá a seguinte mensagem de erro: "The sg-1234567890 does not exist" (sg-1234567890 não existe). Veja o seguinte exemplo:

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 uma seção Resources no seu modelo

Você deve incluir uma seção Resources no seu modelo do CloudFormation. Caso contrário, receberá um erro.

Verificar as propriedades do modelo

Use somente propriedades de modelo permitidas no seu modelo do CloudFormation.

Nos exemplos JSON e YAML a seguir, o recurso de bucket está no mesmo nível que a seção Resources. Isso retorna o seguinte erro: “Template validation error: Invalid template property or properties [Bucket]” (Erro de validação de modelo: Uma ou mais propriedades de modelo inválidas [Bucket]). Esse erro é causado porque o validador de modelos do CloudFormation vê o recurso de bucket como uma especificação em nível de seção, o que não é permitido como uma propriedade de modelo.

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

Observação: nos modelos JSON e YAML anteriores, substitua BucketName pelo nome do seu bucket.


Este artigo ajudou?


Precisa de ajuda com faturamento ou suporte técnico?