使用Serverless为现有S3存储桶添加生命周期策略报错存储桶已存在
问题解决说明
报错根因
你在serverless.yml中声明了AWS::S3::Bucket类型的资源,等同于要求CloudFormation新建一个名为my_bucket的S3桶,而该桶已经在你的AWS账号中存在,触发资源创建冲突,因此堆栈更新失败回滚。
解决方案
根据你的使用场景选择以下任意一种方案即可:
方案一:将已有桶纳入当前堆栈管理
如果你需要通过Serverless配置统一管理该桶的所有规则,操作如下:
- 修改你的S3资源配置,添加
DeletionPolicy: Retain,避免后续堆栈操作误删已有桶:
custom: additionalStacks: ressources: Resources: MyS3TBucket: Type: AWS::S3::Bucket DeletionPolicy: Retain Properties: BucketName: my_bucket LifecycleConfiguration: Rules: - Status: Enabled ExpirationInDays: 30
- 登录AWS CloudFormation控制台,找到当前Serverless服务对应的堆栈,选择导入现有资源,按照页面引导选择已存在的
my_bucket桶完成导入。 - 导入完成后重新执行
serverless deploy即可正常更新生命周期规则。
方案二:不修改堆栈,直接配置规则
如果你不需要把桶纳入当前Serverless堆栈的管理范围,直接删掉yml中声明S3桶资源的整段配置,选择以下任意一种方式添加规则即可:
- 登录AWS S3控制台,找到
my_bucket桶,在生命周期配置页面手动添加规则:规则状态设为启用,对象过期时间设为30天,覆盖所有对象前缀即可。 - 通过AWS CLI执行命令配置:
aws s3api put-bucket-lifecycle-configuration --bucket my_bucket --lifecycle-configuration '{"Rules": [{"Status": "Enabled", "Expiration": {"Days": 30}, "Filter": {"Prefix": ""}}]}'
补充说明
你配置的生命周期规则会对桶内所有对象生效,包括你所说的文件夹(S3本质是对象存储,文件夹实际是特定前缀的标记对象),完全匹配你要自动删除所有文件夹的需求。
内容的提问来源于stack exchange,提问作者geek
相关产品推荐
相关产品推荐

