

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

# AWS Service Catalog 模板约束
<a name="catalogs_constraints_template-constraints"></a>

**注意**  
AWS Service Catalog 不支持 Terraform 开源或 Terraform Cloud 产品的模板限制。

要限制最终用户在启动产品时可用的选项，请应用模板约束。应用模板约束可确保最终用户可在不违反组织的合规性要求的情况下使用产品。您可以将模板约束应用于产品 AWS Service Catalog 组合中的产品。产品组合必须先包含一个或多个产品，然后才能定义模板约束。

模板约束由一个或多个规则组成，这些规则缩小了在产品基础 CloudFormation 模板中定义的参数的允许值。 CloudFormation 模板中的参数定义用户在创建堆栈时指定的值的集合。例如，参数可以定义用户在启动包含实例的堆栈时可以选择的各种 EC2 实例类型。

如果模板中的参数值集对于产品组合的目标受众来说太广泛，则可定义模板约束来限制用户在启动产品时可选择的值。例如，如果模板参数包含的 EC2 实例类型对于仅应使用小实例类型（例如`t2.micro`或`t2.small`）的用户来说太大，则可以添加模板约束来限制最终用户可以选择的实例类型。有关 CloudFormation 模板参数的更多信息，请参阅《*CloudFormation 用户指南*》中的[参数](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html)。

模板约束绑定于产品组合内。如果将模板约束应用于一个产品组合的某个产品，然后您将此产品包含在另一个产品组合中，则这些约束将不会应用于第二个产品组合的此产品。

如果将模板约束应用于已与用户共享的产品，则约束会立即应用到随后启动的所有产品和产品组合中所有版本的产品。

您可以使用规则编辑器或在 AWS Service Catalog 管理员控制台中将规则写成 JSON 文本来定义模板约束规则。有关规则的更多信息（包括语法和示例），请参阅[模板约束规则](reference-template_constraint_rules.md)。

要在将约束发布给用户前对其进行测试，请创建包含相同产品的测试产品组合，并使用该产品组合测试约束。

**将模板约束应用于产品**

1. 打开 Service Catalog 控制台，网址为[https://console.aws.amazon.com/servicecatalog/](https://console.aws.amazon.com/servicecatalog/)。

1. 在**产品组合**页面，选择包含要将模板约束应用于其上的产品的产品组合。

1. 展开**约束**部分并选择**添加约束**。

1. 在**选择产品和类型**窗口中，对于**产品**，选择您要定义模板约束的产品。然后，对于**约束类型**项，选择**模板**。选择**继续**。

1. 在**模板约束生成器**页面，使用 JSON 编辑器或规则生成器界面来编辑约束规则。
   + 要编辑规则的 JSON 代码，请选择**约束文本编辑器**选项卡。此选项卡上提供了多个示例来帮助您开始操作。

     要使用规则生成器界面构建规则，请选择**规则生成器**选项卡。在此选项卡上，您可以选择产品的模板中指定的任何参数，并可以为该参数指定允许值。根据参数的类型，可通过选择清单中的项目、指定数量或指定逗号分隔列表中的一组值来指定允许值。

     在构建完规则后，选择**添加规则**。规则会显示在**规则生成器**选项卡上的表中。要查看和编辑 JSON 输出，请选择**约束文本编辑器**选项卡。

1. 在编辑完约束的规则后，选择**提交**。要查看约束，请转到产品组合详细信息页，然后展开**约束**。

# 模板约束规则
<a name="reference-template_constraint_rules"></a>

在 AWS Service Catalog 产品组合中定义模板约束的规则描述了最终用户何时可以使用该模板，以及他们可以为用于创建他们尝试使用的产品的 CloudFormation 模板中声明的参数指定哪些值。规则可用于防止最终用户无意中指定错误的值。例如，您可以添加一条规则来验证最终用户是否在给定 VPC 中指定了有效的子网，或者是否在测试环境中使用了`m1.small`实例类型。 CloudFormation 在为产品创建资源之前，使用规则来验证参数值。

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

例如，假设您在 `Parameters` 部分中声明了 VPC 和子网参数。您可以创建一个规则来验证给定子网是否位于特定的 VPC 中。因此，当用户指定 VPC 时，会在创建或更新堆栈之前 CloudFormation 评估断言以检查子网参数值是否在该 VPC 中。如果参数值无效，则 CloudFormation 立即无法创建或更新堆栈。如果用户未指定 VPC，则 CloudFormation 不检查子网参数值。

## 语法
<a name="template-constraint-rules-syntax"></a>

模板的`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 规则函数](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-rules.html)。

## 示例：按条件验证参数值
<a name="template-constraint-rules-example"></a>

以下两个规则检查 `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"
      }
    ]
  }
}
```