Wie behebe ich Vorlagenvalidierungs- oder Vorlagenformatfehler in CloudFormation?

Lesedauer: 8 Minute
0

Ich erhalte eine Fehlermeldung, wenn ich versuche, meinen AWS-CloudFormation-Stack zu erstellen.

Kurzbeschreibung

Wählen Sie basierend auf der angezeigten Fehlermeldung eine der folgenden Lösungen aus:

  • Informationen zu den Fehlern „JSON nicht ordnungsgemäß formatiert“ oder „YAML nicht ordnungsgemäß formatiert“ finden Sie im Abschnitt Vorlagensyntax validieren.
  • Informationen zu den Fehlern „Ungelöste Ressourcenabhängigkeiten [XXXXXXXX] im Ressourcenblock der Vorlage“ finden Sie im Abschnitt Logische IDs und Parameter validieren.
  • Informationen zu den Fehlern „Unbekannter Parametertyp: XXXXXXXX“ oder „Ungültige Vorlagenparametereigenschaft „XXXXXXXX“ finden Sie im Abschnitt Parameterdefinitionen validieren.
  • Informationen zu den Fehlern „Jedes Bedingungsmitglied muss als eine Zeichenfolge angegeben werden“ finden Sie im Abschnitt Bestätigen, dass Bedingungen als Zeichenfolge angegeben sind.
  • Informationen zu den Fehlern „Unbekannte Ressourcentypen: [XXXXXXXX]“ finden Sie im Abschnitt Überprüfen der Verfügbarkeit Ihres Ressourcentyps.
  • Informationen zu den Fehlern „Die [Umgebungsressource] „XXXXXXXX“ existiert nicht“ finden Sie im Abschnitt Überprüfen, ob Ihre Ressource außerhalb des Stack vorhanden ist, oder überprüfen von Abhängigkeiten für Ressourcen im selben Stack.
  • Informationen zu den Fehlern „Ungültige Vorlageneigenschaft oder -eigenschaften [XXXXXXXX]“ finden Sie im Abschnitt Vorlageneigenschaften überprüfen.

Auflösung

Hinweis: Wenn Sie beim Ausführen von AWS-Command-Line-Interface(AWS CLI)-Befehlen Fehler erhalten, stellen Sie sicher, dass Sie die neueste AWS-CLI-Version verwenden.

Vorlagensyntax überprüfen

Beachten Sie Folgendes, um die richtige JSON- oder YAML-Syntax in Ihrer CloudFormation-Vorlage zu befolgen:

Validieren logischer IDs und Parameter

Bestätigen Sie, dass in Ihrer Vorlage logische IDs und Parameter definiert sind.

In den folgenden JSON- und YAML-Vorlagen beispielsweise wird Test für die ImageId-Eigenschaft referenziert. Keine der Vorlagen enthält jedoch eine logische Ressourcen-ID oder einen Parameter namens test. Diese Vorlagen geben den folgenden Fehler zurück: „Nicht aufgelöste Ressourcenabhängigkeiten [Test] im Ressourcenblock der Vorlage.“ Weitere Informationen zu Ressourcendefinitionen und ihrer Syntax finden Sie unter Ressourcen.

Beispiel-JSON (falsch):

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

Beispiel-YAML (falsch):

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

Um dieses Problem zu beheben, fügen Sie eine logische Ressourcen-ID mit dem Namen test hinzu. Oder erstellen Sie einen Parameter mit dem Namen test, wobei die Referenz den imageId-Wert zurückgibt. Die folgenden JSON- und YAML-Beispielvorlagen enthalten einen Parameter mit dem Namen test und imageId als Wert.

Beispiel-JSON (richtig):

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

Beispiel-YAML (richtig):

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

Validieren von Parameterdefinitionen

1.    Stellen Sie Typ auf eine der folgenden unterstützten Eigenschaften ein:

2.    Vergewissern Sie sich in Ihrer CloudFormation-Vorlage, dass die Parameter nur die folgenden zulässigen Eigenschaften enthalten:

"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.    Vergewissern Sie sich in Ihrer CloudFormation-Vorlage, dass der Abschnitt Parameter keine intrinsischen Funktionen enthält.

In den folgenden JSON- und YAML-Beispielvorlagen hat der Standardwert für ParameterC die intrinsische Funktion Fn::Sub. Diese intrinsische Funktion verursacht den Validierungsfehler: „Jedes Standardelement muss eine Zeichenfolge sein.“

