我使用cloudformation模板创建一个sqs队列并根据用户参数应用两个策略。我创建了 2 个 sqs QueuePolicy 资源,它们引用了队列。但是,当我尝试使用 Cloudformation 模板将两个策略应用到队列时,只有第二个策略生效。 cloudformation 堆栈表示已创建两个 sqs 策略资源。然而 sqs 的管理控制台仅显示第二个。 SQS 的aws 文档 表示可以将多个策略应用于单个队列;然而,cloudformation QueuePolicy 没有明确提及是否允许这样做。我尝试交换策略,第二个策略始终生效。我的政策片段已附上。
"QueuePolicy1": {
"Type": "AWS::SQS::QueuePolicy",
"Properties": {
"PolicyDocument": {
"Id": "QueuePolicy1",
"Statement": [
{
"Sid": "QueuePolicy1-ReceiveMesasges",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"sqs:GetQueueAttributes",
"sqs:GetQueueUrl",
"sqs:ReceiveMessage",
"sqs:DeleteMessage",
"sqs:ChangeMessageVisibility"
],
"Resource": "*",
"Condition": {
"ArnEquals": {
"aws:SourceArn": {
"Ref": "QOwnerArnParam"
}
}
}
}
]
},
"Queues": [
{
"Ref": "Queue1"
}
]
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "124145a7-3ad1-48e4-9478-04a930498db5"
}
},
"Condition": "Condition1"
},
"QueuePolicy2": {
"Type": "AWS::SQS::QueuePolicy",
"Properties": {
"PolicyDocument": {
"Id": "QueuePolicy2",
"Statement": [
{
"Sid": "QueuePolicy2-SendMessage-To-Queue-From-SNS-Topic",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"sqs:SendMessage"
],
"Resource": "*",
"Condition": {
"ArnEquals": {
"aws:SourceArn": {
"Ref": "TopicArnParam"
}
}
}
}
]
},
"Queues": [
{
"Ref": "Queue1"
}
]
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "124145a7-3ad1-48e4-9478-04a930498db5"
}
},
"Condition": "Condition2"
},
这里并不是真正的问题,但我要补充一点,您可以将多个语句添加到单个策略中。我认为队列只有一个包含多个语句的策略。
根据我迄今为止的经验,我发现 AWS 文档非常精确(有时几乎太精确),我认为这就是其中之一。
QueuePolicy 的AWS CF 文档说
The AWS::SQS::QueuePolicy type applies a policy to SQS queues.
我知道,当您第一次阅读本文时,它可能看起来像您标准的不言自明的、不知道还要写什么的文档注释,但我认为这实际上是为了暗示/解释该政策只是设置 - 即它不是添加到政策列表中。
我知道这对于您想要实现的目标可能并不理想,但我认为您暂时的解决方案是合并这两个策略。
我在 sqs::queuepolicy 上做了很多工作,我可以分享一下,一个 sqs 队列一次只能附加一个策略,但一个队列策略可以附加到多个队列。
一旦您尝试将新的队列策略附加到队列,旧的队列策略将被覆盖。如果您的 cloudformation 模板包含多个策略,因为 CFN 进程是异步的,那么最后执行的策略将覆盖之前的策略。