Wie behebe ich den Fehler „Unable to validate the following destination configurations“ in AWS CloudFormation?

Lesedauer: 11 Minute
0

Ich habe einen AWS-Service abonniert und in AWS CloudFormation die Fehlermeldung „Die folgenden Zielkonfigurationen konnten nicht überprüft werden“ erhalten.

Lösung

Um den Fehler Unable to validate zu beheben, ergreife die Maßnahmen zur Problembehandlung für deine Konfiguration.

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.

Probleme mit der Lambda-Benachrichtigungskonfiguration

ARN der Lambda-Funktion existiert nicht oder ist nicht gültig

Wenn dein Amazon Simple Storage Service (Amazon S3)-Bucket die AWS-Lambda-Eigenschaft LambdaConfigurations verwendet, erhältst du möglicherweise die Fehlermeldung lambda function does not exist. Dieser Fehler tritt auf, wenn der für die Lambda-Funktion in der CloudFormation-Vorlage konfigurierte ARN nicht existiert oder nicht gültig ist.

Um zu überprüfen, ob die Lambda-Funktion existiert, führe den Befehl get-function aus:

aws lambda get-function
--function-name YOUR-FUNCTION-ARN-VALUE

Hinweis: Ersetze YOUR-FUNCTION-ARN-VALUE durch den ARN der Lambda-Funktion.

Wenn du in der Befehlsausgabe einen Fehler erhältst, ist der ARN der Lambda-Funktion nicht gültig oder existiert nicht. Aktualisiere die Vorlage, sodass sie den richtigen ARN enthält. Erstelle dann einen neuen Stack mit der aktualisierten Vorlage oder aktualisiere den vorhandenen Stack.

Die Lambda-Funktion ist nicht berechtigt, Amazon S3 aufzurufen

Wenn du die Fehlermeldung resource you requested does not exist erhältst, fehlt deiner Lambda-Funktion eine erforderliche Berechtigung. Gehe wie folgt vor, um dieses Problem zu beheben:

  1. Führe den Befehl get-policy aus, um die Lambda-Funktionsberechtigungen zu überprüfen:
    aws lambda get-policy
    --function-name YOUR-FUNCTION-ARN-VALUE
    --region YOUR-REGION
    Hinweis: Ersetze FUNCTION-ARN-VALUE durch den ARN der Funktion und YOUR-REGION durch deine AWS-Region.
  2. Aktualisiere die CloudFormation-Vorlage, um die folgenden Berechtigungen anzuhängen, damit die Lambda-Funktion Amazon S3 aufrufen kann:
    S3Permission:    
      Type: AWS::Lambda::Permission
      Properties:
        FunctionName: YOUR-FUNCTION-ARN-VALUE
        Action: lambda:InvokeFunction
        Principal: s3.amazonaws.com
        SourceAccount: !Ref 'AWS::AccountId'
    Hinweis: Ersetze FUNCTION-ARN-VALUE durch den ARN der Funktion und AccountID durch das AWS-Konto, dem die Funktion gehört. Du kannst den Pseudoparameter AWS::AccountId verwenden, um automatisch die Konto-ID zu ersetzen, in der CloudFormation den Stack erstellt.
  3. Um sicherzustellen, dass CloudFormation den S3-Bucket erst erstellt, nachdem die Lambda-Funktion über die erforderlichen Berechtigungen verfügt, füge das Attribut DependsOn hinzu:
    S3Bucket:    
      Type: AWS::S3::Bucket
      DependsOn: "S3Permission"
      Properties:
        NotificationConfiguration:
          LambdaConfigurations:
            - Function: YOUR-FUNCTION-ARN-VALUE
                Event: "s3:ObjectCreated:Put"
    
    Hinweis: Ersetze FUNCTION-ARN-VALUE durch den ARN der Funktion.

Probleme mit der Amazon-SNS-Benachrichtigungskonfiguration

Amazon SNS-ARN existiert nicht oder ist nicht gültig

