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

Lesedauer: 5 Minute
0

Ich habe Ereignisbenachrichtigungen von Amazon Simple Storage Service (Amazon S3) für ein Amazon Simple Notification Service (Amazon SNS)-Thema oder eine AWS Lambda-Funktion eingerichtet. Ich erhalte folgende Fehlermeldung: „Unable to validate the following destination configurations.“ Wenn ich versuche, aus dem S3-Bucket in meiner Vorlage eine Abhängigkeit von der SNS-Themen-Richtlinie festzulegen, erhalte ich einen Fehler bei der Überprüfung auf zirkuläre Abhängigkeiten.

Kurzbeschreibung

Aufgrund der Art und Weise, wie AWS CloudFormation die Reihenfolge von Abhängigkeiten handhabt, werden Amazon-S3-Ereignisbenachrichtigungen als Attribut des S3-Buckets definiert. Diese Benachrichtigungen werden eingerichtet, wenn die S3-Bucket-Ressource erstellt wird.

Um Fehler zu vermeiden, müssen Sie Ressourcen in der folgenden Reihenfolge erstellen:

  1. Erstellen Sie das SNS-Thema, da der S3-Bucket auf das SNS-Thema zugreift.
  2. Erstellen Sie den S3-Bucket, da die SNS-Themen-Richtlinie sowohl auf den S3-Bucket als auch auf das SNS-Thema zugreift.

Bevor Sie S3-Ereignisbenachrichtigungen für ein SNS-Thema einrichten können, müssen Sie eine Themen-Richtlinie (AWS::SNS::TopicPolicy) mit den entsprechenden Berechtigungen angeben. Diese Themen-Richtlinie muss vorhanden sein, bevor Sie die Benachrichtigungen einrichten.

Versuchen Sie es mit einer der folgenden Strategien, um den Fehler „Unable to validate the following destination configurations“ zu vermeiden:

  • Angeben eines Werts für BucketName in Ihrer AWS-CloudFormation-Vorlage
  • Erstellen eines Stacks und Durchführung eines Stack-Updates

Lösung

Angeben eines Werts für BucketName in Ihrer AWS-CloudFormation-Vorlage

Verwenden Sie einen statischen Namen für Ihren S3-Bucket, indem Sie in der Ressource S3Bucket Ihrer AWS-CloudFormation-Vorlage einen Wert für die Eigenschaft BucketName angeben. Dadurch entfällt die Notwendigkeit, {"Ref": "paramBucketName"} in die SNS-Themen-Richtlinie aufzunehmen. Dadurch wird die intrinsische Abhängigkeit zwischen der SNS-Themen-Richtlinie und Amazon S3 aufgehoben.

Folgendes Beispiel einer AWS-CloudFormation-Vorlage gibt einen fest codierten Wert (-Bucket-Name-) für die Eigenschaft BucketName an. Ersetzen Sie in Ihrer Vorlage jedes Vorkommen von -Bucket-Name- durch Ihren Bucket-Namen.

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

Um dieselbe AWS-CloudFormation-Vorlage für S3-Buckets mit unterschiedlichen Namen zu verwenden, definieren Sie einen Parameter für den Bucket-Namen. Mit dem Parameter können Sie dieselbe Vorlage für verschiedene Bucket-Namen verwenden, indem Sie den Bucket-Namen bei der Stack-Erstellung als Parameter weitergeben.

Um die folgende Beispielvorlage zu verwenden, müssen Sie den Bucket-Namen bei der Stack-Erstellung als Parameter paramBucketName weitergeben.

{
  "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": {
                    "Fn::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"
            }
          ]
        }
      }
    }
  }
}

Erstellen eines Stacks und Durchführung eines Stack-Updates

Teilen Sie die Stack-Erstellung in zwei Stufen auf. Erstellen Sie zunächst den Stack, geben Sie jedoch nicht die Eigenschaft NotificationConfiguration in der Ressource S3Bucket an. Führen Sie dann ein Stack-Update durch, um die S3-Ereignisbenachrichtigung hinzuzufügen. Dadurch wird vermieden, dass die S3-Ereignisbenachrichtigung vor Erstellung der SNS-Themen-Richtlinie eingerichtet wird.

1.    Erstellen Sie alle Ressourcen, einschließlich der SNS-Themen-Richtlinie. Zum 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": {
                    "Fn::Join": [
                      "",
                      [
                        "arn:aws:s3:::",
                        {
                          "Ref": "S3Bucket"
                        }
                      ]
                    ]
                  }
                }
              }
            }
          ]
        },
        "Topics": [
          {
            "Ref": "SNSTopic"
          }
        ]
      }
    },
    "S3Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "AccessControl": "BucketOwnerFullControl"
      }
    }
  }
}

2.    Aktualisieren Sie den Stack, um die S3-Ereignisbenachrichtigung hinzuzufügen. Zum 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": {
                    "Fn::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"
            }
          ]
        }
      }
    }
  }
}

Hinweis: Sie können AWS CloudFormation Template Flip verwenden, um Ihre AWS-CloudFormation-Vorlagen zwischen den Formaten JSON und YAML zu konvertieren.


Ähnliche Informationen

How do I avoid the "Unable to validate the following destination configurations" error with Lambda event notifications in AWS CloudFormation?

AWS CloudFormation-Stack-Updates

Setting up Amazon SNS notifications

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren