通过CloudFormation更新S3桶加通知配置报桶已存在如何解决
问题根因
你遇到的报错本质是2021年的栈修改操作导致原桶和栈解绑:S3桶的BucketName属于不可变属性,修改该属性会触发CloudFormation执行资源替换操作,加上你设置了DeletionPolicy: Retain,原桶my-prod-s3bucket没有被删除,只是不再被CloudFormation栈管理,当前栈的S3ENILambdaUploadBucket逻辑ID实际关联的是后来创建的my-prod-yamlbucket。现在你改回原桶名后,CloudFormation尝试替换资源时发现原桶已存在,就会抛出对应错误。
无需删除/清空原桶的解决方案
- 第一步:备份当前CloudFormation栈的模板、所有参数配置,同时通过控制台/CLI导出原桶
my-prod-s3bucket的所有配置(加密策略、标签、现有事件通知等)和桶内数据,避免操作失误 - 第二步:从当前栈中解绑现关联的
my-prod-yamlbucket:- 修改当前栈的模板,删除整个
S3ENILambdaUploadBucket资源定义,同步调整引用该资源的输出、关联配置 - 执行栈更新,因为设置了保留策略,更新后
my-prod-yamlbucket会保留,仅和栈解除关联,不会被删除
- 修改当前栈的模板,删除整个
- 第三步:将原桶
my-prod-s3bucket导入当前栈:- 调整你现有带
NotificationConfiguration的模板,确认模板内的加密、标签、桶名等属性和原桶当前的实际配置完全一致,属性不匹配会导致导入失败 - 在CloudFormation控制台选择对应栈,点击「导入资源到堆栈」,按照向导提示填写资源类型为
AWS::S3::Bucket、逻辑ID为S3ENILambdaUploadBucket、资源标识符为原桶名my-prod-s3bucket - 提交导入任务,等待完成后原桶就重新和当前栈建立了管理关系,导入操作不会修改桶内任何现有数据和配置
- 调整你现有带
- 第四步:更新栈应用通知配置:导入完成后直接提交你编写的带Lambda通知配置的模板,CloudFormation会直接为原桶新增通知配置,不需要替换资源,也不会中断服务
补充注意:如果你的目标Lambda还没有配置S3调用权限,需要先给Lambda添加如下资源策略,否则通知配置会失败:
{ "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "替换为你的Lambda函数ARN", "Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:s3:::my-prod-s3bucket" } } }
内容的提问来源于stack exchange,提问作者gbux
相关产品推荐
相关产品推荐

