我如何重用CloudFormation中的现有资源?

我在我的CloudFormation模板中有S3存储桶作为资源。 将DeletionPolicy设置为Retain 。 这按预期工作时,删除堆栈,它确实保留桶。 但是,当我尝试再次创build堆栈时,创build失败,而尝试再次创build相同的桶,错误消息抱怨它已经存在。

我需要添加到我的CloudFormation模板,使其不尝试重新创build已经存在的资源?

我的模板相关片段如下:

  "Resources": { "SomeS3Bucket" : { "Type" : "AWS::S3::Bucket", "DeletionPolicy" : "Retain", "Properties": { "BucketName": "SomeS3Bucket" } } 

    一种方法是将input参数添加到CloudFormation模板以指示应该使用现有的存储桶。

    仅当参数指示需要时才使用模板中的Condition子句来创build存储桶。

    CloudFormation使用带有“aws:”前缀的标签来跟踪哪些资源与堆栈中的哪些条目相关联 – 在决定添加/删除/更新之前,用于比较模板的“实时”状态。

    作为用户,您不能添加,编辑或删除此类标签。

    所以,如果你现有的资源没有这些标签,或者没有这些标签的正确值,那么他们不被认为是新堆栈的一部分,我没有看到改变这种情况的方法。

    我也试图自动化,因为它似乎不能用Cloudformation模板完成。 我正在考虑的过程是:

    1. 创build另一个临时存储桶temp-$originalbucketname
    2. 把所有的内容都复制到bucket-to-bucket来节省时间
    3. $originalbucketname删除所有的内容
    4. 现在删除$ originalbucketname,它是空的
    5. 创buildCloudformation堆栈(将重新创build存储桶)
    6. 将内容复制回来
    7. 删除temp-$originalbucketname

    这是一个非常复杂的过程,根据桶的大小,很容易需要几个小时,因为大部分步骤都是O(n)和键数。

    您可能会认为Cloudformation是AWS自动化的基础层,但我认为这只是一个(非常有限)的怪物,它们将拜占庭API集成在一起,用于他们的所有服务。