Wenn dein S3-Bucket die Eigenschaft TopicConfigurations verwendet, erhältst du möglicherweise die Fehlermeldung Unable to validate the following destination configurations. Dieser Fehler tritt auf, wenn das Amazon Simple Notification Service (Amazon SNS)-Thema nicht existiert oder nicht gültig ist. Das ARN-Format und der ARN-Wert müssen mit dem ARN des SNS-Themas übereinstimmen.

Um zu überprüfen, ob der ARN des SNS-Themas in deinem Konto vorhanden ist, führe den Befehl list-topics aus:

aws sns list-topics \
--region YOUR-REGION \
--query "Topics[?TopicArn=='YOUR-TOPIC-ARN-VALUE']"

Hinweis: Ersetze YOUR-REGION durch deine Region und YOUR-TOPIC-ARN-VALUE durch den ARN des Themas.

Wenn du in der Befehlsausgabe keine Datensätze erhalten hast, ist das SNS-Thema entweder nicht vorhanden oder nicht gültig. Erstelle das SNS-Thema, um dieses Problem zu beheben. Stelle sicher, dass du in der Eigenschaft TopicConfigurations einen gültigen Themen-ARN angibst.

Für ein SNS-Thema ist keine Zugriffsrichtlinie erforderlich

Gehe wie folgt vor, um zu überprüfen, ob das SNS-Thema über die erforderliche Zugriffsrichtlinie verfügt:

  1. Führe den Befehl get-topic-attributes aus, um die Zugriffsrichtlinie zu überprüfen, die an das SNS-Thema angehängt ist:
    aws sns get-topic-attributes \
    --topic-arn YOUR-TOPIC-ARN-VALUE \
    --region YOUR-REGION \
    --query 'Attributes.Policy'
    Hinweis: Ersetze YOUR-TOPIC-ARN-VALUE durch deinen Themen-ARN und YOUR-REGION durch deine Region.
  2. Die Zugriffsrichtlinie muss es dem Amazon S3-Service erlauben, zum Thema zu veröffentlichen. Wenn die Richtlinie nicht über diese Berechtigungen verfügt, bearbeite die Zugriffsrichtlinie des Themas so, dass sie die folgenden Berechtigungen enthält:
    {     
          "Sid": "S3AccessForNotification",      
          "Effect": "Allow",
          "Principal": {
            "Service": "s3.amazonaws.com"
          },
          "Action": "SNS:Publish",
          "Resource": "YOUR-TOPIC-ARN-VALUE"
    }
    Hinweis: Ersetze YOUR-TOPIC-ARN-VALUE durch deinen Themen-ARN.
  3. Stelle sicher, dass du jetzt einen neuen Stack erstellen oder den vorhandenen Stack aktualisieren kannst.

Problem mit der AWS-KMS-Schlüsselrichtlinie, die dem SNS-Thema zugeordnet ist

Die AWS Key Management Service (AWS KMS)-Richtlinie muss Amazon S3 den Zugriff auf den AWS-KMS-Schlüssel erlauben. Gehe wie folgt vor, um die Verschlüsselungskonfiguration und die erforderliche Mindestrichtlinie anzuzeigen:

Führe den Befehl get-topic-attributes aus, um zu überprüfen, ob das SNS-Thema mit einem AWS-KMS-Schlüssel verschlüsselt ist:

aws sns get-topic-attributes \
--topic-arn YOUR-TOPIC-ARN-VALUE \
--region YOUR-REGION \
--query "Attributes.KmsMasterKeyId"

Hinweis: Ersetze YOUR-TOPIC-ARN-VALUE durch deinen Themen-ARN und YOUR-REGION durch deine Region. Wenn das SNS-Thema verschlüsselt ist, zeigt die Ausgabe des Befehls den ARN des AWS-KMS-Schlüssels an.

Führe den Befehl get-key-policy aus, um die AWS-KMS-Schlüsselrichtlinie zu überprüfen:

