更新CloudFormation栈时SQS队列策略被异常清除问题问询
CloudFormation更新SQS队列策略时的异常行为分析
问题场景
- 初始栈配置:两个SQS队列(
FirstQueue、SecondQueue),搭配一个共用队列策略FirstPolicy——该策略同时绑定两个队列,拒绝所有主体的SQS:SendMessage操作。 - 更新操作:修改模板后,
FirstPolicy仅绑定FirstQueue,新增SecondPolicy绑定SecondQueue,拒绝所有主体的SQS:ReceiveMessage操作。 - 实际结果:
SecondQueue的策略为空,CloudTrail显示CloudFormation对SecondQueue发起两次SetQueueAttributes请求:一次设置新策略,一次清空策略。
原因分析
这不是操作失误,属于CloudFormation处理SQS队列策略关联变更时的预期行为,核心逻辑如下:
- SQS队列的策略是通过
QueueAttributes中的Policy字段管理的,该字段是单一JSON文档,不支持增量更新,只能整体替换。 - 初始状态下,
FirstPolicy作为唯一关联两个队列的策略资源,CloudFormation会将其内容同步到两个队列的Policy属性中。 - 更新栈时,CloudFormation的处理时序为:
- 先创建新的
SecondPolicy,并将其内容设置到SecondQueue的Policy属性(对应第一次SetQueueAttributes)。 - 随后处理
FirstPolicy的变更:由于该策略不再关联SecondQueue,CloudFormation会执行SetQueueAttributes操作,移除FirstPolicy与SecondQueue的绑定关联。但由于SQS策略是整体替换属性,此时CloudFormation会将SecondQueue的策略清空(因为旧策略不再关联它,而新策略的关联关系尚未被CloudFormation完全确认同步)。
- 先创建新的
解决方案
要避免这种问题,可以采用以下两种方式:
- 一次性替换策略:直接删除旧的共用
FirstPolicy,同时创建两个独立的FirstPolicy和SecondPolicy分别绑定对应队列。CloudFormation会优先创建新策略,再删除旧策略,避免时序冲突。 - 分两次更新栈:第一次更新仅添加
SecondPolicy并绑定SecondQueue,确认策略生效后,第二次更新再修改FirstPolicy的关联队列列表,移除SecondQueue。
内容的提问来源于stack exchange,提问作者Philippe Aubertin
相关产品推荐
相关产品推荐

