AWS Serverless Framework部署栈时Custom::S3卡住并回滚问题求助
问题分析与解决方案
问题核心
使用Serverless Framework部署栈时,添加外部CDK创建的S3桶事件触发器后,两个Custom::S3资源卡在CREATE_IN_PROGRESS状态,最终超时回滚,CloudFormation提示CloudFormation did not receive a response from your Custom Resource。移除S3事件触发器配置后部署正常。
解决方案
1. 给Serverless部署角色添加S3桶通知权限
Serverless Framework会通过内部自定义资源Lambda配置S3事件触发器,该Lambda需要权限操作外部S3桶的通知设置。在serverless.yml的provider部分添加以下IAM权限声明:
provider: name: aws # 保留原有其他配置 iamRoleStatements: - Effect: Allow Action: - s3:PutBucketNotification - s3:GetBucketNotification Resource: arn:aws:s3:::myapp-${sls:stage}-data
2. 检查外部S3桶的桶策略
确认CDK创建的S3桶策略允许Serverless自定义资源Lambda的角色执行通知配置操作。若桶有严格权限控制,添加以下桶策略条目(替换为实际的角色ARN):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::YOUR_ACCOUNT_ID:role/serverless-YOUR_SERVICE-YOUR_STAGE-custom-resource" }, "Action": [ "s3:PutBucketNotification", "s3:GetBucketNotification" ], "Resource": "arn:aws:s3:::myapp-${sls:stage}-data" } ] }
3. 查看自定义资源Lambda的CloudWatch日志
Serverless创建的自定义资源Lambda(命名格式通常为serverless-${service}-${stage}-custom-resource)的日志会记录具体执行错误,操作步骤:
- 打开CloudWatch控制台,进入日志组
/aws/lambda/serverless-YOUR_SERVICE-YOUR_STAGE-custom-resource - 查看最新日志事件,定位权限拒绝、桶不存在等具体问题
4. 调整S3事件触发器配置
尝试移除forceDeploy: true参数,该配置会强制更新触发器,可能与外部桶的现有配置冲突:
events: - s3: bucket: myapp-${sls:stage}-data event: s3:ObjectCreated:* existing: true rules: - prefix: xxx/ - suffix: .csv
5. 验证S3桶的存在与可访问性
确认myapp-${sls:stage}-data桶存在于eu-west-3区域,且部署角色可正常访问:
aws s3 ls s3://myapp-tst-data --region eu-west-3
内容的提问来源于stack exchange,提问作者JeanPierre
相关产品推荐
相关产品推荐

