部署API Gateway服务时遇S3 Bucket已存在于CloudFormation栈错误
问题原因及解决办法
错误根源
- 重复创建S3桶:你在
functions的s3事件源里指定了桶名,Serverless框架会自动帮你创建这个桶;但同时你又在resources里手动定义了同名的MyBucket资源,CloudFormation尝试创建两个完全同名的桶,直接触发冲突报错。 - 桶保留策略导致删栈后桶未删除:配置里的
DeletionPolicy: Retain和UpdateReplacePolicy: Retain会让你删除CloudFormation栈时,S3桶依然保留在AWS账号里。所以哪怕你删了栈重新部署,只要用同一个桶名,就会提示“已存在”。
解决办法(二选一)
方案1:移除手动桶定义,用Serverless自动创建的桶
直接删掉resources里的MyBucket全部内容,因为s3事件源会自动创建桶并配置好触发权限,足够满足基础需求。修改后的配置如下:
provider: name: aws runtime: nodejs14.x stage: dev region: us-east-1 package: excludeDevDependencies: true individually: true custom: fileUploadBucketName: ${self:service}-bucket-${self:provider.stage} functions: uploadImage: handler: src/handlers/s3Handler.handler events: - s3: bucket: ${self:custom.fileUploadBucketName} event: s3:ObjectCreated:*
方案2:保留手动桶定义,关联已有桶到事件源
如果必须手动管理桶的配置(比如要加版本控制、CORS等额外属性),需要修改s3事件源的配置,告诉Serverless这个桶已经存在,不要自动创建。同时清理无效的DependsOn配置:
provider: name: aws runtime: nodejs14.x stage: dev region: us-east-1 package: excludeDevDependencies: true individually: true custom: fileUploadBucketName: ${self:service}-bucket-${self:provider.stage} functions: uploadImage: handler: src/handlers/s3Handler.handler events: - s3: bucket: ${self:custom.fileUploadBucketName} event: s3:ObjectCreated:* existing: true # 关键:告诉Serverless桶已存在,不要自动创建 resources: Resources: MyBucket: Type: AWS::S3::Bucket Properties: BucketName: ${self:custom.fileUploadBucketName} # 如果你不需要删栈后保留桶,可以删掉下面两行;如果需要保留,就保留 DeletionPolicy: Retain UpdateReplacePolicy: Retain
额外注意
如果之前删栈后桶还留在AWS里,现在要重新用同名桶的话,要么去AWS控制台手动删除这个残留的桶,要么换一个新的桶名(比如在custom的桶名里加个随机后缀或者版本号)。
内容的提问来源于stack exchange,提问作者Баатыр Алиев
相关产品推荐
相关产品推荐

