模板约束规则 - Amazon Service Catalog
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

模板约束规则

在 Amazon Service Catalog 产品组合中定义模板约束的规则描述了最终用户可以使用模板的时间以及可以为用于创建其尝试使用的产品的 Amazon CloudFormation 模板中声明的参数指定的值。规则可用于防止最终用户无意中指定错误的值。例如,您可以添加规则以验证最终用户是否在给定 VPC 中指定了有效子网或是否将 m1.small 实例类型用于测试环境。Amazon CloudFormation 先使用规则验证参数值,然后再为产品创建资源。

每个规则包含两个属性:规则条件(可选)和断言(必需)。规则条件确定规则的生效时间。断言描述用户可为特定参数指定的值。如果您未定义规则条件,则规则的断言始终生效。要定义规则条件和断言,可使用特定于规则的内部函数,只能在模板的 Rules 部分中使用这些函数。您可以嵌套函数,但规则条件或断言的最终结果必须为 true 或 false。

例如,假设您在 Parameters 部分中声明了 VPC 和子网参数。您可以创建一个规则来验证给定子网是否位于特定的 VPC 中。因此,当用户指定 VPC 时,Amazon CloudFormation 将评估断言以检查在创建或更新堆栈之前,子网参数值是否在 VPC 中。如果参数值无效,则 Amazon CloudFormation 将无法创建或更新堆栈。如果用户未指定 VPC,则 Amazon 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" } ] } }

此伪模板显示包含两个分别名为 RulesRule01 的规则的 Rule02 部分。Rule01 包含一个规则条件和两个断言。如果规则条件中的函数的计算结果为 true,则将计算和应用每个断言中的函数。如果规则条件为 false,则此规则不会生效。由于 Rule02 没有规则条件(这意味着始终计算和应用断言),因此它始终生效。

有关用于定义规则条件和断言的特定于规则的内置函数信息,请参阅Amazon CloudFormation《用户指南》中的Amazon规则函数

示例:按条件验证参数值

以下两个规则检查 InstanceType 参数的值。根据环境参数(testprod)的值,用户必须为 m1.small 参数指定 m1.largeInstanceType。必须在同一模板的 InstanceType 部分中声明 EnvironmentParameters 参数。

"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" } ] } }