

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

# 使用 AWS CDK 自动部署 AWS Service Catalog 产品组合与产品
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk"></a>

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

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

AWS Service Catalog 可帮助您集中管理获准在组织 AWS 环境中使用的 IT 服务或*产品*目录。一系列产品称为*产品组合*，产品组合还包含配置信息。利用 AWS Service Catalog，您可以为组织内的每类用户创建一个自定义产品组合，然后授予对适当产品组合的访问权限。然后，这些用户可在产品组合中快速部署他们需要的任何产品。

如果您拥有复杂的网络基础架构（例如多区域和多账户架构），建议您在单个中央账户中创建和管理服务目录组合。此模式介绍如何使用 AWS Cloud Development Kit（AWS CDK）在中央账户中自动创建服务目录组合，向最终用户授予访问权限，然后选择向一个或多个目标 AWS 账户配置产品。此 ready-to-use解决方案在源账户中创建 Service Catalog 产品组合。它还可以选择使用 AWS CloudFormation 堆栈在目标账户中配置产品，并帮助您 TagOptions 为产品进行配置：
+ **AWS CloudFormation StackSets** — 您可以使用 StackSets 在多个 AWS 区域和账户中启动 Service Catalog 产品。在此解决方案中，您可选择在部署此解决方案时自动配置产品。有关更多信息，请参阅[使用 AWS CloudFormation StackSets（S](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/using-stacksets.html) ervice Catalog 文档）和[StackSets 概念](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-concepts.html)（CloudFormation 文档）。
+ **TagOption 库**-您可以使用 TagOption 库管理已配置产品的标签。A *TagOption*是在 AWS Service Catalog 中管理的键值对。它不是 AWS 标签，但它可以用作基于创建 AWS 标签的模板 TagOption。有关更多信息，请参阅[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>

**先决条件**
+ 用作管理 Service Catalog 产品组合的源账户的活跃 AWS 账户
+ 如果您使用此解决方案在一个或多个目标客户中配置产品，则目标账户必须已经存在并且处于活动状态。
+ AWS Identity and Access Management (IAM) 权限，用于访问 AWS Service Catalog CloudFormation、AWS 和 AWS IAM。

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

## 架构
<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_cn/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 管理员**角色并部署您在 c **onfig.** json 文件中定义的 AWS CloudFormation 堆栈集。

1. 在目标账户中， StackSets 担任**StackSet 执行**角色并配置产品。

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

**Amazon Web Services**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) 是一个软件开发框架，可帮助您在代码中定义和预调配 Amazon Web Services Cloud 基础设施。
+ [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 (AWS IAM) ](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)通过控制验证和授权使用您 AWS 资源的用户，帮助您安全地管理对您 AWS 资源的访问。
+ [AWS Service Catalog](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html) 可帮助您集中管理获准在 AWS 上使用的 IT 服务目录。最终用户可在遵循组织设定约束的情况下快速部署他们所需已获得批准的 IT 服务。

**代码存储库**

此模式的代码可在 GitHub[aws-cdk-servicecatalog-automation](https://github.com/aws-samples/aws-cdk-servicecatalog-automation.git)存储库中找到。此代码存储库包含以下文件和文件夹：
+ **cdk-sevicecatalog-app**— 此文件夹包含此解决方案的 AWS CDK 应用程序。
+ **config** — 此文件夹包含 **config.json** 文件和用于在 Service Catalog 产品组合中部署产品的 CloudFormation 模板。
+ **config/config.json** — 该文件包含所有配置信息。您可更新此文件，以针对您的用例自定义此解决方案。
+ **config/tem** plates — 此文件夹包含服务中心产品的 CloudFormation 模板。
+ **setup.sh** — 此脚本部署解决方案。
+ **uninstall.sh** — 此脚本删除部署此解决方案时所创建的堆栈和所有 AWS 资源。

若要使用示例代码，请按照[操作](#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 角色应遵守[最低权限原则](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)（IAM 文档）。
+ [遵守使用 AWS CDK 开发云应用程序的最佳实践](https://aws.amazon.com/blogs/devops/best-practices-for-developing-cloud-applications-with-aws-cdk/)（AWS Blog 文章）。
+ 遵守 A [WS 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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 安装 AWS CDK Toolkit。 | 确保您已安装 AWS CDK Toolkit。输入以下命令，以确认是否已安装并检查版本。 <pre>cdk --version</pre>如果未安装 AWS CDK Toolkit，请输入以下命令以进行安装。<pre>npm install -g aws-cdk@2.27.0</pre>如果 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 的完整命令。这将从中克隆[aws-cdk-servicecatalog-automation](https://github.com/aws-samples/aws-cdk-servicecatalog-automation)存储库。 GitHub<pre>git clone <repository-URL>.git</pre>这将在目标目录中创建 `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>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 工程师 | 
| 配置所需的 IAM 角色 StackSets。 | 如果您使用 StackSets 在目标账户中自动配置产品，则需要配置管理和运行堆栈集的 IAM 角色。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 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_cn/prescriptive-guidance/latest/patterns/automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk.html)有关已完成的配置文件的示例，请参阅[其他信息](#automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-additional)部分的*示例配置文件*。 | 应用程序开发人员、 DevOps 工程师、AWS DevOps | 
| 部署解决方案。 | 输入如下命令。这将部署 AWS CDK 应用程序，并按照 **config.json** 文件中指定的方式配置 Service Catalog 产品组合和产品。<pre>sh +x setup.sh</pre> | 应用程序开发人员、 DevOps 工程师、AWS DevOps | 
| 验证部署。 | 通过执行以下操作，验证部署是否成功：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/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_cn/prescriptive-guidance/latest/patterns/automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk.html)例如，您可添加其他产品组合或预配置更多资源。AWS CDK 应用程序仅实施更改。如果先前部署的产品组合或产品无变化，则重新部署不会影响它们。 | 应用程序开发人员、 DevOps 工程师、通用 AWS | 

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


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| （可选）移除此解决方案所部署的 AWS 资源。 | 如果要删除预配置产品，请按[删除预配置产品](https://docs.aws.amazon.com/servicecatalog/latest/userguide/enduser-delete.html)（Service Catalog 文档）中的说明进行操作。如果您想删除此解决方案所创建的所有资源，请输入以下命令。<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 Marketing）
+ [在 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"
            }
        }
    ]
}
```