适用于 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 在这里是多余的,Ref
到 S3EventQueue
已经建立了依赖关系。您可能希望将其范围缩小到特定的存储桶 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 错误请求