我正在使用cloudformation创建一个堆栈,其中包括一个自动缩放的ec2实例和一个S3存储桶。对于S3存储桶,我已将DeletionPolicy设置为Retain,它可以正常工作,直到我想再次重新运行cloudformation脚本。由于该脚本在先前的运行中创建了S3存储桶,因此在随后的运行中失败,表明我的S3存储桶已经存在。当然,其他任何资源都不会被创建。我的问题是如何检查我的S3存储桶是否首先存在于cloudformation脚本中,如果存在,然后跳过创建该资源。我已经查看了AWS的条件,但是似乎所有基于参数的参数,我还没有找到可以从现有资源中进行检查的函数。
最佳答案
没有明显的方法可以执行此操作,除非您通过显式检查动态创建模板。从同一模板创建的堆栈是独立的实体,并且如果创建包含存储桶的堆栈,在保留存储桶的同时删除该堆栈,然后创建一个新的堆栈(甚至具有相同名称的堆栈),则两者之间没有任何联系。新堆栈以及作为先前堆栈一部分创建的存储桶。
如果您要对多个堆栈使用同一S3存储桶(即使一次仅存在其中一个),则该存储桶实际上并不属于该堆栈-使用以下方法在单独的堆栈中创建存储桶更有意义一个单独的模板(将存储桶URL放在“输出”部分中),然后使用参数从原始堆栈中引用它。
2019年11月更新:
现在有可能的替代方法。 11月13日,AWS launched CloudFormation资源导入。使用该功能,您现在可以从现有资源创建堆栈。当前,此功能不支持很多资源类型,但支持S3存储桶。
在您的情况下,您必须分两个步骤进行操作:
--change-set-type IMPORT
标志)(see docs),创建一个仅仅包含预先存在的S3存储桶的模板(docs)正如他们在文档中指出的那样;此功能非常通用。因此,它提供了很多可能性。有关更多信息,请参见ojit_a。