我的 CloudFormation 模板中有一个 S3 存储桶作为资源,DeletionPolicy
设置为Retain
。这按预期工作:删除堆栈时,它确实保留了存储桶。但是,当我尝试再次创建堆栈时,创建失败,同时尝试再次创建同一个存储桶,并显示一条错误消息,抱怨它已经存在。
我需要在 CloudFormation 模板中添加什么才能使其不尝试重新创建已经存在的资源?
我的模板的相关片段如下:
"Resources": {
"SomeS3Bucket" : {
"Type" : "AWS::S3::Bucket",
"DeletionPolicy" : "Retain",
"Properties": {
"BucketName": "SomeS3Bucket"
}
}
答案1
一种方法是向 CloudFormation 模板添加一个输入参数,以指示应使用现有存储桶。
仅当参数表明需要时,才使用模板中的条件子句来创建存储桶。
答案2
CloudFormation 使用带有“aws:”前缀的标签来跟踪哪些资源与哪些堆栈中的哪些条目相关联 - 这是它在决定添加/删除/更新什么之前用来与模板进行比较的“实时”状态。
作为用户,您不能添加、编辑或删除此类标签。
因此,如果您现有的资源没有这些标签,或者没有这些标签的正确值,那么它们就不会被视为新堆栈的一部分,而且我看不到改变这种情况的方法。
答案3
我也想实现自动化,因为似乎仅使用 Cloudformation 模板无法实现。我考虑的流程是:
- 创建另一个临时存储桶
temp-$originalbucketname
- 将所有内容逐个复制到另一个存储桶以节省时间
- 删除所有内容
$originalbucketname
- 删除 $originalbucketname,因为它现在是空的
- 创建 Cloudformation 堆栈(将重新创建存储桶)
- 将内容复制回来
- 消除
temp-$originalbucketname
这是一个非常复杂的过程,根据存储桶的大小,它可能需要几个小时,因为大多数步骤都是 O(n)且键的数量是 O(n)。
您可能会认为 Cloudformation 是 AWS 自动化的基本层,但我认为它只是一个(相当有限的)怪物,将所有服务的拜占庭 API 整合在一起。