Beispiel-JSON (falsch):

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

Beispiel-YAML (falsch):

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

Bestätigen Sie, dass Bedingungen als Zeichenfolge angegeben sind

Geben Sie in Ihrer CloudFormation-Vorlage Bedingungen als Zeichenfolge an.

In den folgenden JSON- und YAML-Beispielvorlagen wird die Bedingung in der Ressource EC2RouteA als Liste von Zeichenfolgen anstelle einer einzelnen Zeichenfolge angegeben. Diese Vorlagen führen zu dem folgenden Validierungsfehler: „Jedes Bedingungsmitglied muss als eine Zeichenfolge angegeben werden.“

Beispiel-JSON (falsch):

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

Beispiel-YAML (falsch):

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

Um diesen Fehler zu beheben, fügen Sie dem Abschnitt Bedingungen Ihrer Vorlage ConditionAandB hinzu und verwenden Sie dann ConditionAandB als Bedingung für die EC2RouteA-Ressource. Sehen Sie sich die folgenden JSON- und YAML-Beispielvorlagen an.

Beispiel-JSON (richtig):

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

Beispiel-YAML (richtig):

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:

Überprüfen Sie die Verfügbarkeit Ihres Ressourcentyps

1.    Stellen Sie sicher, dass Ihre Ressource in Ihrer AWS-Region verfügbar ist.

Nicht alle Ressourcentypen sind in jeder AWS-Region verfügbar. Vorlagen, die Ressourcentypen enthalten, die in Ihrer AWS-Region nicht verfügbar sind, führen zu folgendem Fehler: „Nicht erkannte Ressourcentypen: [XXXXXXXX]“.

2.    Wenn Ihre Vorlage aus Serverless-Ressourcen besteht, schließen Sie eine Transformations-Deklaration ein. Sehen Sie sich die folgenden JSON- und YAML-Beispielvorlagen an.

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

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

Überprüfen Sie, ob Ihre Ressource außerhalb des Stack vorhanden ist, oder überprüfen Sie Abhängigkeiten für Ressourcen im selben Stack

Wenn Sie eine Ressource oder einen Amazon-Ressourcennamen (ARN) in eine der Ressourcen Ihres Stacks, die außerhalb des CloudFormation-Stacks vorhanden ist, hartcodieren, überprüfen Sie Folgendes:

  • Der Ressourcenname oder ARN ist korrekt.
  • Die Ressource ist vorhanden.
  • Die Ressource befindet sich in derselben AWS-Region wie der Stack. Bedenken Sie, dass einige Ressourcen Eigenschaften in AWS-Regionen oder -Konten akzeptieren.

Beispielsweise schlägt eine AWS::EC2::Instance-Ressource in Ihrem Stack, die eine Sicherheitsgruppe (sg-1234567890) angibt, fehl, wenn:

  • Die Sicherheitsgruppe nicht existiert.
  • Die Sicherheitsgruppe in der AWS-Region des Stacks nicht vorhanden ist.

Sie erhalten daraufhin die Fehlermeldung „sg-1234567890 existiert nicht“. Siehe folgendes Beispiel:

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

Vorlageneigenschaften überprüfen

Verwenden Sie in Ihrer CloudFormation-Vorlage nur zulässige Vorlageneigenschaften.

In den folgenden JSON- und YAML-Beispielvorlagen befindet sich die Bucket-Ressource auf derselben Ebene wie der Abschnitt Ressourcen. Dies gibt den folgenden Fehler zurück: „Vorlagenvalidierungsfehler: Ungültige Vorlageneigenschaft oder -eigenschaften [Bucket].“ Dieser Fehler wird verursacht, weil der CloudFormation-Vorlagenvalidator die Bucket-Ressource als Spezifikation auf Abschnittsebene sieht. Eine Angabe auf Abschnittsebene ist als Vorlageneigenschaft nicht zulässig.

Beispiel-JSON (falsch):

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

Beispiel-YAML (falsch):

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

Um dieses Problem zu beheben, korrigieren Sie die Formatierung, sodass die Bucket-Ressource im Abschnitt Ressourcen angegeben ist. Im folgenden Beispiel sehen Sie korrekt formatierte JSON- und YAML-Vorlagen.

Beispiel-JSON (richtig):

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

Beispiel-YAML (richtig):

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

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 9 Monaten