

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# AWS Service Catalog 範本限制條件
<a name="catalogs_constraints_template-constraints"></a>

**注意**  
AWS Service Catalog 不支援 Terraform Open Source 或 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. 在 https：//[https://console.aws.amazon.com/servicecatalog/](https://console.aws.amazon.com/servicecatalog/) 開啟 Service Catalog 主控台。

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

虛擬範本顯示包含兩個名為 `Rule01` 和 `Rule02` 規則的 `Rules` 區段。`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"
      }
    ]
  }
}
```