

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

# 使用 AWS CDK 自動化 AWS Service Catalog 產品組合和產品部署
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk"></a>

*Sandeep Gawande、Vyoma Sachdeva 和 RAJNEESH TYAGI，Amazon Web Services*

## 總結
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-summary"></a>

AWS Service Catalog 可協助您集中管理已核准在組織的 AWS 環境中使用的 IT 服務或*產品的*目錄。產品組合稱為*產品組合*，而產品組合也包含組態資訊。使用 AWS Service Catalog，您可以為組織中的每種類型的使用者建立自訂產品組合，然後授予適當產品組合的存取權。這些使用者可以從產品組合中快速部署所需的任何產品。

如果您有複雜的聯網基礎設施，例如多區域和多帳戶架構，建議您在單一中央帳戶中建立和管理 Service Catalog 產品組合。此模式說明如何使用 AWS Cloud Development Kit (AWS CDK) 在中央帳戶中自動建立 Service Catalog 產品組合、授予最終使用者對它們的存取權，然後選擇性地在一或多個目標 AWS 帳戶中佈建產品。此ready-to-use型解決方案會在來源帳戶中建立 Service Catalog 產品組合。它也可以選擇性地使用 AWS CloudFormation 堆疊在目標帳戶中佈建產品，並協助您為產品設定 TagOptions：
+ **AWS CloudFormation StackSets** – 您可以使用 StackSets 跨多個 AWS 區域和帳戶啟動 Service Catalog 產品。在此解決方案中，您可以選擇在部署此解決方案時自動佈建 產品。如需詳細資訊，請參閱[使用 AWS CloudFormation StackSets](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/using-stacksets.html) (Service Catalog 文件） 和 [StackSets 概念](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-concepts.html) (CloudFormation 文件）。
+ **TagOption 程式庫** – 您可以使用 TagOption 程式庫來管理佈建產品的標籤。*TagOption* 是在 AWS Service Catalog 中管理的鍵/值對。它不是 AWS 標籤，但可做為根據 TagOption 建立 AWS 標籤的範本。如需詳細資訊，請參閱 [TagOption 程式庫](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/tagoptions.html) (Service Catalog 文件）。

## 先決條件和限制
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-prereqs"></a>

**先決條件**
+ 您要用作來源帳戶的作用中 AWS 帳戶，用於管理 Service Catalog 產品組合。
+ 如果您使用此解決方案在一或多個目標帳戶中佈建產品，則目標帳戶必須已存在且處於作用中狀態。
+ 存取 AWS Service Catalog、AWS CloudFormation 和 AWS IAM 的 AWS Identity and Access Management (IAM) 許可。 AWS Service Catalog AWS CloudFormation

**產品版本**
+ AWS CDK 2.27.0 版

## Architecture
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-architecture"></a>

**目標技術堆疊**
+ 集中式 AWS 帳戶中的 Service Catalog 產品組合
+ 部署在目標帳戶中的 Service Catalog 產品

**目標架構**

![AWS CDK 在目標帳戶中建立 Service Catalog 產品組合和佈建產品。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/e8f217a7-aec4-4c85-8f6b-f91995506be0/images/1f027b82-14c3-485a-909b-1544e974b90a.png)


1. 在產品組合 （或*來源*) 帳戶中，您可以使用使用案例的 AWS 帳戶、AWS 區域、IAM 角色、產品組合和產品資訊來更新 **config.json** 檔案。

1. 您可以部署 AWS CDK 應用程式。

1. AWS CDK 應用程式會擔任部署 IAM 角色，並建立 **config.json **檔案中定義的 Service Catalog 產品組合和產品。

   如果您將 StackSets 設定為在目標帳戶中部署產品，則程序會繼續。如果您未設定 StackSets 來佈建任何產品，則程序已完成。

1. AWS CDK 應用程式會擔任 **StackSet 管理員**角色，並部署您在 **config.json **檔案中定義的 AWS CloudFormation 堆疊集。

1. 在目標帳戶中，StackSets 會擔任 **StackSet 執行**角色並佈建產品。

## 工具
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-tools"></a>

**AWS 服務**
+ [AWS 雲端開發套件 (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) 是一種軟體開發架構，可協助您在程式碼中定義和佈建 AWS 雲端基礎設施。
+ [AWS CDK Toolkit](https://docs.aws.amazon.com/cdk/latest/guide/cli.html) 是命令列雲端開發套件，可協助您與 AWS CDK 應用程式互動。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 可協助您設定 AWS 資源、快速且一致地佈建資源，以及在整個 AWS 帳戶和區域的生命週期中管理這些資源。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 可透過控制已驗證並獲授權使用的人員，協助您安全地管理對 AWS 資源的存取。
+ [AWS Service Catalog](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html) 可協助您集中管理針對 AWS 核准的 IT 服務目錄。最終使用者可在機構所設的限制範圍內，迅速地只部署自己需要且經核准的 IT 服務。

**程式碼儲存庫**

此模式的程式碼可在 [aws-cdk-servicecatalog-automation](https://github.com/aws-samples/aws-cdk-servicecatalog-automation.git) 儲存庫的 GitHub 上取得。程式碼儲存庫包含下列檔案和資料夾：
+ **cdk-sevicecatalog-app** – 此資料夾包含此解決方案的 AWS CDK 應用程式。
+ **config** – 此資料夾包含 **config.json** 檔案和 CloudFormation 範本，用於部署 Service Catalog 產品組合中的產品。
+ **config/config.json** – 此檔案包含所有組態資訊。您可以更新此檔案，為您的使用案例自訂此解決方案。
+ **config/templates** – 此資料夾包含 Service Center 產品的 CloudFormation 範本。
+ **setup.sh** – 此指令碼部署解決方案。
+ **uninstall.sh** – 此指令碼會刪除部署此解決方案時建立的堆疊和所有 AWS 資源。

若要使用範例程式碼，請遵循 [Epics](#automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-epics) 區段中的指示。

## 最佳實務
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-best-practices"></a>
+ 用於部署此解決方案的 IAM 角色應遵循[最低權限 (IAM 文件） 原則](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。
+ 遵守[使用 AWS CDK 開發雲端應用程式的最佳實務](https://aws.amazon.com/blogs/devops/best-practices-for-developing-cloud-applications-with-aws-cdk/) (AWS 部落格文章）。
+ 遵守 [AWS CloudFormation 最佳實務](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html) (CloudFormation 文件）。

## 史詩
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-epics"></a>

### 設定您的環境
<a name="set-up-your-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 安裝 AWS CDK Toolkit。 | 請確定您已安裝 AWS CDK Toolkit。輸入下列命令以確認是否已安裝並檢查版本。 <pre>cdk --version</pre><br />如果未安裝 AWS CDK Toolkit，請輸入下列命令來安裝它。<pre>npm install -g aws-cdk@2.27.0</pre><br />如果 AWS CDK Toolkit 版本早於 2.27.0，請輸入下列命令將其更新至 2.27.0 版。<pre>npm install -g aws-cdk@2.27.0 --force</pre> | AWS DevOps，DevOps 工程師 | 
| 複製儲存庫。 | 輸入以下命令。在[其他資訊](#automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-additional)區段中的*複製儲存庫*中，您可以複製包含儲存庫 URL 的完整命令。這會從 GitHub 複製 [aws-cdk-servicecatalog-automation](https://github.com/aws-samples/aws-cdk-servicecatalog-automation) 儲存庫。<pre>git clone <repository-URL>.git</pre><br />這會在目標目錄中建立`cd aws-cdk-servicecatalog-automation`資料夾。輸入下列命令以導覽至此資料夾。<pre>cd aws-cdk-servicecatalog-automation</pre> | AWS DevOps，DevOps 工程師 | 
| 設定 AWS 登入資料。 | 輸入下列命令：這些匯出下列變數，定義您要部署堆疊的 AWS 帳戶和區域。<pre>export CDK_DEFAULT_ACCOUNT=<12-digit AWS account number></pre><pre>export CDK_DEFAULT_REGION=<AWS Region></pre><br />AWS CDK 的 AWS 登入資料是透過環境變數提供。 | AWS DevOps，DevOps 工程師 | 
| 設定最終使用者 IAM 角色的許可。 | 如果您要使用 IAM 角色來授予產品組合及其產品存取權，則這些角色必須具有由 **servicecatalog.amazonaws.com** 服務主體擔任的許可。如需如何授予這些許可的指示，請參閱[使用 Service Catalog 啟用受信任存取](https://docs.aws.amazon.com/organizations/latest/userguide/services-that-can-integrate-servicecatalog.html#integrate-enable-ta-servicecatalog) (AWS Organizations 文件）。 | AWS DevOps，DevOps 工程師 | 
| 設定 StackSets 所需的 IAM 角色。 | 如果您使用 StackSets 在目標帳戶中自動佈建產品，則需要設定管理和執行堆疊集的 IAM 角色。[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk.html) | AWS DevOps，DevOps 工程師 | 

### 自訂和部署解決方案
<a name="customize-and-deploy-the-solution"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 CloudFormation 範本。 | 在 `config/templates`資料夾中，為您要包含在產品組合中的任何產品建立 CloudFormation 範本。如需詳細資訊，請參閱[使用 AWS CloudFormation 範本](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html) (CloudFormation 文件）。 | 應用程式開發人員、AWS DevOps、DevOps 工程師 | 
| 自訂組態檔案。 | 在 `config`資料夾中，開啟 **config.json** 檔案，並根據您的使用案例定義適當的參數。除非另有說明，否則需要下列參數：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk.html)<br />如需已完成組態檔案的範例，請參閱[其他資訊](#automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-additional)區段中的*範例組態檔案*。 | 應用程式開發人員、DevOps 工程師、AWS DevOps | 
| 部署解決方案。 | 輸入以下命令。這會部署 AWS CDK 應用程式，並佈建 Service Catalog 產品組合和產品，如 **config.json** 檔案中所指定。<pre>sh +x setup.sh</pre> | 應用程式開發人員、DevOps 工程師、AWS DevOps | 
| 驗證部署。 | 執行下列動作來驗證部署是否成功：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk.html) | 一般 AWS | 
| （選用） 更新產品組合和產品。 | 如果您想要使用此解決方案來更新產品組合或產品，或佈建新產品：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk.html)<br />例如，您可以新增其他產品組合或佈建更多資源。AWS CDK 應用程式只會實作變更。如果先前部署的產品組合或產品沒有變更，則重新部署不會影響它們。 | 應用程式開發人員、DevOps 工程師、一般 AWS | 

### 清除解決方案
<a name="clean-up-the-solution"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| （選用） 移除此解決方案部署的 AWS 資源。 | 如果您想要刪除佈建產品，請遵循[刪除佈建產品](https://docs.aws.amazon.com/servicecatalog/latest/userguide/enduser-delete.html) (Service Catalog 文件） 中的指示。<br />如果您想要刪除此解決方案建立的所有資源，請輸入下列命令。<pre>sh uninstall.sh</pre> | AWS DevOps、DevOps 工程師、應用程式開發人員 | 

## 相關資源
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-resources"></a>
+ [AWS Service Catalog Construct Library](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_servicecatalog-readme.html) (AWS API 參考）
+ [StackSets 概念](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-concepts.html) (CloudFormation 文件）
+ [AWS Service Catalog](https://aws.amazon.com/servicecatalog) (AWS 行銷）
+ [搭配 AWS CDK 使用 Service Catalog](https://catalog.us-east-1.prod.workshops.aws/workshops/d40750d7-a330-49be-9945-cde864610de9/en-US/4-builders-devs/sc-cdk) (AWS 研討會）

## 其他資訊
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-additional"></a>

**複製儲存庫**

輸入下列命令，從 GitHub 複製儲存庫。

```
git clone https://github.com/aws-samples/aws-cdk-servicecatalog-automation.git
```

**範例組態檔案**

以下是具有範例值的範例 **config.json 檔案。**

```
{
    "portfolios": [
        {
            "displayName": "EC2 Product Portfolio",
            "providerName": "User1",
            "description": "Test1",
            "roles": [
                "<Names of IAM roles that can access the products>"
            ],
            "users": [
                "<Names of IAM users who can access the products>"
            ],
            "groups": [
                "<Names of IAM user groups that can access the products>"
            ]
        },
        {
            "displayName": "Autoscaling Product Portfolio",
            "providerName": "User2",
            "description": "Test2",
            "roles": [
                "<Name of IAM role>"
            ]
        }
    ],
    "tagOption": [
        {
            "key": "Group",
            "value": [
                "finance",
                "engineering",
                "marketing",
                "research"
            ]
        },
        {
            "key": "CostCenter",
            "value": [
                "01",
                "02",
                "03",
                "04"
            ]
        },
        {
            "key": "Environment",
            "value": [
                "dev",
                "prod",
                "stage"
            ]
        }
    ],
    "products": [
        {
            "portfolioName": "EC2 Product Profile",
            "productName": "Ec2",
            "owner": "owner1",
            "productVersionName": "v1",
            "templatePath": "../../config/templates/template1.json"
        },
        {
            "portfolioName": "Autoscaling Product Profile",
            "productName": "autoscaling",
            "owner": "owner1",
            "productVersionName": "v1",
            "templatePath": "../../config/templates/template2.json",
            "deployWithStackSets": {
                "accounts": [
                    "012345678901",
                ],
                "regions": [
                    "us-west-2"
                ],
                "stackSetAdministrationRoleName": "AWSCloudFormationStackSetAdministrationRole",
                "stackSetExecutionRoleName": "AWSCloudFormationStackSetExecutionRole"
            }
        }
    ]
}
```