aws kms get-key-policy \
--key-id YOUR-KMS-KEY-ARN \
--policy-name default \
--region YOUR-REGION | jq -r '.Policy' | jq .

Hinweis: Ersetze YOUR-KMS-KEY-ARN durch den ARN deines AWS-KMS-Schlüssels und YOUR-REGION durch deine Region. Zur besseren Lesbarkeit empfiehlt es sich, den Befehl jq zu verwenden, um den Inhalt der Richtlinie in einem JSON-Format anzuzeigen. Weitere Informationen findest du unter./jq auf der jq-Website.

Die folgende Beispielrichtlinie zeigt die mindestens erforderliche AWS-KMS-Schlüsselrichtlinie:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": ["kms:GenerateDataKey*", "kms:Decrypt"],
            "Resource": "YOUR-KMS-KEY-ARN"
        }
    ]
}

Hinweis: Ersetze YOUR-KMS-KEY-ARN durch den ARN deines AWS-KMS-Schlüssels.

Wenn deine Richtlinie nicht über die erforderlichen Berechtigungen verfügt, aktualisiere die AWS-KMS-Schlüsselrichtlinie.

Probleme mit der Amazon-SQS-Benachrichtigungskonfiguration

Der Amazon SQS-ARN existiert nicht oder ist nicht gültig

Wenn dein S3-Bucket die Eigenschaft QueueConfigurations verwendet, erhältst du möglicherweise die Fehlermeldung SQS queue does not exist. Dieser Fehler tritt auf, wenn der ARN von Amazon Simple Queue Service (Amazon SQS) nicht existiert oder nicht gültig ist.

Führe den Befehl list-queues aus, um zu überprüfen, ob die Amazon SQS-Warteschlange im Konto vorhanden ist:

aws sqs list-queues
--queue-name-prefix YOUR-SQS-QUEUE-NAME
--region YOUR-REGION

Hinweis: Ersetze YOUR-SQS-QUEUE-NAME durch den Namen deiner Amazon-SQS-Warteschlange und YOUR-REGION durch deine AWS-Region.

Wenn die SQS-Warteschlange nicht existiert, erstelle entweder eine neue Warteschlange oder aktualisiere die Vorlage mit einer vorhandenen Warteschlange:

Resources:
  SNSTopic:
    Type: AWS::SNS::Topic
  SNSTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Id: MyTopicPolicy
        Version: '2012-10-17'
        Statement:
          - Sid: Statement-id
            Effect: Allow
            Principal:
              Service: s3.amazonaws.com
            Action: "SNS:Publish"
            Resource: !Ref SNSTopic
            Condition:
              ArnLike:
                aws:SourceArn: !Join
                  - ''
                  - - 'arn:aws:s3:::'
                    - !Ref S3Bucket
      Topics:
        - !Ref SNSTopic
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: BucketOwnerFullControl

Die SQS-Warteschlange hat nicht die erforderliche Zugriffsrichtlinie

Du kannst die AWS CLI oder die CloudFormation-Konsole verwenden, um zu überprüfen, ob die SQS-Warteschlange über die erforderliche Zugriffsrichtlinie verfügt.

