本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
模板约束规则
在 AWS Service Catalog 产品组合中定义模板约束的规则描述了最终用户何时可以使用该模板,以及他们可以为用于创建他们尝试使用的产品的 AWS CloudFormation 模板中声明的参数指定哪些值。规则可用于防止最终用户无意中指定错误的值。例如,您可以添加一条规则来验证最终用户是否在给定 VPC 中指定了有效的子网,或者是否在测试环境中使用了m1.small
实例类型。 AWS CloudFormation 在为产品创建资源之前,使用规则来验证参数值。
每个规则包含两个属性:规则条件(可选)和断言(必需)。规则条件确定规则的生效时间。断言描述用户可为特定参数指定的值。如果您未定义规则条件,则规则的断言始终生效。要定义规则条件和断言,可使用特定于规则的内部函数,只能在模板的 Rules
部分中使用这些函数。您可以嵌套函数,但规则条件或断言的最终结果必须为 true 或 false。
例如,假设您在 Parameters
部分中声明了 VPC 和子网参数。您可以创建一个规则来验证给定子网是否位于特定的 VPC 中。因此,当用户指定 VPC 时,会在创建或更新堆栈之前 AWS CloudFormation 评估断言以检查子网参数值是否在该 VPC 中。如果参数值无效,则 AWS CloudFormation 立即无法创建或更新堆栈。如果用户未指定 VPC,则 AWS CloudFormation 不检查子网参数值。
语法
模板的Rules
部分由后跟冒号的密钥名称 Rules
组成。所有规则声明都被括在括号里。如果您声明多个规则,则可用逗号将它们分隔开。对于每个规则,您必须声明一个用引号引起来的逻辑名称,后跟冒号以及将规则条件和断言括起来的括号。
规则可以包含 RuleCondition
属性,且必须包含 Assertions
属性。对于每个规则,您可以仅定义一个规则条件;您可以在 Assertions
属性内定义一个或多个断言。可以通过使用特定于规则的内部函数定义规则条件和断言,如以下伪模板所示:
"Rules":{
"Rule01":{
"RuleCondition":{
"Rule-specific intrinsic function"
},
"Assertions":[
{
"Assert":{
"Rule-specific intrinsic function"
},
"AssertDescription":"Information about this assert"
},
{
"Assert":{
"Rule-specific intrinsic function"
},
"AssertDescription":"Information about this assert"
}
]
},
"Rule02":{
"Assertions":[
{
"Assert":{
"Rule-specific intrinsic function"
},
"AssertDescription":"Information about this assert"
}
]
}
}
此伪模板显示包含两个分别名为 Rules
和 Rule01
的规则的 Rule02
部分。Rule01
包含一个规则条件和两个断言。如果规则条件中的函数的计算结果为 true,则将计算和应用每个断言中的函数。如果规则条件为 false,则此规则不会生效。由于 Rule02
没有规则条件(这意味着始终计算和应用断言),因此它始终生效。
有关用于定义规则条件和断言的特定于规则的内置函数信息,请参阅AWS CloudFormation 《用户指南》中的AWS 规则函数。
示例:按条件验证参数值
以下两个规则检查 InstanceType
参数的值。根据环境参数(test
或 prod
)的值,用户必须为 m1.small
参数指定 m1.large
或 InstanceType
。必须在同一模板的 InstanceType
部分中声明 Environment
和 Parameters
参数。
"Rules" : { "testInstanceType" : { "RuleCondition" : {"Fn::Equals":[{"Ref":"Environment"}, "test"]}, "Assertions" : [ { "Assert" : { "Fn::Contains" : [ ["m1.small"], {"Ref" : "InstanceType"} ] }, "AssertDescription" : "For the test environment, the instance type must be m1.small" } ] }, "prodInstanceType" : { "RuleCondition" : {"Fn::Equals":[{"Ref":"Environment"}, "prod"]}, "Assertions" : [ { "Assert" : { "Fn::Contains" : [ ["m1.large"], {"Ref" : "InstanceType"} ] }, "AssertDescription" : "For the prod environment, the instance type must be m1.large" } ] } }