【问题标题】:Cloudformation Template format error: Every DeletionPolicy member must be a stringCloudformation 模板格式错误:每个 DeletionPolicy 成员必须是字符串
【发布时间】:2016-03-21 01:50:22
【问题描述】:

您好,我正在尝试使用“IF”函数,就像 RDS 删除策略的云形成文档中提到的那样,但由于某种原因,它说我的函数没有返回字符串。

AWS Documentation on conditional statements

条件如下:

 "DeletionPolicy" : {
    "Fn::If" : [
      "CreateProdResources",
      "Snapshot",
      "Delete"
    ]}

而且错误是标题中的那个:

Template validation error: Template format error: Every DeletionPolicy member must be a string.

其他无效的尝试:

有地图:

 "RdsDeletionPolicyMap" :{
      "production" : {
          "policy" : "Snapshot"
      },
      "staging" : {
          "policy" : "Delete"
      }
   }

然后:

   "DeletionPolicy" : {
      "Fn::FindInMap" : [ "RdsDeletionPolicyMap", {"Ref": "RailsEnvironment"}, "policy" ]
   }

还有一个简单的"Ref": ... 也不起作用。我高度怀疑这是 cloudformation 的错误

【问题讨论】:

标签: amazon-web-services amazon-cloudformation


【解决方案1】:

问题是 DeletionPolicy 必须设置为三个字符串之一。而且,虽然您的 If 检查将返回其中一个,但从系统的角度来看,它只知道它返回一个字符串 - 但不能保证是一个有效的字符串(与您的地图和参数检查相同),因此它只接受字符串文字,而不是解析为字符串的东西。

我认为 AWS 工程团队之前已经提出过这个限制,因为它很麻烦。

【讨论】:

  • IMO 这绝对是一个错误。关于如何解决它的任何想法?
  • 您可以添加一个条件语句并拥有 2 个保留策略,并根据条件添加相应的保留策略。绝对不理想。
  • 谢谢,看看我能做些什么
  • 这令人难以置信的烦人。 6年后,我也遇到了同样的事情。太棒了,他们还没有修复它。
【解决方案2】:

根据intrensic-function-referece https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html

您只能在模板的特定部分使用内部函数。 目前,您可以在资源属性中使用内在函数, 输出、元数据属性和更新策略属性。你可以 还可以使用内部函数有条件地创建堆栈资源。

所以你不能将它们用于 DeletionPolicy

但是,一种解决方法是 Cloudformation 条件:https://www.unixdaemon.net/cloud/intro-to-cloudformations-conditionals/

您可以添加两个具有条件的资源,每个资源中都有快照和删除。

【讨论】:

    【解决方案3】:

    是的,内部函数只允许在某些地方使用。而且在一个内在函数中,也只能使用一组预定义的内在函数。你可以试试cloudkast,这是一个在线的cloudformation模板生成器,可以很容易地创建cloudformation模板。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 2017-02-02
      • 2015-07-17
      • 2018-06-21
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多