Gehe wie folgt vor, um die Zugriffsrichtlinie deiner Warteschlange mit der AWS CLI zu überprüfen:

  1. Führe den Befehl get-queue-attributes aus, um die Richtlinie für die SQS-Warteschlange zu überprüfen:
    aws sqs get-queue-attributes \
    --queue-url YOUR-SQS-QUEUE-URL \
    --region YOUR-REGION \
    --attribute-names Policy | jq .
    Hinweis: Ersetze YOUR-SQS-QUEUE-NAME durch den Namen deiner SQS-Warteschlange, YOUR-REGION durch deine Region und YOUR-SQS-QUEUE-URL durch deine Warteschlangen-URL. Zur besseren Lesbarkeit empfiehlt es sich, den Befehl jq zu verwenden, um den Inhalt der Richtlinie in einem JSON-Format anzuzeigen. Weitere Informationen findest du unter./jq auf der jq-Website.
  2. Wenn deine Richtlinie keinen Zugriff auf Amazon S3 hat, erstelle eine neue Zugriffsrichtlinie in einer JSON-Datei:
    {"Policy": "{\"Version\":\"2012-10-17\",\"Statement\":
    [{\"Sid\":\"S3AccessForNotification\",\"Effect\":\"Allow\",\"Principal\":
    {\"Service\":\"s3.amazonaws.com\"},\"Action\":\"SQS:SendMessage\",\"Resource\":\"YOUR-SQS-QUEUE-ARN\"}]}"}
    Hinweis: Ersetze YOUR-SQS-QUEUE-ARN durch den Warteschlangen-ARN.
  3. Führe den Befehl set-queue-attributes aus, um die Richtlinie zu aktualisieren:
    aws sqs set-queue-attributes
    --queue-url YOUR-SQS-QUEUE-URL
    --attributes file://sqs-policy.json
    Hinweis: Ersetze YOUR-SQS-QUEUE-URL durch deine Warteschlangen-URL und sqs-policy.json durch deine Richtlinien-JSON-Datei.

Um die Zugriffsrichtlinie deiner Warteschlange mithilfe der CloudFormation-Konsole zu überprüfen, aktualisiere die CloudFormation-Vorlage so, dass sie die folgende Ressource enthält:

SampleSQSPolicy:
  Type: AWS::SQS::QueuePolicy
  Properties:
    Queues:
      - YOUR-SQS-QUEUE-URL
    PolicyDocument:
      Statement:
        -
          Action:
            - "SQS:SendMessage"
          Effect: "Allow"
          Resource: YOUR-SQS-QUEUE-ARN
          Principal:  
            Service:
              - "s3.amazonaws.com"

Hinweis: Ersetze YOUR-SQS-QUEUE-URL durch deine Warteschlangen-URL und YOUR-SQS-QUEUE-ARN durch deinen Warteschlangen-ARN.

Nachdem du die Richtlinie erstellt oder aktualisiert hast, stelle sicher, dass du jetzt einen neuen Stack erstellen oder den vorhandenen Stack aktualisieren kannst.

Weitere Informationen findest du unter Welche Berechtigungen benötige ich für den Zugriff auf eine Amazon SQS-Warteschlange? Wenn du immer noch Probleme hast, findest du weitere Informationen unter Wie behebe ich den Amazon SQS-Fehler „Invalid value for the parameter policy“?

Problem mit der AWS-KMS-Schlüsselrichtlinie, die der SQS-Warteschlange zugeordnet ist

Gehe wie folgt vor, um Probleme mit der AWS-KMS-Schlüsselrichtlinie zu lösen:

  1. Führe den Befehl list-queues aus, um die URL der SQS-Warteschlange abzurufen:
    aws sqs list-queues
    --queue-name-prefix YOUR-SQS-QUEUE-NAME
    --region YOUR-REGION
    Hinweis: Ersetze YOUR-SQS-QUEUE-NAME durch den Namen deiner Amazon-SQS-Warteschlange und YOUR-REGION durch deine AWS-Region.
  2. Führe den Befehl get-queue-attributes aus, um die AWS-KMS-Schlüssel-ID abzurufen:
    aws sqs get-queue-attributes \
    --queue-url YOUR-SQS-QUEUE-URL \
    --region YOUR-REGION \
    --attribute-names KmsMasterKeyId
    Hinweis: Ersetze YOUR-SQS-QUEUE-URL durch deine Warteschlangen-URL und YOUR-REGION durch deine AWS-Region.
  3. Führe den Befehl describe-key aus, um den AWSK-KMS-Schlüssel-ARN abzurufen:
    aws kms describe-key --key-id YOUR-KMS-KEY-ID
    Hinweis: Ersetze YOUR-KMS-KEY-ID durch die Schlüssel-ID.
  4. Führe den Befehl get-key-policy aus, um die vollständige Schlüsselrichtlinie anzuzeigen:
    aws kms get-key-policy \
    --key-id YOUR-KMS-KEY-ARN \
    --policy-name default \
    --region YOUR-REGION
    Hinweis: Ersetze YOUR-KMS-KEY-ARN durch den ARN deines AWS-KMS-Schlüssels und YOUR-REGION durch deine Region.
  5. Stelle in der Ausgabe sicher, dass die Richtlinie Amazon S3 die Verwendung des AWS-KMS-Schlüssels ermöglicht. Beispiele für Berechtigungen:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "s3.amazonaws.com"
                },
                "Action": ["kms:GenerateDataKey*", "kms:Decrypt"],
                "Resource": "YOUR-KMS-KEY-ARN"
            }
        ]
    }
    Hinweis: Ersetze YOUR-KMS-KEY-ARN durch den ARN des AWS-KMS-Schlüssels.

