Cloudformation模板格式错误:每个DeletionPolicy成员必须是一个字符串

时间:2015-12-15 10:13:33

标签: amazon-web-services amazon-cloudformation

您好我正在尝试使用" IF"函数就像在RDS DeletionPolicy的云编队文档中提到的那样,但由于某种原因它说我的函数没有返回字符串。

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的错误

3 个答案:

答案 0 :(得分:8)

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

我认为此限制已经提交给AWS工程团队,因为这是一个令人讨厌的问题。

答案 1 :(得分:0)

根据紧张功能参考 https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html

  

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

因此您不能将它们用于DeletionPolicy

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

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

答案 2 :(得分:-1)

是的,仅在某些地方允许使用内在函数。而且在内部函数中,只能使用一组预定义的内部函数。您可以尝试cloudkast,它是一种在线cloudformation模板生成器,使创建cloudformation模板非常容易。