

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

# 使用 AWS Service Catalog 限制條件
<a name="constraints"></a>

您可以套用限制來控制在最終使用者啟動特定產品組合中要套用至產品的規則。當最終使用者啟動產品時，他們會看到您使用限制所套用的規則。您可以在產品放入產品組合後，隨即將限制套用至產品。當您建立限制時，限制便會處於主動狀態，並套用至所有尚未啟動之產品的目前版本。

**Topics**
+ [啟動限制條件](constraints-launch.md)
+ [通知限制條件](constraints-notification.md)
+ [標籤更新限制](constraints-resourceupdate.md)
+ [堆疊集限制](constraints-stackset.md)
+ [範本限制條件](catalogs_constraints_template-constraints.md)

# AWS Service Catalog 啟動限制條件
<a name="constraints-launch"></a>

啟動限制條件指定最終使用者啟動、更新或終止產品時 AWS Service Catalog 擔任的 AWS Identity and Access Management (IAM) 角色。IAM 角色是使用者或服務 AWS 可暫時擔任以使用 AWS 服務的許可集合。如需簡介範例，請參閱：
+ CloudFormation 產品類型： [步驟 6：新增啟動限制以指派 IAM 角色](getstarted-launchconstraint.md)
+ Terraform 開放原始碼或 Terraform Cloud 產品類型： [步驟 5：建立啟動角色](getstarted-launchrole-Terraform.md)

啟動限制條件適用於產品組合中的產品 （產品產品組合關聯）。啟動限制不適用於產品組合層級或所有產品組合的產品。若要將啟動限制與產品組合中的產品建立關聯，您必須將啟動限制個別套用至每個產品。

如果沒有啟動限制，最終使用者必須使用自己的 IAM 登入資料來啟動和管理產品。若要這樣做，他們必須擁有 的許可 CloudFormation、產品使用 AWS 的服務，以及 AWS Service Catalog。透過使用啟動角色，您可以改為將最終使用者的許可限制為該產品所需的最低許可。如需有關最終使用者權限的詳細資訊，請參閱 [中的 Identity and Access Management AWS Service Catalog](controlling_access.md)。

若要建立和指派 IAM 角色，您必須具有下列 IAM 管理許可：
+ `iam:CreateRole`
+ `iam:PutRolePolicy`
+ `iam:PassRole`
+ `iam:Get*`
+ `iam:List*`

## 設定啟動角色
<a name="constraints-launch-role"></a>

您指派給產品做為啟動限制條件的 IAM 角色必須具有使用下列項目的許可：

**對於 Cloudformation 產品**
+ `arn:aws:iam::aws:policy/AWSCloudFormationFullAccess` CloudFormation 受管政策
+ 產品 AWS CloudFormation 範本中的服務
+ 讀取服務擁有的 Amazon S3 儲存貯體中的 AWS CloudFormation 範本存取權。

**對於 Terraform 產品**
+ 產品 Amazon S3 範本中的服務
+ 在服務擁有的 Amazon S3 儲存貯體中讀取對 Amazon S3 範本的存取權。
+ `resource-groups:Tag`在 Amazon EC2 執行個體中標記 （在執行佈建操作時由 Terraform 佈建引擎擔任）
+ `resource-groups:CreateGroup` 用於資源群組標記 （由 擔任 AWS Service Catalog ，以建立資源群組並指派標籤） 