Wenn deine Richtlinie nicht über die erforderlichen Berechtigungen verfügt, aktualisiere die Schlüsselrichtlinie.

Zyklische Abhängigkeit zwischen Ressourcen

Wichtig: Bevor du ein SNS-Thema für S3-Ereignisbenachrichtigungen abonnierst, musst du die AWS::SNS::TopicPolicy mit den erforderlichen Berechtigungen erstellen. Die Themen-Richtlinie muss vorhanden sein, bevor du das Abonnement erstellst.

Um zuerst die Themen-Richtlinie zu erstellen, musst du ein DependsOn-Attribut für die Ressource AWS::S3::Bucket verwenden. Dieses Attribut erstellt die Themen-Richtlinie vor dem Bucket. Du kannst auch zwei Stack-Operationen verwenden, um zuerst alle Ressourcen zu erstellen und dann die S3Bucket-Ressource so zu aktualisieren, dass sie die Eigenschaft NotificationConfiguration enthält. Ergreife eine der folgenden Maßnahmen.

Angabe eines Werts für BucketName in deiner CloudFormation-Vorlage

Verwende einen statischen Namen für deinen S3-Bucket in der Eigenschaft BucketName in der Ressource S3Bucket deiner CloudFormation-Vorlage. Ein statischer S3-Bucket-Name entfernt die intrinsische Abhängigkeit zwischen der SNS-Themenrichtlinie und Amazon S3.

Wichtig: S3-Bucket-Namen müssen global eindeutig sein.

Das folgende Beispiel einer CloudFormation-Vorlage gibt einen hartcodierten -Bucket-Name--Wert für die Eigenschaft BucketName an:

Resources:
  SNSTopic:
    Type: AWS::SNS::Topic
  SNSTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Id: MyTopicPolicy
        Version: '2012-10-17'
        Statement:
          - Sid: Statement-id
            Effect: Allow
            Principal:
              Service: s3.amazonaws.com
            Action: "SNS:Publish"
            Resource: !Ref SNSTopic
            Condition:
              ArnLike:
                aws:SourceArn: !Join
                  - ''
                  - - 'arn:aws:s3:::'
                    - '-Bucket-Name-'
      Topics:
        - !Ref SNSTopic
  S3Bucket:
    Type: AWS::S3::Bucket
    DependsOn:
      - SNSTopicPolicy
    Properties:
      AccessControl: BucketOwnerFullControl
      BucketName: "-Bucket-Name-"
      NotificationConfiguration:
        TopicConfigurations:
          - Topic: !Ref SNSTopic
            Event: s3:ObjectCreated:Put

Hinweis: Ersetze -Bucket-Name- durch deinen Bucket-Namen. Die Ressource S3Bucket hat einen expliziten DependsOn-Wert, der auf SNSTopicPolicy gesetzt ist. Dieses Attribut gibt an, dass die Vorlage die Ressource SNSTopicPolicy vor der Ressource S3Bucket erstellt.

Verwende einen Parameter für BucketName

