Come posso risolvere gli errori di convalida o di formato del modello in CloudFormation?

9 minuti di lettura
0

Ricevo un messaggio di errore quando provo a creare la mia pila AWS CloudFormation.

Breve descrizione

Scegli una delle soluzioni seguenti sulla base del messaggio di errore ricevuto:

  • Per i messaggi di errore "JSON non formato correttamente" o "YAML non formato correttamente", consulta la sezione Convalidare la sintassi del modello.
  • Per gli errori «Dipendenze di risorse irrisolte [XXXXXXXX] nel blocco Risorse del modello», consulta la sezioneConvalida degli ID logici e dei parametri.
  • Per gli errori «Tipo di parametro non riconosciuto: XXXXXXXX» o «Proprietà del parametro modello 'XXXXXXXX' non valida», vedere la sezioneConvalida delle definizioni dei parametri.
  • Per i messaggi di errore "Tutti i membri di condizione devono essere una stringa", consulta la sezione Confermare che le condizioni siano specificate come stringa.
  • Per i messaggi di errore "Tipi di risorsa non riconosciuti: [XXXXXXXX]", consulta la sezione Verificare la disponibilità del tipo di risorsa.
  • Per i messaggi di errore "La [risorsa ambientale] XXXXXXXX non esiste", consulta la sezione Verificare che la tua risorsa esista al di fuori della pila o convalidare le dipendenze per le risorse nella stessa pila.
  • Per i messaggi di errore "Una o più proprietà [XXXXXXXX] del modello non valide", consulta la sezione Verificare le proprietà del modello.

Risoluzione

Nota: se ricevi un messaggio di errore durante l’esecuzione dei comandi AWS Command Line Interface (AWS CLI), assicurati di utilizzare la versione più recente di AWS CLI.

Convalidare la sintassi del modello

Per seguire una sintassi JSON o YAML adeguata nel tuo modello CloudFormation, prendi in considerazione quanto segue:

Convalida ID e parametri logici

Conferma che gli ID e i parametri logici delle risorse siano definiti nel modello.

Nei seguenti modelli JSON e YAML, si fa riferimento al test per la proprietà ImageId. Tuttavia, nessun modello include un ID logico delle risorse o un parametro chiamato test. Questi modelli mostrano il messaggio di errore seguente: "Dipendenze [test] delle risorse non risolte nel blocco delle risorse del modello." Per ulteriori informazioni sulle definizioni delle risorse e sulla loro sintassi, consulta Risorse.

Esempio JSON (errato):

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

Esempio YAML (errato):

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

Per risolvere questo problema, aggiungi un ID logico della risorsa denominato test. Oppure crea un parametro denominato test in cui il riferimento restituisca il valore imageId. I seguenti esempi di modelli JSON e YAML includono un parametro denominato test e imageId come valore.

Esempio JSON (corretto):

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

Esempio YAML (corretto):

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

Convalidare le definizioni dei parametri

1.    Imposta Type (Tipo) su una delle seguenti proprietà supportate:

2.    Nel tuo modello CloudFormation, verifica che i parametri includano una delle seguenti proprietà consentite:

"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.    Nel tuo modello CloudFormation, conferma che la sezione Parameters (Parametri) non contenga alcuna funzione intrinseca.

Nei seguenti esempi di modelli JSON e YAML, il valore predefinito per ParameterC presenta la funzione intrinseca Fn::Sub. Questa funzione intrinseca provoca l'errore di convalida "Tutti i membri predefiniti devono essere una stringa."

Esempio JSON (errato):

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

Esempio YAML (errato):

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

Confermare che le Condizioni siano specificate come stringa

Nel tuo modello CloudFormation, specifica le Condizioni come stringa.

Nei seguenti esempi di modelli JSON e YAML, la condizione nella risorsa EC2RouteA viene specificata come un elenco di stringhe anziché come una singola stringa. Questi modelli provocano l'errore di convalida seguente: "Tutti i membri di condizione devono essere una stringa."

Esempio JSON (errato):

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

Esempio YAML (errato):

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

Per risolvere questo errore, aggiungi ConditionAandB alla sezione Conditions (Condizioni) del tuo modello, quindi utilizza ConditionAandB come condizione per la risorsa EC2RouteA. Consulta gli esempi seguenti relativi ai modelli JSON e YAML.

Esempio JSON (corretto):

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

Esempio YAML (corretto):

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:

Verificare la disponibilità del tuo tipo di risorsa

1.    Verifica che la tua risorsa sia disponibile nella tua Regione AWS.

Non tutti i tipi di risorse sono disponibili in tutte le regioni AWS. I modelli che includono tipi di risorse non disponibili nella tua regione AWS generano il seguente errore: "Tipi di risorse non riconosciuti: [XXXXXXXX]."

2.    Se il tuo modello è composto da risorse serverless, includi una dichiarazione Transform (Trasformazione). Consulta gli esempi seguenti relativi ai modelli JSON e YAML.

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

Esempio 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'

Verifica che la tua risorsa sia presente al di fuori della pila o convalida le dipendenze delle risorse nella stessa pila

Se stai codificando una risorsa o un Amazon Resource Name (ARN) in una delle risorse della tua pila per una al di fuori della pila CloudFormation, verifica quanto segue:

  • Che il nome della risorsa o l'ARN sia corretto.
  • Che la risorsa esista.
  • Che la risorsa esista nella stessa Regione AWS della pila. Tieni presente che alcune risorse accettano proprietà attraverso regioni AWS o account.

Ad esempio, una risorsa AWS::EC2::Instance nella pila che specifica un gruppo di sicurezza (sg-1234567890) ha esito negativo se:

  • Il gruppo di sicurezza non esiste.
  • Il gruppo di sicurezza non esiste nella regione AWS della pila.

Di conseguenza, ricevi il messaggio d'errore: "La sg-1234567890 non esiste." Vedi gli esempi seguenti:

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

Verificare le proprietà del modello

Utilizza esclusivamente proprietà del modello consentite nel tuo modello CloudFormation.

Nei seguenti esempi di modelli JSON e YAML, la risorsa bucket è allo stesso livello della sezione Resources (Risorse). Ciò provoca il messaggio d'errore seguente: "Errore di convalida del modello: una o più proprietà del modello non valide [Bucket]." Questo errore si verifica perché il validatore del modello CloudFormation vede la risorsa bucket come specifica della sezione. Una specifica della sezione non è consentita come proprietà del modello.

Esempio JSON (errato):

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

Esempio YAML (errato):

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

Per risolvere questo problema, correggere la formattazione in modo che la risorsa bucket sia specificata all'interno della sezione Resources (Risorse). Consulta i seguenti esempi di modelli JSON e YAML formattati correttamente.

Esempio JSON (corretto):

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

Esempio YAML (corretto):

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

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa