Wie behebe ich Vorlagenvalidierungs- oder Vorlagenformatfehler in CloudFormation?

Letzte Aktualisierung:25.06.2021

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 „Nicht aufgelöste Ressourcenabhängigkeiten [XXXXXXXX] im Ressourcenblock der Vorlage“ finden Sie im Abschnitt Logische und physische IDs 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 „Nicht unterstützte Eigenschaft XXXXXXXX aufgetreten“ finden Sie im Abschnitt Eigenschaften, Werte und Werttypen validieren.
  • 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 „Mindestens ein Ressourcenmitglied muss definiert werden“ finden Sie im Abschnitt Ressourcen in Ihre Vorlage einschließen.
  • 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:

Logische und physische IDs validieren

1.    Bestätigen Sie, dass in Ihrer Vorlage logische Ressourcen-IDs definiert sind.

2.    Vergewissern Sie sich, dass in Ihrer Umgebung physische Ressourcen-IDs vorhanden sind.

Test wird beispielsweise für die ImageId-Eigenschaft in den folgenden JSON- und YAML-Vorlagen referenziert. Keine der Vorlagen enthält eine logische Ressourcen-ID oder einen Parameter namens test.

Die Ressourcen-ID ist in den folgenden JSON- und YAML-Vorlagen nicht richtig definiert. 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.

JSON:

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

YAML:

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

Parameterdefinitionen validieren

1.    Legen Sie den Typ nur auf eine der folgenden Eigenschaften fest: String, Number, List<Number> oder CommaDelimitedList.

Hinweis: Diese Eigenschaften umfassen AWS-spezifische Parametertypen und AWS-Systems-Manager-Agent-(SSM Agent)-Parametertypen.

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.

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

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

Bestätigen Sie, dass Bedingungen als Zeichenfolge angegeben sind

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

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

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:

Um diesen Fehler zu beheben, fügen Sie 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.

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:

Ü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. Beispielsweise ist der Ressourcentyp AWS::WAFRegional::IPSet in den folgenden JSON- und YAML-Vorlagen derzeit in ap-south-1 nicht verfügbar. Diese Vorlagen führen zu dem folgenden Fehler: „Unbekannte Ressourcentypen: [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

Hinweis: CloudFormation-Vorlagen werden als Textdateien in einem Format gespeichert, das den JSON- oder YAML-Standards entspricht. Die vorherigen JSON- und YAML-Vorlagen verwenden dieselbe Vorlage, jedoch ein anderes Format. Weitere Informationen zum YAML-Support finden Sie unter Grundlagen zu Vorlagen lernen und AWS CloudFormation-Aktualisierung – YAML, stackübergreifende Referenzen, vereinfachte Ersetzung.

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

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'

Validieren von Eigenschaften, Werten und Werttypen

Verwenden Sie in Ihren Vorlagenabschnitten und Ressourcendefinitionen gültige Eigenschaften, Werte und Werttypen.

Ü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) für eine Ressource, die außerhalb des CloudFormation-Stacks vorhanden ist, in eine der Ressourcen Ihres Stacks 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.

Wenn die Sicherheitsgruppe beispielsweise nicht vorhanden ist oder in der AWS-Region des Stack für eine AWS::EC2::Instance-Ressource in Ihrem Stack nicht vorhanden ist, die eine Sicherheitsgruppe (sg-1234567890) angibt, dann schlägt die AWS:: EC2::Instance-Ressource fehl. Sie erhalten folgende 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.>

Fügen Sie einen Abschnitt Ressourcen in Ihre Vorlage ein

Sie müssen einen Abschnitt Ressourcen in Ihre CloudFormation-Vorlage aufnehmen, oder Sie erhalten eine Fehlermeldung.

Vorlageneigenschaften überprüfen

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

In den folgenden JSON- und YAML-Beispielen 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].“ Der Fehler wird verursacht, weil der CloudFormation-Vorlagenvalidator die Bucket-Ressource als Spezifikation auf Abschnittsebene sieht, die als Vorlageneigenschaft nicht zulässig ist.

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

Hinweis: Ersetzen Sie in den vorherigen JSON- und YAML-Vorlagen BucketName durch Ihren Bucket-Namen.


War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?