Mit Parametern kannst du dieselbe CloudFormation-Vorlage für S3-Buckets mit unterschiedlichen Namen verwenden. Während der Stack-Erstellung kannst du einen Wert für den Parameter paramBucketName festlegen. Beispiel für eine Richtlinie:

Parameters:
  paramBucketName:
    Type: String
    Description: Bucket Name
Resources:
  SNSTopic:
    Type: AWS::SNS::Topic
  SNSTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Id: MyTopicPolicy
        Version: '2012-10-17'
        Statement:
          - Sid: Statement-id
            Effect: Allow
            Principal:
              Service: s3.amazonaws.com
            Action: "SNS:Publish"
            Resource: !Ref SNSTopic
            Condition:
              ArnLike:
                aws:SourceArn: !Join
                  - ''
                  - - 'arn:aws:s3:::'
                    - !Ref paramBucketName
      Topics:
        - !Ref SNSTopic
  S3Bucket:
    Type: AWS::S3::Bucket
    DependsOn:
      - SNSTopicPolicy
    Properties:
      AccessControl: BucketOwnerFullControl
      BucketName: !Ref paramBucketName
      NotificationConfiguration:
        TopicConfigurations:
          - Topic: !Ref SNSTopic
            Event: s3:ObjectCreated:Put

**Hinweis:**Im vorherigen Beispiel hat die Ressource S3Bucket ein explizites DependsOn-Attribut, das auf SNSTopicPolicy gesetzt ist.

Stack erstellen und den Stack dann aktualisieren

Hinweis: Bei dieser Methode enthält die Ressource S3Bucket nicht die Eigenschaft BucketName. Daher erstellt CloudFormation einen eindeutigen Bucket-Namen für dich. Verwende kein DependsOn-Attribut, um die zyklische Abhängigkeit zu vermeiden.

Erstelle zunächst den Stack ohne die Eigenschaft NotificationConfiguration in der Ressource S3Bucket. Beispiel:

Resources:
  SNSTopic:
    Type: AWS::SNS::Topic
  SNSTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Id: MyTopicPolicy
        Version: '2012-10-17'
        Statement:
          - Sid: Statement-id
            Effect: Allow
            Principal:
              Service: s3.amazonaws.com
            Action: "SNS:Publish"
            Resource: !Ref SNSTopic
            Condition:
              ArnLike:
                aws:SourceArn: !Join
                  - ''
                  - - 'arn:aws:s3:::'
                    - !Ref S3Bucket
      Topics:
        - !Ref SNSTopic
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: BucketOwnerFullControl

Füge die Eigenschaft NotificationConfiguration in der Ressource S3Bucket hinzu und aktualisiere dann den Stack. Beispiel:

Resources:
  SNSTopic:
    Type: AWS::SNS::Topic
  SNSTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Id: MyTopicPolicy
        Version: '2012-10-17'
        Statement:
          - Sid: Statement-id
            Effect: Allow
            Principal:
              Service: s3.amazonaws.com
            Action: "SNS:Publish"
            Resource: !Ref SNSTopic
            Condition:
              ArnLike:
                aws:SourceArn: !Join
                  - ''
                  - - 'arn:aws:s3:::'
                    - !Ref S3Bucket
      Topics:
        - !Ref SNSTopic
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: BucketOwnerFullControl
      NotificationConfiguration:
        TopicConfigurations:
          - Topic: !Ref SNSTopic
            Event: s3:ObjectCreated:Put

Ähnliche Informationen

Erteilen von Berechtigungen zum Veröffentlichen von Ereignisbenachrichtigungen an ein Ziel

Wie vermeide ich den Fehler „Unable to validate the following destination configurations“ bei Lambda-Ereignisbenachrichtigungen in CloudFormation?

Verwaltung von AWS-Ressourcen als eine einzelne Einheit mit AWS CloudFormation-Stacks

Einrichten von Amazon SNS-Benachrichtigungen

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 3 Monaten