适用于 S3 事件的 Cloudformation SQS 策略

Posted

技术标签:

【中文标题】适用于 S3 事件的 Cloudformation SQS 策略【英文标题】:Cloudformation SQS Policy for S3 events 【发布时间】:2016-12-31 12:32:01 【问题描述】:

我正在尝试为 SQS 队列创建一个策略,该策略将允许任何 S3 存储桶将事件发送到队列。我似乎无法为特定的 S3 队列执行此操作,因为我最终会遇到循环依赖。

我创建了一个将创建队列和策略的 cloudformation 模板,但是当我尝试手动设置 S3 存储桶以发送事件时,我收到一条消息说

目标队列的权限不允许 S3 发布 来自此存储桶的通知

我用来创建策略的模板部分是:

    "SQSNotifcationFromS3" : 
        "Type" :        "AWS::SQS::QueuePolicy",
        "DependsOn" : "S3Notifications",
        "Properties" : 
            "PolicyDocument" : 
                "Version": "2012-10-17",
                "Id": "SQSIDsimon",
                "Statement": [
                    
                        "Sid": "example-statement-ID",
                        "Effect": "Allow",
                        "Principal": 
                            "Service": "s3.amazonaws.com"
                            ,
                        "Action": "SQS:*",
                        "Resource":  "Ref" : "S3Notifications"
                    
                ]                  
            ,
            "Queues" :      [  "Ref" : "S3Queue"  ]
        
    

【问题讨论】:

【参考方案1】:

最后,我找到了解决方案——我在 SQS 上设置了权限,以便任何 S3 存储桶都可以将事件添加到队列中:

    "S3EventQueuePolicy" : 
        "Type" : "AWS::SQS::QueuePolicy",
        "DependsOn" : [ "S3EventQueue" ],
        "Properties" : 
            "PolicyDocument" : 
                "Id": "SQSPolicy",
                "Statement": [
                    
                        "Sid": "SQSEventPolicy",
                        "Effect": "Allow",
                        "Principal": "*",
                        "Action": "SQS:*",
                        "Resource": "*",
                        "Condition": 
                            "ArnLike": 
                                "aws:SourceArn": "arn:aws:s3:::*"
                            
                        
                    
                ]
            ,
            "Queues" : [  "Ref" : "S3EventQueue" ]
                    
    ,

【讨论】:

DependsOn 在这里是多余的,RefS3EventQueue 已经建立了依赖关系。您可能希望将其范围缩小到特定的存储桶 ARN - 您可能不希望只是 any 存储桶写入您的队列:P 其实这里有一个更好的例子:docs.aws.amazon.com/AmazonS3/latest/dev/…【参考方案2】:

在 AWS 控制台中,您是否确认队列已成功授予 s3 存储桶的权限?在 SQS 中,选择队列并查看权限选项卡。

查看您上面的模板 sn-p,我不确定“S3Notifications”指向什么,但我假设它是 S3 存储桶。 SQS 策略文档“资源”应该是 S3 存储桶的 ARN。 S3 存储桶上的“Ref”函数具有“Name”的参考值。我相信你需要 ARN。

见:http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/SQSExamples.html

和:http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html

【讨论】:

以上是关于适用于 S3 事件的 Cloudformation SQS 策略的主要内容,如果未能解决你的问题,请参考以下文章

无法在 cloudformation 中创建带有事件的 s3 存储桶,以连接到它

使用 cloudformation 为 S3 存储桶启用 Lambda 函数

无服务器框架 1.0:将 Cloudformation 转换为适用于 AWS Firehose 的 Yaml

S3 创建 CloudFormation 导致 400 错误请求

CloudFormation 模板设置 S3 存储桶默认加密 [重复]

使用 CloudFormation 在 S3 存储桶中创建 Lambda 通知