Direkt zum Inhalt

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

Lesedauer: 8 Minute
0

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

Behebung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

Führe die folgenden Aufgaben basierend auf der Fehlermeldung aus, die du erhältst.

Fehler „JSON not well-formed“ oder „YAML not well-formed“

Wenn du deine CloudFormation-Vorlage nicht korrekt formatiert hast, erhältst du eine der folgenden Fehlermeldungen:

„JSON not well-formed“

„YAML not well-formed“

Stelle sicher, dass du die bewährten Methoden für JSON- oder YAML-Syntax in deiner CloudFormation-Vorlage befolgst. Gehe wie folgt vor, um diesen Fehler zu beheben:

  • Erstelle deinen Stack mit Infrastructure Composer.
  • Validiere deine JSON- und YAML-Syntax mit dem AWS-CLI-Befehl validate-template.
  • Um deine JSON- oder YAML-Vorlagen mit dem AWS-CloudFormation-Linter zu validieren, siehe cfn-lint auf der GitHub-Website.

Fehler „Unresolved resource dependencies [XXXXXXXX] in the Resources block of the template“

Wenn deine CloudFormation-Vorlage keine logische ID für eine Ressource oder keinen Parameter angibt, erhältst du die folgende Fehlermeldung:

„Unresolved resource dependencies [test] in the Resources block of the template.“.

Um diesen Fehler zu beheben, gib eine logische Ressourcen-ID an. Oder erstelle einen Parameter mit dem Namen test, bei dem die Referenz den Wert ImageId zurückgibt. Die folgenden Beispiel-JSON- und -YAML-Vorlagen enthalten einen Parameter mit test als Namen und ImageId als Wert.

Beispiel JSON:

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

Beispiel YAML:

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

Fehler „Unrecognized parameter type: XXXXXXXX“ oder „Invalid template parameter property 'XXXXXXXX'“

Wenn deine JSON- und YAML-Vorlagen den Standardwert für ParameterC als intrinsische Funktion Fn::Sub enthalten, erhältst du die folgende Fehlermeldung:

„Every Default member must be a string.“

Parameter unterstützen keine intrinsischen Funktionen. Verwende die Funktion Fn::Sub, um die Werte für ParameterA und ParameterB anzugeben. Um diesen Fehler zu beheben, entferne ParameterC.

Um ParameterC in deiner CloudFormation-Vorlage zu entfernen, führe die folgenden Schritte aus:

  1. Setze Type auf eine der folgenden unterstützten Eigenschaften: String, Number, List oder CommaDelimitedList.
  2. Überprüfe, dass die Parameter nur die zulässigen Eigenschaften enthalten.
  3. Bestätige, dass der Abschnitt Parameter keine intrinsischen Funktionen enthält.

Beispiel JSON:

{
  "Parameters": {
    "ParameterA": {
      "Type": "String",
      "Default": "abc"
    },
    "ParameterB": {
      "Type": "String",
      "Default": "def"
    }
  },
  "Resources": {
    "MyS3Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "BucketName": {
          "Fn::Sub": "${ParameterA}-${ParameterB}"
        }
      }
    }
  }
}

Beispiel YAML:

Parameters:
 ParameterA:
  Type: String
  Default: abc
 ParameterB:
  Type: String
  Default: def
Resources:
 MyS3Bucket:
  Type: 'AWS::S3::Bucket'
  Properties:
   BucketName: !Sub ${ParameterA}-${ParameterB}

Fehler „Every Condition member must be a string“

Deine JSON- und YAML-Vorlagen geben möglicherweise die Bedingung in der Ressource EC2RouteA als Liste von Zeichenfolgen anstelle einer einzelnen Zeichenfolge an. Wenn dies der Fall ist, erhältst du die folgende Fehlermeldung:

„Every Condition member must be a string.“

Um diesen Fehler zu beheben, füge ConditionAandB zum Abschnitt Bedingungen deiner Vorlage hinzu. Verwende dann ConditionAandB als Bedingung für die Ressource EC2RouteA.

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

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

Fehler „Unrecognized resource types: [XXXXXXXX]“

Nicht jeder Ressourcentyp ist in jeder AWS-Region verfügbar. Wenn deine Vorlage Ressourcentypen enthält, die in deiner Region nicht verfügbar sind, erhältst du die folgende Fehlermeldung:

„Unrecognized resource types: [XXXXXXXX].“

Um diesen Fehler zu beheben, überprüfe, dass deine Ressource in deiner Region verfügbar ist. Wenn deine Vorlage aus Serverless-Ressourcen besteht, füge eine Transform-Deklaration hinzu.

Beispiel JSON:

{
    "Transform": "AWS::Serverless-2016-10-31", #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 #Make sure to include this.
Resources:
  MyServerlessFunctionLogicalID:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: 's3://testBucket/mySourceCode.zip'

Fehler „The [environmental resource] 'XXXXXXXX' does not exist“

Wenn die AWS::EC2::Instance in deinem Stack eine Sicherheitsgruppe angibt, erhältst du die folgende Fehlermeldung:

„The sg-1234567890 does not exist.“

Der Stack schlägt fehl, wenn die Sicherheitsgruppe nicht existiert oder nicht in der Region des Stacks vorhanden ist. Um diesen Fehler zu beheben, füge SecurityGroupIDs zu deiner Vorlage hinzu.

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

Wenn du eine Ressource oder einen Amazon-Ressourcennamen (ARN) fest in eine der Ressourcen deines Stacks einträgst, die sich außerhalb des CloudFormation-Stacks befindet, überprüfe Folgendes:

  • Der Ressourcenname oder ARN ist korrekt.
  • Die Ressource ist vorhanden.
  • Die Ressource existiert in derselben Region wie der Stack. Einige Ressourcen akzeptieren Eigenschaften regions- oder kontenübergreifend.

Fehler „Invalid template property or properties [XXXXXXXX]“

Wenn du die Bucket-Ressource auf derselben Ebene wie den Abschnitt Ressourcen in deinen JSON- und YAML-Vorlagen festlegst, erhältst du die folgende Fehlermeldung:

„Template validation error: Invalid template property or properties [Bucket].“

Dieser Fehler tritt auf, wenn der CloudFormation-Vorlagenprüfer die Bucket-Ressource als Spezifikation auf Abschnittsebene identifiziert. Eine Spezifikation auf Abschnittsebene ist als Vorlageneigenschaft nicht zulässig. Es ist eine bewährte Methode, in deiner CloudFormation-Vorlage nur zulässige Vorlageneigenschaften zu verwenden.

Um diesen Fehler zu beheben, gib die Bucket-Ressource innerhalb des Abschnitts Ressourcen an.

Beispiel JSON:

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

Hinweis: Ersetze BucketName durch deinen Bucket-Namen.

Beispiel YAML:

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

Hinweis: Ersetze BucketName durch deinen Bucket-Namen.

Fehler „Invalid policy syntax“ oder „MalformedPolicy“

Wenn du eine Identitätsrichtlinie, Ressourcenrichtlinie, Service-Kontrollrichtlinie oder Ressourcen-Kontrollrichtlinie erstellst, wird die Validierung in zwei Schritte unterteilt. Diese Schritte umfassen die AWS Identity and Access Management (IAM)-Validierung und die CloudFormation-Validierung.

Um die Richtlinie zu validieren, erstelle deine Richtlinie und führe dann den folgenden AWS-CLI-Befehl validate-policy aus:

➜  aws accessanalyzer validate-policy --policy-document file://policy-document.json --policy-type IDENTITY_POLICY

Hinweis: Ersetze policy-document.json durch den Dateipfad zu deiner JSON-Datei.

Wenn du den AWS-CLI-Befehl validate-policy ausführst, erhältst du die Fehlermeldung „Invalid policy syntax“ oder „MalformedPolicy“. Um dieses Problem zu beheben, ändere die Aktion zu s3:DeleteObject und führe den Befehl erneut aus.

Beispiel JSON:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyObjectDeletionForAllExceptRolePrefix",
      "Effect": "Deny",
      "Action": [
        "s3:DeleteObject",
        "s3:DeleteObjectVersion",
        "s3:PutLifecycleConfiguration"
      ],
      "Resource": ["arn:aws:s3:::BUCKET_NAME/*"]
    }
  ]
}

Hinweis: Ersetze BUCKET_NAME durch deinen Bucket-Namen.

Füge die validierte Richtlinie deiner CloudFormation-Vorlage hinzu und gib Parameter oder Ressourcen an.

Wenn die Sub-Funktion auf einen Parameter verweist, der nicht in der Vorlage vorhanden ist, erhältst du die folgende Fehlermeldung:

„An error occurred (ValidationError) when calling the ValidateTemplate operation: Template format error: Unresolved resource dependencies [Bucket] in the Resources block of the template“

Um diesen Fehler zu beheben, aktualisiere die Ressource in der Vorlage zu arn:aws:s3:::${BucketName}/*.

Beispiel JSON:

{
  "Parameters": {
    "BucketName": {
      "Type": "String"
    },
    "RoleName": {
      "Type": "String"
    }
  },
  "Resources": {
    "ManagedPolicy": {
      "Type": "AWS::IAM::ManagedPolicy",
      "Properties": {
        "Roles": [
          {
            "Ref": "RoleName"
          }
        ],
        "PolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Sid": "DenyObjectDeletionForAllExceptRolePrefix",
              "Effect": "Deny",
              "Action": [
                "s3:DeleteObject",
                "s3:DeleteObjectVersion",
                "s3:PutLifecycleConfiguration"
              ],
              "Resource": [
                {
                  "Fn::Sub": "arn:aws:s3:::${BucketName}/*"
                }
              ]
            }
          ]
        }
      }
    }
  }
}

Hinweis: Ersetze BucketName durch deinen Bucket-Namen.

Richtliniensyntax für IAM-bezogene Ressourcen manuell überprüfen

Um manuell zu überprüfen, ob die Richtlinie gültig ist, verwende die folgende Richtlinienvorlage:

{  
    "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: Ersetze Service durch deinen Service-Namen und API_action durch deine API-Aktion für den ausgewählten Service. Weitere Informationen findest du unter IAM-JSON-Richtlinienelementreferenz.

JSON-Richtliniendokument in eine Vorlage im YAML-Format integrieren

Wenn du ein JSON-Richtliniendokument in eine Vorlage im YAML-Format für die Bereitstellung mit CloudFormation integrierst, kannst du ändern, wie das Dokument in der Vorlage dargestellt wird. Dadurch werden gemischte YAML- und JSON-Blöcke vermieden. Nach der Integration sehen die Richtlinienelemente ähnlich wie in der folgenden Beispielvorlage aus:

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: Ersetze IamPolicyName durch den Namen deiner IAM-Richtlinie.

AWS OFFICIALAktualisiert vor 5 Monaten