Wie behebe ich Fehler bei der Vorlagenüberprüfung oder beim Vorlagenformat in CloudFormation?

Lesedauer: 9 Minute
0

Ich möchte meine AWS-CloudFormation-Vorlage überprüfen, um sicherzustellen, dass ich keine Syntaxfehler habe.

Kurzbeschreibung

Wählen Sie basierend auf der Fehlermeldung, die Sie erhalten, eine der folgenden Behebungen:

  • Informationen zu den Fehlern „JSON not well-formed“ oder „YAML not well-formed“ finden Sie im Abschnitt Vorlagensyntax überprüfen.
  • Informationen zu den Fehlern „Unresolved resource dependencies \ [XXXXXXXX] in the Resources block of the template“ finden Sie im Abschnitt Logische IDs und Parameter überprüfen.
  • Informationen zu den Fehlern „Unrecognized parameter type“: XXXXXXXX“ oder „Invalid template parameter property 'XXXXXXXX'“ finden Sie im Abschnitt Parameterdefinitionen überprüfen.
  • Informationen zu den Fehlern „Every condition member must be a string“ finden Sie im Abschnitt Bestätigen, dass Bedingungen als Zeichenfolge angegeben sind.
  • Informationen zu den Fehlern „Unrecognized resource types: \ [XXXXXXXX]“ finden Sie im Abschnitt Verfügbarkeit Ihres Ressourcentyps überprüfen.
  • Informationen zu den Fehlern „The [environmental resource] 'XXXXXXXX' does not exist“ finden Sie im Abschnitt Sicherstellen, dass Ihre Ressource außerhalb des Stacks existiert, oder Abhängigkeiten für Ressourcen im selben Stack überprüfen.
  • Informationen zu den Fehlern „Invalid template property or properties [XXXXXXXX]“ finden Sie im Abschnitt Vorlageneigenschaften überprüfen.
  • Informationen zu den Fehlern „Invalid policy syntax“ oder „MalformedPolicy“ finden Sie im Abschnitt Richtliniensyntax für alle Ressourcen im Zusammenhang mit IAM-Richtlinien überprüfen.

Behebung

Wenn bei der Ausführung von AWS Command Line Interface (AWS CLI)-Befehlen Fehler auftreten, finden Sie weitere Informationen unter Beheben von Fehlern in der AWS CLI. Stellen Sie außerdem sicher, dass Sie die neueste Version von AWS CLI verwenden.

Vorlagensyntax überprüfen

Beachten Sie Folgendes, um der korrekten JSON- oder YAML-Syntax in Ihrer CloudFormation-Vorlage zu folgen:

Logische IDs und Parameter überprüfen

Vergewissern Sie sich, dass die logischen IDs und Parameter der Ressource in Ihrer Vorlage definiert sind.

In den folgenden JSON- und YAML-Vorlagen wird für die ImageId-Eigenschaft auf test verwiesen. Keine der Vorlagen enthält jedoch eine logische Ressourcen-ID oder einen Parameter namens test. Diese Vorlagen lösen den folgenden Fehler aus: „Unresolved resource dependencies [test] in the Resources block of the template.“ 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, bei dem die Referenz den ImageId-Wert zurückgibt. Die folgenden JSON- und YAML-Beispielvorlagen enthalten einen Parameter namens 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

Parameterdefinitionen überprüfen

  1. Stellen Sie Type auf eine der folgenden unterstützten Eigenschaften ein:
  2. Stellen Sie in Ihrer CloudFormation-Vorlage sicher, dass die Parameter nur die folgenden zulässigen Eigenschaften enthalten. Weitere Informationen zu erlaubten Eigenschaften finden Sie unter Eigenschaften.
  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 Überprüfungsfehler: „Every Default member must be a string.“

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, dass Bedingungen als Zeichenfolge angegeben sind

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

Die folgenden Beispiel-JSON- und YAML-Vorlagen spezifizieren die Bedingung in der Ressource EC2RouteA als Liste von Zeichenfolgen statt als einzelne Zeichenfolge. Diese Vorlagen führen zu dem folgenden Überprüfungsfehler: „Every Condition member must be a string.“

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 ConditionAandB zum Abschnitt Bedingungen Ihrer Vorlage hinzu und verwenden Sie dann ConditionAandB als Bedingung für die EC2RouteA-Ressource. Sehen Sie sich die folgenden Beispielvorlagen für JSON und YAML 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:

Verfügbarkeit Ihres Ressourcentyps überprüfen

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 dem folgenden Fehler: "Unrecognized resource types: [XXXXXXXX]."

2. Wenn Ihre Vorlage aus serverlosen Ressourcen besteht, fügen Sie eine Transform-Deklaration hinzu. Sehen Sie sich die folgenden Beispielvorlagen für JSON und YAML 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'

Sicherstellen, dass Ihre Ressource außerhalb des Stacks existiert, oder Abhängigkeiten für Ressourcen im selben Stack überprüfen

Wenn Sie eine Ressource oder einen Amazon-Ressourcennamen (ARN) für eine Ressource, die sich außerhalb des CloudFormation-Stacks befindet, fest 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. Beachten Sie, dass einige Ressourcen Eigenschaften über AWS-Regionen oder Konten hinweg 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.

Als Ergebnis erhalten Sie die Fehlermeldung: „The sg-1234567890 does not exist.“ 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.

Die folgenden JSON- und YAML-Beispielvorlagen setzen die Bucket-Ressource auf dieselbe Ebene wie den Abschnitt Ressourcen. Dies führt zum folgenden Fehler: „Template validation error: Invalid template property or properties [Bucket].“ Dieser Fehler wird verursacht, wenn der CloudFormation-Vorlagenprüfer die Bucket-Ressource als Spezifikation auf Abschnittsebene erkennt. Eine Spezifikation 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 wird. Sehen Sie sich die folgenden Beispiele für JSON- und YAML-Vorlagen an, die korrekt formatiert sind.

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

Richtliniensyntax für alle Ressourcen im Zusammenhang mit IAM-Richtlinien überprüfen

Wenn Sie eine Identity and Access Management (IAM)-Richtlinienressource oder eine zugehörige Konfiguration in Ihren Ressourceneigenschaften erstellen, stellen Sie sicher, dass die Richtlinie mit dieser Strukturbasis gültig ist.

{  
    "Resources": {  
        "Policy": {  
            "Type": "AWS::IAM::Policy",  
            "Properties": {  
                "PolicyName": "IamPolicyName",  
                "PolicyDocument": {  
                    "Version": "2012-10-17",  
                    "Statement": [  
                        {  
                            "Effect": "effect",  
                            "Action": [  
                                "<service>:<API_action>",  
                                "<...>"  
                            ],  
                            "Resource": "desiredResourceARN",  
                            "Condition": {  
                                "ConditionConfiguration": {  
                                    "conditionKey": [  
                                        "values"  
                                    ]  
                                },  
                                "ConditionConfiguration2": "<...>"  
                            }  
                        }  
                    ]  
                }  
            }  
        }  
    }  
}

**Hinweis:Ersetzen Sie<service>**mit einem Servicenamen Ihrer Wahl. Ersetzen Sie <APIaction> mit der API-Aktion für Ihren ausgewählten Dienst. Weitere Informationen finden Sie unter Richtlinienelemente von IAM JSON.

Ihr JSON-Richtliniendokument in ein YAML-Format integrieren

Möglicherweise möchten Sie ein JSON-Richtliniendokument in eine Vorlage im YAML-Format für die Bereitstellung von CloudFormation integrieren. Dazu müssen Sie ändern, wie das Dokument in der Vorlage angezeigt wird.

Nach der Integration sehen die Richtlinienelemente ähnlich aus wie unten dargestellt:

Resources:  
  Policy:  
    Type: 'AWS::IAM::Policy'  
    Properties:  
      PolicyName: IamPolicyName  
      PolicyDocument:  
        Version: 2012-10-17  
        Statement:  
          - Effect: effect  
            Action:  
              - '<service>:<API_action>'  
              - <...>  
            Resource: desiredResourceARN  
            Condition:  
              ConditionConfiguration:  
                conditionKey:  
                  - values  
              ConditionConfiguration2: <...>