Wie behebe ich den Fehler „Unable to validate the following destination configurations“ in AWS CloudFormation?
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:
- Erstellen Sie das SNS-Thema, da der S3-Bucket auf das SNS-Thema zugreift.
- 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
Ähnliche Videos
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 3 Jahren
- AWS OFFICIALAktualisiert vor 3 Monaten