AWS SNS トピックまたは AWS Lambda 関数を Amazon S3 イベント通知にサブスクライブすると、エラーメッセージ "Unable to validate the following destination configurations (以下の宛先構成を確認することができません)" を受け取ります。テンプレート内の S3 バケットから SNS トピックポリシーへの依存関係の設定を試みましたが、結果は循環依存関係検証エラーでした。

SNS トピックを S3 イベント通知にサブスクライブする前に、トピックのポリシー AWS::SNS::TopicPolicy に適切なアクセス許可を指定しておく必要があります。これがサブスクライブしたときに存在していなかった場合、サブスクライブは失敗します。

AWS CloudFormation テンプレートの場合、S3 イベント通知はS3 バケットの属性として定義され、S3 バケットのリソースが作成されたときに確立されます。CloudFormation が依存関係の順序の処理方法が理由で、既知の制限がいくつかあります。

次のサンプルコードについて考えます。

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

                }

            ]

        }

    }

}

依存関係の順序において、次の点に注目します。

  • S3 バケットは SNS トピックを参照している。したがって、SNS トピックは S3 バケットよりも前に作成する必要がある。
  • SNS トピックのポリシーは、S3 バケットと SNS トピックの両方を参照している。したがって、最後に作成する必要がある。

S3 バケットイベント通知は、SNS トピックポリシーを設定する前に作成されているので、失敗する。

CloudFormation テンプレートの S3 バケットリソース内の BucketName パラメーターに値を指定することによって、S3 バケットに静的に名前を付けます。静的に名前を付けることで、SNS トピックポリシーに { "Ref": "S3bucket" } を含める必要がなくなり、SNS トピックと S3 の間に本来備わっていた依存関係を取り除くことができます。テンプレートの再利用を促進するために、S3 バケット名はパラメーター化しておいて、スタックの作成時に渡すことができます。

別のオプションは、スタック作成を 2 つのステージに分割することです。最初に、スタック作成を行い、その後、スタックの更新を行います。最初のステージでは、SNS トピックポリシーなど、すべてのリソースを作成することができますが、S3 バケットリソースの NotificationConfiguration 属性だけは指定しないでください。2 番目のステージでは、S3 イベント通知を追加するためにスタックを更新することができます。これにより、SNS トピックポリシーを作成する前に、S3 イベント通知が設定されるのを回避することができます。詳細については、『AWS CloudFormation ユーザーガイド』の「スタックの使用法」を参照してください。

CloudFormation、S3、Simple Storage Service、イベント、通知、循環依存関係、SNS、Simple Notification Service、AWS Lambda


このページは役に立ちましたか? はい | いいえ

AWS サポートナレッジセンターに戻る

サポートが必要ですか?AWS サポートセンターをご覧ください。

公開日: 2016 年 9 月 15 日