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


32

我的CloudFormation模板中有S3存储桶作为资源。随着DeletionPolicy集来Retain。这按预期工作,删除堆栈时,确实确实保留了存储桶。但是,当我尝试再次创建堆栈时,尝试再次创建相同存储桶时,创建失败,并出现错误消息,提示该存储桶已存在。

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

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

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

出于兴趣,水桶有什么用?也许有另一种解决方法,具体取决于您要执行的操作。
Drew Khoury 2014年

Answers:


15

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

仅在参数指示需要桶时,才使用模板中的Condition子句创建桶。


4
到目前为止,+ 1是我所见过的唯一方法。不过,请不要将其标记为答案,因为我正在寻找一种自动化的方法。
vartec 2014年

1
如果没有,应该有一种方法:“ CloudFormer”如何工作?
jgomo3

7

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

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

因此,如果您现有的资源没有这些标签,或者没有这些标签的正确值,那么它们就不会被视为新堆栈的一部分,我也看不出有任何更改方法。


2

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

  1. 创建另一个临时存储桶 temp-$originalbucketname
  2. 将所有内容复制到存储桶中以节省时间
  3. 从中删除所有内容 $originalbucketname
  4. 删除$ originalbucketname现在为空
  5. 创建Cloudformation堆栈(将重新创建存储桶)
  6. 复制内容
  7. 去掉 temp-$originalbucketname

这是一个非常复杂的过程,根据存储桶的大小,它很容易花费数小时,因为大多数步骤都是带有密钥数目的O(n)。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.