IAM 角色的信任政策必須允許 AWS Service Catalog 擔任該角色。在下列程序中，當您選取 AWS Service Catalog 做為角色類型時，會自動設定信任政策。如果您不是使用 主控台，請參閱如何搭配 IAM *角色使用信任政策中為擔任角色 AWS 的服務建立*信任政策一節。 [https://aws.amazon.com/blogs/security/how-to-use-trust-policies-with-iam-roles/](https://aws.amazon.com/blogs/security/how-to-use-trust-policies-with-iam-roles/)

**注意**  
`servicecatalog:ProvisionProduct`、`servicecatalog:TerminateProvisionedProduct` 及 `servicecatalog:UpdateProvisionedProduct` 權限無法以啟動角色指派。您必須使用 IAM 角色，如[授予許可給 AWS Service Catalog 最終使用者一節中的內嵌政策步驟所示。](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/getstarted-iamenduser.html)

**注意**  
若要在 AWS Service Catalog 主控台中檢視佈建的 Cloudformation 產品和資源，最終使用者需要 CloudFormation 讀取存取權。在主控台中檢視佈建的產品和資源**不會**使用 啟動角色。

**建立啟動角色**

1. 前往 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

   Terraform 產品需要額外的啟動角色組態。如需詳細資訊，請參閱 *Terraform Open Source 產品入門*中的[步驟 5：建立啟動角色](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/getstarted-launchrole-Terraform)。

1. 選擇**角色**。

1. 選擇 **Create New Role** (建立新角色)。

1. 輸入角色名稱，然後選擇 **Next Step** (下一步)。

1. 在 旁的**AWS 服務角色**下**AWS Service Catalog**，選擇**選取**。

1. 在 **Attach Policy** (連接政策) 頁面上，選擇 **Next Step** (下一步)。

1. 若要建立角色，請選擇 **Create Role** (建立角色)。

**將政策連接到新的角色**

1. 選取您建立的角色以檢視該角色的詳細資訊頁面。

1. 選擇 **Permissions** (許可) 索引標籤，然後展開 **Inline Policies** (內嵌政策) 區段。然後，選擇 **click here** (按一下這裡)。

1. 選擇 **Custom Policy** (自訂政策)，然後選擇 **Select** (選取)。

1. 輸入原則的名稱，然後將以下內容貼到 **Policy Document** (政策文件) 編輯器：

   ```
     
             "Statement":[
         {
            "Effect":"Allow",
            "Action":[
               "s3:GetObject"
            ],
            "Resource":"*",
            "Condition":{
               "StringEquals":{
                  "s3:ExistingObjectTag/servicecatalog:provisioning":"true"
               }
            }
      ]
   }
   ```
**注意**  
當您設定啟動限制條件的啟動角色時，您必須使用此字串：`"s3:ExistingObjectTag/servicecatalog:provisioning":"true"`。

1. 針對產品使用的每個額外服務，將一行新增至政策。例如，若要新增 Amazon Relational Database Service (Amazon RDS) 的許可，請在`Action`清單中最後一行的結尾輸入逗號，然後新增下列行：

   ```
   "rds:*"
   ```

1. 選擇 **Apply Policy** (套用政策) 

## 套用啟動限制
<a name="constraints-launch-constraint"></a>

設定啟動角色之後，請將角色指派給產品做為啟動限制條件。此動作 AWS Service Catalog 會指示 在最終使用者啟動產品時擔任該角色。

**將角色指派至產品**

1. 在 https：//[https://console.aws.amazon.com/servicecatalog/](https://console.aws.amazon.com/servicecatalog/) 開啟 Service Catalog 主控台。

1. 選擇包含該產品的產品組合。

1. 選擇 **Constraints (限制)** 索引標籤，並選擇 **Create constraint (建立限制)**。

1. 從產品中選擇**產品**，然後在**限制類型**下選擇**啟動**。選擇**繼續**。

1. 在**啟動限制區段**中，您可以從您的帳戶選取 IAM 角色，然後輸入 IAM 角色 ARN，或輸入角色名稱。

   如果您指定角色名稱，且帳戶使用啟動限制，則帳戶會針對 IAM 角色使用該名稱。此方法可讓啟動角色限制與帳戶無關，因此您可以為每個共用帳戶建立較少的資源。
**注意**  
指定的角色名稱必須存在於建立啟動限制的帳戶中，以及使用此啟動限制啟動產品的使用者帳戶中。

1. 指定 IAM 角色後，選擇 **Create (建立)**。

## 新增混淆代理人以啟動限制條件
<a name="constraint-confused-deputy"></a>

AWS Service Catalog 支援使用擔任角色請求執行APIs 的[混淆代理人](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)保護。當您新增啟動限制條件時，您可以使用啟動角色信任政策中的 `sourceAccount`和 `sourceArn`條件來限制啟動角色存取。它可確保由信任的來源呼叫啟動角色。

在下列範例中， AWS Service Catalog 最終使用者屬於帳戶 111111111111。當 AWS Service Catalog 管理員`LaunchConstraint`為產品建立 時，最終使用者可以在啟動角色信任政策中指定下列條件，將擔任角色限制為帳戶 111111111111。

```
"Condition":{
   "ArnLike":{
      "aws:SourceArn":"arn:aws:servicecatalog:us-east-1:111111111111:*"
   },
   "StringEquals":{
      "aws:SourceAccount":"111111111111"
   }
  
}
```

使用 佈建產品的使用者`LaunchConstraint`必須具有相同的 `AccountId` (111111111111)。如果沒有，操作會失敗並顯示`AccessDenied`錯誤，防止啟動角色濫用。

以下 AWS Service Catalog APIs受到混淆代理人保護：
+ `LaunchConstraint`
+ `ProvisionProduct`
+ `UpdateProvisionedProduct`
+ `TerminateProvisionedProduct`
+ `ExecuteProvisionedProductServiceAction`
+ `CreateProvisionedProductPlan`
+ `ExecuteProvisionedProductPlan`

的`sourceArn `保護 AWS Service Catalog 僅支援範本 ARNs，例如 "`arn:<aws-partition>:servicecatalog:<region>:<accountId>:`" 它不支援特定資源 ARNs。

## 驗證啟動限制條件
<a name="constraints-launch-test"></a>

若要驗證 AWS Service Catalog 使用 角色來啟動產品並成功佈建產品，請從 AWS Service Catalog 主控台啟動產品。若要在發佈至使用者之前測試限制，請建立包含相同產品的測試產品組合，然後以該產品組合測試限制。

**啟動產品**

1. 在 AWS Service Catalog 主控台的功能表中，選擇 **Service Catalog**，**最終使用者**。

1. 選擇產品以開啟**產品詳細資訊**頁面。在**啟動選項**表格中，確認角色的 Amazon Resource Name (ARN) 出現。

1. 選擇**啟動產品**。

1. 繼續啟動步驟，填寫任何必要的資訊。

1. 確認產品已成功啟動。

# AWS Service Catalog 通知限制條件
<a name="constraints-notification"></a>

**注意**  
AWS Service Catalog 不支援 Terraform Open Source 或 Terraform Cloud 產品的通知限制條件。

通知限制條件會指定 Amazon SNS 主題，以接收堆疊事件的通知。

使用下列程序以建立一個 SNS 主題並訂閱。

**建立 SNS 主題與訂閱。**

1. 在 [https://console.aws.amazon.com/sns/v3/home](https://console.aws.amazon.com/sns/v3/home) 開啟 Amazon SNS 主控台。

1. 請選擇**建立主題**。

1. 輸入主題名稱，然後選擇 **Create topic (建立主題)**。

1. 選擇**建立訂閱**。

1. 關於**通訊協定**，請選擇**電子郵件**。關於 **Endpoint**(端點)，輸入可用於接收通知的電子郵件地址。選擇 **Create subscription** (建立訂閱)。

1. 您將收到一封具有主旨行的確認電子郵件 `AWS Notification - Subscription Confirmation`。開啟電子郵件並遵循指示完成訂閱。

透過您用之前程序建立的 SNS 主題來使用下列程序以套用通知條件限制。

**套用通知限制條件至產品**

1. 在 https：//[https://console.aws.amazon.com/servicecatalog/](https://console.aws.amazon.com/servicecatalog/) 開啟 Service Catalog 主控台。

1. 選擇包含該產品的產品組合。

1. 展開 **Constraints (限制)**，然後選擇 **Add constraints (加入限制)**。

1. 從產品中選擇**產品**，並將**限制類型**設定為**通知**。選擇**繼續**。

1. 選擇 **Choose a topic from your account**(從帳戶選擇一個主題)，然後選取您從 **Topic Name** (主題名稱) 建立的 SNS 主題。

1. 選擇**提交**。

# AWS Service Catalog 標籤更新限制
<a name="constraints-resourceupdate"></a>

**注意**  
AWS Service Catalog 不支援 Terraform Open Source 產品的標籤更新限制條件。

透過標籤更新限制， AWS Service Catalog 管理員可以允許或不允許最終使用者更新與佈建產品相關聯資源的標籤。如果允許標籤更新，則與產品或產品組合相關聯的新標籤將在佈建產品更新期間套用至佈建的資源。

**啟用產品的標籤更新**

1. 在 https：//[https://console.aws.amazon.com/servicecatalog/](https://console.aws.amazon.com/servicecatalog/) 開啟 Service Catalog 主控台。

1. 選擇包含您要更新之產品的產品組合。

1. 選擇**限制條件**索引標籤，然後選擇**新增限制條件**。

1. 在 **Constraint type (限制類型)** 下，選擇 **Tag Update (標籤更新)**。

1. 從 **Product (產品)** 中選擇產品，然後選擇 **Continue (繼續)**。

1. 在 **Tag Updates (標籤更新) 頁面** 上，選取 **Enable Tag Updates (啟用標籤更新)**。

1. 選擇**提交**。

# AWS Service Catalog 堆疊集限制
<a name="constraints-stackset"></a>

**注意**  
AWS Service Catalog 不支援 Terraform Open Source 產品的堆疊集限制。
StackSets 目前不支援 AutoTags。 CloudFormation StackSets 

堆疊集限制允許您使用 CloudFormation StackSets，設定產品的部署選項。您可以指定多個帳戶和區域的產品啟動。最終使用者可以管理這些帳戶，並判斷產品部署的位置和部署順序。

**套用堆疊集限制至產品**

1. 在 https：//[https://console.aws.amazon.com/servicecatalog/](https://console.aws.amazon.com/servicecatalog/) 開啟 Service Catalog 主控台。

1. 使用您想要的產品選擇產品組合。

1. 選擇**限制條件**索引標籤，然後選擇**建立限制條件**。

1. 在**產品**中，選擇產品。在**限制類型**中，選擇**堆疊集**。

1. 設定堆疊集限制的帳戶、區域和許可。
   + 在**帳戶設定**中，識別您要建立產品的帳戶。
   + 在**區域設定**中，選擇要部署產品的地理區域，以及您希望在這些區域中部署這些產品的順序。
   + 在**許可**中，選擇 IAM StackSet 管理員角色來管理您的目標帳戶。如果您未選擇角色，StackSets 會使用預設 ARN。[進一步了解如何設定堆疊集許可。](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs.html)

1. 選擇**建立**。

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