Wie behebe ich Vorlagenvalidierungs- oder Vorlagenformatfehler in CloudFormation?
Letzte Aktualisierung: 23.02.2022
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 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:
- Erstellen Sie Ihren Stack mit AWS CloudFormation Designer.
- Validieren Sie Ihre JSON-Syntax mit einem Texteditor oder einem Befehlszeilen-Tool wie dem AWS-CLI-Vorlagen-Validator.
- Validieren Sie Ihre YAML-Syntax mit dem Befehl aws cloudformation validate-template.
- Validieren Sie Ihre JSON- oder YAML-Vorlagen mit dem AWS-CloudFormation-Linter auf der GitHub-Website.
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:
- Zeichenfolge, Zahl, Liste<Number> oder CommaDelimitedList
- AWS-spezifische Parametertypen
- SSM-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.
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
War dieser Artikel hilfreich?
Benötigen Sie Hilfe zur Fakturierung oder technischen Support?