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

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

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

我需要在 CloudFormation 模板中添加什么才能使其不尝试重新创建已经存在的资源?

我的模板的相关片段如下:

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

答案1

一种方法是向 CloudFormation 模板添加一个输入参数,以指示应使用现有存储桶。

仅当参数表明需要时,才使用模板中的条件子句来创建存储桶。

答案2

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

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

因此,如果您现有的资源没有这些标签,或者没有这些标签的正确值,那么它们就不会被视为新堆栈的一部分,而且我看不到改变这种情况的方法。

答案3

我也想实现自动化,因为似乎仅使用 Cloudformation 模板无法实现。我考虑的流程是:

  1. 创建另一个临时存储桶temp-$originalbucketname
  2. 将所有内容逐个复制到另一个存储桶以节省时间
  3. 删除所有内容$originalbucketname
  4. 删除 $originalbucketname,因为它现在是空的
  5. 创建 Cloudformation 堆栈(将重新创建存储桶)
  6. 将内容复制回来
  7. 消除temp-$originalbucketname

这是一个非常复杂的过程,根据存储桶的大小,它可能需要几个小时,因为大多数步骤都是 O(n)且键的数量是 O(n)。

您可能会认为 Cloudformation 是 AWS 自动化的基本层,但我认为它只是一个(相当有限的)怪物,将所有服务的拜占庭 API 整合在一起。

相关内容