Lors de l'abonnement d'une rubrique AWS SNS ou d'une fonction AWS Lambda à des notifications d'événement Amazon S3, je reçois le message d'erreur « Unable to validate the following destination configurations. » J'ai essayé de définir une dépendance sur la stratégie de rubrique SNS à partir du compartiment S3 dans mon modèle, mais cela a provoqué une erreur de validation de dépendance circulaire.

Avant d'abonner une rubrique SNS aux notifications d'événement S3, vous devez spécifier une stratégie de rubrique AWS::SNS::TopicPolicy avec les autorisations appropriées et celle-ci doit exister avant l'abonnement ; dans le cas contraire, l'abonnement échouera.

Avec les modèles AWS CloudFormation, les notifications d'événement S3 sont définies en tant qu'attribut du compartiment S3 et elles sont établies lors de la création de la ressource de compartiment S3. Il existe quelques limitations connues, en raison de la façon dont CloudFormation gère l'ordre des dépendances.

Prenez l'exemple de code suivant :

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

                    "AWS" : "*"

                },

                "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": "PublicReadWrite",

        "NotificationConfiguration": {

            "TopicConfigurations": [

                {

                    "Topic": { "Ref" : "SNSTopic" },

                    "Event": "s3:Create"

                }

            ]

        }

    }

}

Notez que dans l'ordre des dépendances :

  • Le compartiment S3 référence la rubrique SNS et, par conséquent, cette dernière doit être créée avant le compartiment S3.
  • La stratégie de rubrique SNS référence à la fois le compartiment S3 et la rubrique SNS et elle doit donc être créée la dernière.

La notification d'événement de compartiment S3 est créée avant que la stratégie de rubrique SNS soit en place et, pour cette raison, elle échoue.

Nommez statiquement votre compartiment S3 en spécifiant une valeur pour le paramètre BucketName dans la ressource de compartiment S3 du modèle CloudFormation. L'affectation d'un nom de manière statique au compartiment élimine la nécessité d'inclure { "Ref": "S3bucket" } dans la stratégie de rubrique SNS et supprime la dépendance intrinsèque entre la stratégie de rubrique SNS et S3. Pour promouvoir la réutilisation du modèle, le nom du compartiment S3 peut être paramétré et transmis lors de la création de la pile.

Une autre option consiste à effectuer la création de la pile en deux étapes, à savoir la création de la pile, puis sa mise à jour. Au cours de la première étape, vous pouvez créer toutes les ressources, y compris la stratégie de rubrique SNS, mais vous ne spécifiez pas l'attribut NotificationConfiguration dans la ressource de compartiment S3. Dans la seconde étape, vous pouvez ensuite mettre à jour la pile de manière à ajouter la notification d'événement S3. De cette façon, la notification d'événement S3 n'est pas définie avant la création de la stratégie de rubrique SNS. Pour plus d'informations, consultez la section Utilisation des piles dans le Guide de l'utilisateur AWS CloudFormation.

CloudFormation, S3, Simple Storage Service, événement, notification, dépendance circulaire, SNS, Simple Notification Service, AWS Lambda


Cette page vous a-t-elle été utile ? Oui | Non

Retour au Centre de connaissances AWS Support

Vous avez besoin d'aide ? Consultez le site du Centre AWS Support

Date de publication : 15/09/2016