如何修复S3存储桶与SQS队列循环依赖导致的部署报错
核心问题是你仅解决了循环依赖问题,没有配置SQS队列的权限允许S3存储桶发送消息,这是触发该报错的另一常见原因,按以下步骤调整即可:
1. 确认S3侧ARN拼接配置正确
你当前cfn.s3.yml中使用!Sub拼接SQS队列ARN的配置是正确的,避免了!GetAtt触发的隐式依赖,该部分无需修改:
Queue: !Sub arn:aws:sqs:${self:provider.region}:${AWS::AccountId}:${self:custom.config.sqsQueueName}
2. 新增SQS队列访问策略
修改cfn.sqs.yml,新增队列策略允许S3服务向指定队列发送消息,注意策略中S3桶ARN同样使用拼接方式避免循环依赖:
Resources: SQSQueue: Type: AWS::SQS::Queue Properties: QueueName: ${self:custom.config.sqsQueueName} # 新增以下队列策略配置 SQSQueuePolicy: Type: AWS::SQS::QueuePolicy Properties: Queues: - !Ref SQSQueue PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: "s3.amazonaws.com" Action: "sqs:SendMessage" Resource: !GetAtt SQSQueue.Arn Condition: ArnLike: aws:SourceArn: !Sub "arn:aws:s3:::${self:custom.config.policyBucketName}"
3. 可选:调整资源创建时序
如果仍报错,可在PolicyS3Bucket的配置中添加DependsOn指定等待队列策略创建完成后再创建S3桶的通知配置,避免校验时序问题:
PolicyS3Bucket: Type: AWS::S3::Bucket DependsOn: SQSQueuePolicy # 其余原有配置保持不变
额外校验项
- 确认
custom.config中定义的policyBucketName、sqsQueueName拼写完全正确,拼接出的ARN与实际资源匹配 - 若存在之前部署失败的残留栈资源,先清理残留资源再重新部署
内容的提问来源于stack exchange,提问作者Shane Bishop
相关产品推荐
相关产品推荐

