您好我正在尝试使用" 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的错误
答案 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模板非常容易。