

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

# 管理产品
<a name="catalogs_products"></a>

您可以通过创建基于更新后的模板的新版本来创建、更新产品，并将产品成组添加到产品组合中以便将其分发给用户。

产品的新版本将传播到有权通过产品组合访问产品的所有用户。在您分发更新时，最终用户可以更新现有预配置产品。

**Topics**
+ [查看产品页面](#productmgmt-menu)
+ [创建产品](productmgmt-cloudresource.md)
+ [将产品添加到产品组合](catalogs_portfolios_adding-products.md)
+ [更新产品](productmgmt-update.md)
+ [将产品同步到 GitHub、 GitHub 企业版或 Bitbucket 中的模板文件](git-synced-sc-products.md)
+ [删除产品](productmgmt-delete.md)
+ [管理版本](managing-versions.md)

## 查看产品页面
<a name="productmgmt-menu"></a>

您可以在 AWS Service Catalog 管理员控制台的 “**产品” 列表**页面上管理产品。

**要查看**产品列表**页面**

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

1. 选择**产品列表**。

# 创建产品
<a name="productmgmt-cloudresource"></a>

 您可以从 AWS Service Catalog 管理员控制台的 “**产品**” 页面创建产品。

**注意**  
创建 Terraform 产品需要额外配置，包括 Terraform 预配置引擎和启动角色。有关更多信息，请查看 [开始使用 Terraform 产品](getstarted-Terraform.md)。

**创建新 AWS Service Catalog 产品**

1. 导航**产品列表**页面。

1. 选择**创建产品**，然后选择**创建产品**。

1. **产品详情**-允许您选择要创建的产品类型。 AWS Service Catalog 支持 CloudFormation、Terraform Cloud 和 External（支持 Terraform 社区版）产品类型。产品详细信息还包含您在列表或详细信息页面中搜索和查看产品时显示的元数据。输入以下信息：
   + **产品名称** - 产品的名称。
   +  **产品描述** - 描述显示在产品列表中，可帮助您选择正确的产品。
   + **所有者** - 发布此产品的个人或组织。所有者可以是您 IT 组织或管理员的名称。
   + **分销商**（可选） – 应用程序发布者的名称。利用此字段，您可以对其产品列表进行排序，以便更轻松地找到产品。

1. **版本详细信息**使您可以添加模板文件并构建产品。输入以下信息：
   +  **选择方法** - 有四种方法可以添加模板文件。
     + **使用本地模板文件**-从本地驱动器上传 CloudFormation 模板或 Terraform tar.gz 配置文件。
     + **使用 Amazon S3 URL** - 指定 URL，该 URL 指向 CloudFormation 模板或存储在 Amazon S3 中的 Terraform tar.gz 配置文件。如果指定的是 Amazon S3 URL，则它必须以 `https://` 开头。
     + **使用外部存储库**-指定您的 GitHub、 GitHub 企业版或 Bitbucket 代码存储库。 AWS Service Catalog 允许您将产品同步到模板文件。对于 Terraform 产品，模板文件格式必须是在 Tar 中存档并在 Gzip 中压缩的单个文件。
     + **使用现有 CloudFormation 堆栈**-输入现有 CloudFormation 堆栈的 ARN。此方法不支持 Terraform 云或外部产品。
   +  **版本名称**（可选） – 产品版本的名称（例如，“v1”、“v2beta”）。不允许使用空格。
   +  **描述**（可选） – 产品版本的描述，包括此版本与其他版本的区别。
   +  **指南** - 在**产品详细信息**页面的版本选项卡中进行管理。创建产品版本时（在创建产品工作流程中），该版本的指南设置为默认值。要了解有关指南的更多信息，请参阅[管理版本](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/managing-versions.html)。

1. **支持详细信息**可确定贵公司内部的组织，并提供支持联系人。输入以下信息：
   + **Email contact** （可选） – 用于报告与产品有关的问题的电子邮件地址。
   + **支持链接**（可选） – 用户可从中找到支持信息或文件票证的站点的 URL。URL 必须以 `http://` 或 `https://` 开头。管理员负责维护支持信息的准确性和可访问性。
   + **支持描述**（可选） – 有关用户应如何使用**联系电子邮件**和**支持**链接的描述。

1.  **管理标签**（可选） - 除了使用标签对资源进行分类外，您还可以使用标签来验证您创建此资源的权限。

1. **创建产品** - 填写完表格后，选择**创建产品**。几秒钟后，产品会显示在**产品列表**页面上。您可能需要刷新浏览器来查看产品。

您还可以使用 CodePipeline 创建和配置管道，将产品模板部署到源存储库 AWS Service Catalog 并交付您在源存储库中所做的更改。有关更多信息，请参阅[教程：创建部署到 AWS Service Catalog的管道](https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-S3-servicecatalog.html)。

您可以在 CloudFormation 或 Terraform 模板中定义参数属性，并在配置期间强制执行这些规则。这些属性可以定义最小和最大长度、最小值和最大值、允许值以及该值的正则表达式。 AWS Service Catalog 如果提供的值不符合参数属性，则在置备期间发出警告。要了解有关参数属性的更多信息，请参阅*《CloudFormation 用户指南》*中的[参数](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html)。

## 问题排查
<a name="productmgmt-cloudresource-troubleshooting"></a>

 您必须拥有从 Amazon S3 存储桶中检索对象的权限。否则，启动或更新产品时，您可能会遇到以下错误。

```
Error: failed to process product version s3 access denied exception
```

 如果您遇到此消息，请确保您拥有从以下存储桶中检索对象的权限：
+  存储桶储存着预配置构件模板。
+  以 “***cf-templates-\$1***” 开头的存储桶，用于 AWS Service Catalog 存储配置项目模板。
+  以 “***sc-\$1***” 开头的内部存储桶，用于 AWS Service Catalog 存储元数据。您将无法在您的账户中看到此存储桶。

 以下示例策略展示了在前述存储桶检索对象所需的最低权限。

```
{
          "Sid": "VisualEditor1",
          "Effect": "Allow",
          "Action": "s3:GetObject*",
          "Resource": [
              "arn:aws:s3:::YOUR_TEMPLATE_BUCKET",
              "arn:aws:s3:::YOUR_TEMPLATE_BUCKET/*",
              "arn:aws:s3:::cf-templates-*",
              "arn:aws:s3:::cf-templates-*/*",
              "arn:aws:s3:::sc-*",
              "arn:aws:s3:::sc-*/*"
          ]
      }
```

# 将产品添加到产品组合
<a name="catalogs_portfolios_adding-products"></a>

 您可以将产品添加到任意数量的产品组合。在产品更新时，所有包含产品的产品组合（包括共享产品组合）会自动接收新版本。

**将产品从目录添加到产品组合**

1.  导航**产品列表**页面。

1.  选择产品，然后选择**操作**。从下拉菜单中，选择**将产品添加到产品组合**。您将被定向到 “***name-of-product*添加到投资组合**” 页面。

1.  选择产品组合，然后选择**添加产品至产品组合**。

当将 Terraform 产品添加到产品组合中时，该产品需要启动约束。您必须从账户中选择一个 IAM 角色，输入 IAM 角色 ARN 或输入角色名称。如果您指定角色名称，当账户使用启动约束时，将使用账户中具有该名称的 IAM 角色。这允许使用与账户无关的启动角色约束，确保您可以为每个共享账户创建更少的资源。有关详情和说明，请查看 [步骤 6：为 Terraform 产品添加启动约束](getstarted-launchconstraint-Terraform.md) 

 一个产品组合可以包含许多混合使用 Terraform 产品类型的 CloudFormation 产品。

# 更新产品
<a name="productmgmt-update"></a>

 当更新产品的模板时，您会创建产品的新版本。新产品版本将自动对有权访问包含此产品产品组合的所有用户可用。

**注意**  
更新现有产品时，您无法更改产品类型（CloudFormation 或 Teraform）。例如，如果您更新 CloudFormation 产品，则无法用 Terraform tar.gz 配置文件替换现有 CloudFormation 模板。必须使用新的 CloudFormation 模板文件更新现有 CloudFormation 模板文件。

 当前正在运行早期版本预配置产品的最终用户可将其预配置产品更新至新版本。当产品有新版本可用时，用户可以使用**预配置产品列表**或**预配置产品详细信息**页面上的**更新预配置产品**命令。

在创建产品的新版本之前， AWS Service Catalog 建议您在 Terraform 引擎中 CloudFormation 或在 Terraform 引擎中测试产品更新，以确保它们能正常运行。

**创建新产品版本**

1.  导航**产品**页面。

1.  选择要更新的产品。您将被定向至*产品详细信息*页面。

1.  在*产品详细信息*页面上，展开**版本**选项卡，然后选择**创建新版本**。

1.  在**版本详细信息**下，执行以下操作：
   + **选择模板** - 有四种方法可以添加模板文件。

     *使用本地模板文件*-从本地驱动器上传 CloudFormation 模板或 Terraform tar.gz 配置文件。

     *使用 Amazon S3 URL* - 指定 URL，该 URL 指向 CloudFormation 模板或存储在 Amazon S3 中的 Terraform tar.gz 配置文件。如果指定的是 Amazon S3 URL，则它必须以 https:// 开头。

     *使用外部存储库*-指定您的 GitHub、 GitHub 企业版或 Bitbucket 代码存储库。 AWS Service Catalog 允许您将产品同步到模板文件。对于 Terraform 产品，模板文件格式必须是在 Tar 中存档并在 Gzip 中压缩的单个文件。

     *使用现有 CloudFormation 堆栈*-输入现有 CloudFormation 堆栈的 ARN。此方法不支持 Terraform 云或外部产品。
   + **版本标题** – 产品版本的名称（例如，“v1”、“v2beta”）。不允许使用空格。
   + **描述**（可选） – 产品版本的描述，包括此版本与早期版本的区别。

1. 选择**创建产品版本**。

 您还可以使用 CodePipeline 创建和配置管道，将产品模板部署到源存储库中 AWS Service Catalog，并在源存储库中交付更改。有关更多信息，请参阅[教程：创建部署到 AWS Service Catalog的管道](https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-S3-servicecatalog.html)。

# 将产品同步到 GitHub、 GitHub 企业版或 Bitbucket 中的模板文件
<a name="git-synced-sc-products"></a>

AWS Service Catalog 允许您将产品同步到通过外部存储库提供商管理的模板文件。 AWS Service Catalog 将具有此类模板连接的产品称为 *Git 同步产品*。存储库选项包括 GitHub “ GitHub 企业版” 或 “Bitbucket”。 AWS 账户 使用外部存储库帐户授权后，您可以创建新 AWS Service Catalog 产品或更新现有产品以同步到存储库中的模板文件。当对模板文件进行更改并提交到存储库中时（例如，使用 git-push）， AWS Service Catalog 会自动检测更改并创建新的产品版本（构件）。

**Topics**
+ [将产品同步至外部模板文件所需权限](#required-perms-synced-repo)
+ [创建账户连接](#create-synced-product)
+ [查看 Git 同步产品连接](#view-repo-sync)
+ [更新 Git 同步产品连接](#update-repo-sync)
+ [删除 Git 同步产品连接](#delete-repo-sync)
+ [将 Terraform 产品同步到来自 GitHub、Enterpr GitHub ise 或 Bitbucket 的模板文件](#git-synced-Terraform)
+ [AWS 区域 支持 Git 同步产品](git-sync-supported-regions.md)

## 将产品同步至外部模板文件所需权限
<a name="required-perms-synced-repo"></a>

您可以使用以下 AWS Identity and Access Management (IAM) 策略作为模板，使 AWS Service Catalog 管理员能够将产品同步到外部存储库中的模板文件。此策略包括 CodeConnections 和的必需权限 AWS Service Catalog。 AWS Service Catalog 建议您复制下面的模板策略，并在启用存储库同步产品时也使用 AWS Service Catalog `AWSServiceCatalogAdminFullAccess`[托管策略](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/security-iam-awsmanpol)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "CodeStarAccess",
            "Effect": "Allow",
            "Action": [
            "codestar-connections:UseConnection",
            "codestar-connections:PassConnection",
            "codestar-connections:CreateConnection",
            "codestar-connections:DeleteConnection",
            "codestar-connections:GetConnection",
            "codestar-connections:ListConnections",
            "codestar-connections:ListInstallationTargets",
            "codestar-connections:GetInstallationUrl",
            "codestar-connections:StartOAuthHandshake",
            "codestar-connections:UpdateConnectionInstallation",
            "codestar-connections:GetIndividualAccessToken"
            ],
            "Resource": "arn:aws:codestar-connections:*:*:connection/*"
        },
        {
        "Sid": "CreateSLR",
        "Effect": "Allow",
        "Action": "iam:CreateServiceLinkedRole",
        "Resource": "arn:aws:iam::*:role/aws-service-role/sync.servicecatalog.amazonaws.com/AWSServiceRoleForServiceCatalogArtifactSync",
        "Condition": {
        "StringLike": {
        "iam:AWSServiceName": "sync.servicecatalog.amazonaws.com"
                }
            }
        }
    ]
}
```

------

## 创建账户连接
<a name="create-synced-product"></a>

在将模板文件同步到 AWS Service Catalog 产品之前，必须创建并授权一次性 account-to-account连接。您可以使用此连接来指定包含所需模板文件的存储库的详细信息。您可以使用 AWS Service Catalog 控制台、控制 CodeConnections 台、 AWS Command Line Interface (CLI) 或创建连接 CodeConnections APIs。

建立连接后，您可以使用 AWS Service Catalog 控制台、 AWS Service Catalog API 或 CLI 来创建同步 AWS Service Catalog 产品。 AWS Service Catalog 管理员可以根据存储库和分支中的模板文件创建新 AWS Service Catalog 产品或更新现有产品。如果在存储库中提交了更改，则 AWS Service Catalog 会自动检测更改并创建新的产品版本。先前产品版本仍然不可超过规定的版本限制，并被指定为**已弃用**状态。

此外，在创建连接后 AWS Service Catalog 自动创建服务相关角色 (SLR)。此 SLR 允许 AWS Service Catalog 检测提交到存储库的任何模板文件更改。单反相机还 AWS Service Catalog 允许自动为同步产品创建新的产品版本。有关 SLR 权限和功能的更多信息，请参阅 [AWS Service Catalog的服务相关角色](#required-perms-synced-repo)。

**要创建新的 Git 同步产品**

1. 在左侧导航面板中，选择**产品列表**，然后选择**创建产品**。

1. 输入**产品详细信息**。

1. 在 “版本详细信息” 中，选择 “**使用 AWS CodeStar 提供程序指定您的代码存储库**”，然后选择 “**创建新 AWS CodeStar 连接**” 链接。

1. 创建连接后，刷新连接列表，然后选择新连接。指定存储库详细信息，包括**存储库**、**分支**和**模板文件路径**。

   有关使用 Terraform 配置文件的更多信息，请参阅 [将 Terraform 产品同步到来自 GitHub、Enterpr GitHub ise 或 Bitbucket 的模板文件](#git-synced-Terraform)。

   1. （创建新 AWS Service Catalog 产品资源时可选）在 Suppor **t Det** ails 部分，添加产品的元数据。

   1. （创建新 AWS Service Catalog 产品资源时可选）在 “**标签” 部分，选择 “**添加新标签****”，然后输入 “**密钥**” 和 “**值**” 对。

1. 选择**创建新产品**。

**要创建多个 Git 同步产品**

1. 在 AWS Service Catalog 控制台左侧导航面板中，选择**产品列表**，然后选择**创建多个 git 托管产品**。

1. 输入**通用产品详细信息**。

1. 在外部存储库详细信息中，选择一个 **AWS CodeStar 连接**，然后指定**存储库**和**分支**。

1. 在“添加产品”窗格中，输入**模板文件路径**和**产品名称**。选择**添加新项目**，然后根据需要继续添加产品。

1. 添加所有所需产品后，选择**批量创建产品**。

**将现有 AWS Service Catalog 产品连接到外部存储库**

1. 在 AWS Service Catalog 控制台左侧导航面板中，选择 “**产品列表**”，然后选择 “**将产品连接到外部存储库**”。

1. 在选择产品页面上，选择要连接到外部存储库的产品，然后选择**下一步**。

1. 在 “指定源详细信息” 页面上，选择现有 AWS CodeStar 连接，然后指定**存储库**、**分支**和**模板文件路径**。

1. 选择**下一步**。

1. 在查看并提交页面上，验证连接详细信息，然后选择**将产品连接到外部存储库**。

## 查看 Git 同步产品连接
<a name="view-repo-sync"></a>

您可以使用 AWS Service Catalog 控制台、API 或 AWS CLI 来查看存储库连接的详细信息。对于链接到模板文件的 AWS Service Catalog 产品，您可以从 “上次**同步状态” 中检索有关存储库连接以及模板上次与产品同步**的时间的信息。

**注意**  
您可以在产品级别查看存储库信息和**上次同步状态**。用户必须在中拥有 IAM 权限 CodeConnections APIs 才能查看存储库的详细信息。有关这些 IAM [权限所需策略的更多信息，请参阅将 AWS Service Catalog 产品同步到模板文件](#required-perms-synced-repo)所需的权限。

**要查看连接和存储库的详细信息，请使用 AWS 管理控制台**

1. 从左侧导航面板中，选择**产品列表**。

1. 从列表中选择产品。

1. 在**产品**页面上，导航至**产品源详细信息**部分。

1. 要查看产品版本的源代码修订 ID，请选择**上次创建的版本**链接。**版本详细信息**部分显示源代码修订 ID。

**要查看连接和存储库的详细信息，请使用 AWS CLI**

从中 AWS CLI，运行以下命令：

`$ aws servicecatalog describe-product-as-admin`

`$ aws servicecatalog describe-provisioning-artifact`

`$ aws servicecatalog search-product-as-admin`

`$ aws servicecatalog list-provisioning-artifacts`

## 更新 Git 同步产品连接
<a name="update-repo-sync"></a>

您可以使用 AWS Service Catalog 控制台、 AWS Service Catalog API 或更新现有账户连接和 Git 同步产品。 AWS CLI

要了解如何将现有 AWS Service Catalog 产品连接到模板文件，请参阅[创建新的 Git 同步产品](#create-synced-product)连接。

**要将现有产品更新为 Git 同步产品**

1. 在左侧的导航面板中，选择**产品列表**，然后选择以下选项之一：
   + 要更新**单个产品**，请选择该产品，导航至**产品源详细信息**部分，然后选择**编辑详细信息**。
   + 要更新**多个产品**，请选择**将产品连接到外部存储库**，选择最多十个产品，然后选择**下一步**。

1. 在**产品源详细信息**部分，执行以下更新：
   + 指定连接。
   + 指定存储库。
   + 指定分支。
   + 命名模板文件。

1. 选择**保存更改**。

**注意**  
对于尚未连接到外部存储库的产品，您可以在选择产品后使用产品信息页面顶部的提醒中显示的**连接到外部存储库**选项。

你也可以使用 AWS Service Catalog 控制台 AWS CLI 或 
+ 将现有 AWS Service Catalog 产品连接到外部存储库中的模板文件
+ 更新产品元数据，包括产品名称、描述和标签。
+ 重新配置（更新同步以使用其他存储库来源）先前连接 AWS Service Catalog 产品的连接。

**使用 AWS Service Catalog 控制台更新连接和存储库详细信息**

1. 在 AWS Service Catalog 控制台左侧导航面板**中，选择产品列表**，然后选择当前连接到外部存储库的产品。

1. 在**产品源详细信息**部分，选择**编辑产品源**。

1. 在**产品源详细信息**部分，指定新的所需存储库。

1. 选择**保存更改**。

**要更新连接和存储库的详细信息，请使用 AWS CLI**

从中 AWS CLI 运行`$ aws servicecatalog update-product`和`$ aws servicecatalog update-provisioning-artifact`命令。

## 删除 Git 同步产品连接
<a name="delete-repo-sync"></a>

您可以使用 AWS Service Catalog 控制台、 CodeConnections API 或删除 AWS Service Catalog 产品与模板文件之间的连接 AWS CLI。当您断开产品与模板文件的连接时，已同步 AWS Service Catalog 的产品会切换到常规管理的产品。断开产品连接后，如果模板文件更改并提交到先前连接的存储库中，则这些更改*不会*反映出来。要将 AWS Service Catalog 产品重新连接到外部存储库中的模板文件，请参阅[更新连接和同步 AWS Service Catalog]()产品。

**使用控制台断开 Git 同步产品的连接 AWS Service Catalog**

1. 在中 AWS 管理控制台，从左侧导航面板中选择 “**产品列表**”。

1. 从列表中选择产品。

1. 在**产品**页面上，导航至**产品源详细信息**部分。

1. 选择**断开连接**。

1. 确认操作，然后选择**断开连接**。

**要断开与 Git 同步产品的连接，请使用以下命令 AWS CLI**

从中 AWS CLI，运行`$ aws servicecatalog update-product`命令。在 `ConnectionParameters` 输入中，移除指定的连接。

**要使用 CodeConnections API 删除连接，或者 AWS CLI**

在 CodeConnections API 或中 AWS CLI，运行`$ aws codestar-connections delete-connection`命令。

## 将 Terraform 产品同步到来自 GitHub、Enterpr GitHub ise 或 Bitbucket 的模板文件
<a name="git-synced-Terraform"></a>

使用 Terraform 配置文件创建 Git 同步产品时，文件路径仅接受 tar.gz 格式。在文件路径中不能接受 Terraform 文件夹格式。

# AWS 区域 支持 Git 同步产品
<a name="git-sync-supported-regions"></a>

AWS Service Catalog 支持中 AWS 区域 与 Git 同步的产品，如下表所示。


****  

| AWS 区域 名字 | AWS 区域 身份 | 支持与 Git 同步的产品 | 
| --- | --- | --- | 
| 美国东部（弗吉尼亚州北部） | us-east-1 | 是 | 
| 美国东部（俄亥俄州） | us-east-2 | 是 | 
| 美国西部（北加利福尼亚） | us-west-1 | 是 | 
| 美国西部（俄勒冈州） | us-west-2 | 是 | 
| 非洲（开普敦） | af-south-1 | 否 | 
| 亚太地区（香港） | ap-east-1 | 否 | 
| 亚太地区（雅加达） | ap-southeast-3 | 否 | 
| 亚太地区（孟买） | ap-south-1 | 是 | 
| 亚太地区（大阪） | ap-northeast-3 | 否 | 
| 亚太地区（首尔） | ap-northeast-2 | 是 | 
| 亚太地区（新加坡） | ap-southeast-1 | 是 | 
| 亚太地区（悉尼） | ap-southeast-2 | 是 | 
| 亚太地区（东京） | ap-northeast-1 | 是 | 
| 加拿大（中部） | ca-central-1 | 是 | 
| 欧洲地区（法兰克福） | eu-central-1 | 是 | 
| 欧洲地区（爱尔兰） | eu-west-1 | 是 | 
| 欧洲地区（伦敦） | eu-west-2 | 是 | 
| 欧洲地区（米兰） | eu-south-1 | 否 | 
| 欧洲地区（巴黎） | eu-west-3 | 是 | 
| 欧洲地区（斯德哥尔摩） | eu-north-1 | 是 | 
| 中东（巴林） | me-south-1 | 否 | 
| 南美洲（圣保罗） | sa-east-1 | 是 | 
| AWS GovCloud （美国东部） | us-gov-east-1 | 否 | 
| AWS GovCloud （美国西部） | us-gov-west-1 | 否 | 

# 删除产品
<a name="productmgmt-delete"></a>

删除产品时， AWS Service Catalog 会从包含该产品的每个产品组合中删除所有产品版本。

AWS Service Catalog 允许您使用 AWS Service Catalog 控制台删除产品或 AWS CLI。要成功删除产品，您必须先取消关联该产品的所有资源。产品资源关联的示例包括产品组合关联 TagOptions、预算和服务操作。

**重要**  
 删除产品后，您无法将其恢复。

**使用 AWS Service Catalog 控制台删除产品**

1.  导航至**产品组合**页面，然后选择包含要删除的产品的产品组合。

1.  选择要删除的产品，然后选择产品窗格右上角的**删除**。

1. 对于*没有关联资源的*产品，请在文本框中输入删除，确认要**删除**的产品，然后选择**删除**。

   对于*关联资源的*产品，请继续执行步骤 4。

1. 在 “**删除产品**” 窗口中，查看 “**关联**” 表格，该表显示了该产品的所有关联资源。 AWS Service Catalog 当您删除产品时，会尝试解除这些资源的关联。

1. 在文本框中输入**删除**，确认您要删除该产品并删除其所有关联资源。

1. 选择**取消关联并删除**。

 AWS Service Catalog 如果无法解除所有产品资源的关联，则不会删除该产品。**删除产品**窗口会显示取消关联的失败次数以及每个失败的描述。有关在删除产品时解决资源取消关联失败问题的更多信息，请参阅下方的*删除产品时解决资源取消关联失败的问题*。

**Topics**
+ [使用删除商品 AWS CLI](product-delete-cli.md)
+ [解决删除产品时资源取消关联失败的问题](product-delete-exception.md)

# 使用删除商品 AWS CLI
<a name="product-delete-cli"></a>

AWS Service Catalog 允许您使用 [AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)(AWS CLI) 从您的产品组合中删除产品。 AWS CLI 是一款开源工具，可让您使用命令行外壳中的命令与 AWS 服务进行交互。 AWS Service Catalog 强制删除功能需要[AWS CLI 别名](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-alias.html)，这是您可以在中创建的快捷方式， AWS CLI 以缩短经常使用的命令或脚本。

## 先决条件
<a name="product-delete-cli-requirements"></a>
+ 安装和配置 AWS CLI。有关更多信息，请参阅[安装或更新最新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 和[配置基础知识](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html) 。请使用最低 AWS CLI 版本 1.11.24 或 2.0.0。
+ 删除产品 CLI 别名需要与 bash 兼容的终端和 JQ 命令行 JSON 处理器。有关安装命令行 JSON 处理器的更多信息，请参阅[下载 jq](https://stedolan.github.io/jq/download/)。
+ 创建 AWS CLI 别名以批处理 `Disassociation` API 调用，使您能够在单个命令中删除产品。

要成功删除产品，您必须先取消关联该产品的所有资源。产品资源关联的示例包括产品组合关联、预算、标签选项和服务操作。使用 CLI 删除产品时，CLI `force-delete-product` 别名允许您调用 `Disassociate` API 来取消关联任何会阻止 `DeleteProduct` API 的资源。这样可以避免为单独解除关联进行独立调用。

**注意**  
以下步骤中显示的文件路径可能会有所不同，具体取决于您用来执行这些操作的操作系统。

## 创建 AWS CLI 别名以删除 AWS Service Catalog 产品
<a name="product-delete-cli-alias"></a>

使用删除 AWS Service Catalog 产品时，CLI `force-delete-product` 别名允许您调用 `Disassociate` API 来取消关联任何会阻止该`DeleteProduct`调用的资源。 AWS CLI 

**在您的 AWS CLI 配置文件夹中创建`alias`文件**

1. 在 AWS CLI 控制台中，导航到配置文件夹。默认情况下，配置文件夹路径为 `~/.aws/`（Linux 或 macOS）或 `%USERPROFILE%\.aws\`（Windows）。

1. 使用文件导航或在首选终端中输入以下命令来创建名为 `cli` 的子文件夹：

   ```
                $ mkdir -p ~/.aws/cli
   ```

   生成的 `cli` 文件夹默认路径为 `~/.aws/cli/`（Linux 或 macOS）或 `%USERPROFILE%\.aws\cli`（Windows）。

1. 在新建的 `cli` 文件夹中，创建不带扩展名的名为 `alias` 的文本文件。您可以使用文件导航或在首选终端中输入以下命令来创建 `alias` 文件：

   ```
                 $ touch ~/.aws/cli/alias
   ```

1. 在第一行输入 `[toplevel]`。

1. 保存该文件。

接下来，您可以通过手动将 force-delete-product别名脚本粘贴到`alias`文件中，或者在终端窗口中使用命令来将别名添加到文件中。

**手动将 force-delete-product别名添加到您的`alias`文件中**

1. 在 AWS CLI 控制台中，导航到您的 AWS CLI 配置文件夹并打开该`alias`文件。

1. 在文件的 `[toplevel]` 行下方输入以下代码别名：

   ```
                [command servicecatalog]
             	 force-delete-product =
             	   !f() {
             	     if [ "$#" -ne 1 ]; then
             	         echo "Illegal number of parameters"
             	         exit 1
             	     fi
             	 
             	     if [[ "$1" != prod-* ]]; then
             	        echo "Please provide a valid product id."
             	        exit 1
             	     fi
             	 
             	     productId=$1
             	     describeProductAsAdminResponse=$(aws servicecatalog describe-product-as-admin --id $productId)
             	     listPortfoliosForProductResponse=$(aws servicecatalog list-portfolios-for-product --product-id $productId)
             	 
             	     tagOptions=$(echo "$describeProductAsAdminResponse" | jq -r '.TagOptions[].Id')
             	     budgetName=$(echo "$describeProductAsAdminResponse" | jq -r '.Budgets[].BudgetName')
             	     portfolios=$(echo "$listPortfoliosForProductResponse" | jq -r '.PortfolioDetails[].Id')
             	     provisioningArtifacts=$(echo "$describeProductAsAdminResponse" | jq -r '.ProvisioningArtifactSummaries[].Id')
             	     provisioningArtifactServiceActionAssociations=()
             	 
             	     for provisioningArtifactId in $provisioningArtifacts; do
             	       listServiceActionsForProvisioningArtifactResponse=$(aws servicecatalog list-service-actions-for-provisioning-artifact --product-id $productId --provisioning-artifact-id $provisioningArtifactId)
             	       serviceActions=$(echo "$listServiceActionsForProvisioningArtifactResponse" | jq -r '[.ServiceActionSummaries[].Id] | join(",")')
             	       if [[ -n "$serviceActions" ]]; then
             	         provisioningArtifactServiceActionAssociations+=("${provisioningArtifactId}:${serviceActions}")
             	       fi
             	     done
             	 
             	     echo "Before deleting a product, the following associated resources must be disassociated. These resources will not be deleted. This action may take some time, depending on the number of resources being disassociated."
             	 
             	     echo "Portfolios:"
             	     for portfolioId in $portfolios; do
             	       echo "\t${portfolioId}"
             	     done
             	 
             	     echo "Budgets:"
             	     if [[ -n "$budgetName" ]]; then
             	       echo "\t${budgetName}"
             	     fi
             	 
             	     echo "Tag Options:"
             	     for tagOptionId in $tagOptions; do
             	       echo "\t${tagOptionId}"
             	     done
             	 
             	     echo "Service Actions on Provisioning Artifact:"
             	     for association in "${provisioningArtifactServiceActionAssociations[@]}"; do
             	       echo "\t${association}"
             	     done
             	 
             	     read -p "Are you sure you want to delete ${productId}? y,n "
             	     if [[ ! $REPLY =~ ^[Yy]$ ]]; then
             	        exit
             	     fi
             	 
             	     for portfolioId in $portfolios; do
             	       echo "Disassociating ${portfolioId}"
             	       aws servicecatalog disassociate-product-from-portfolio --product-id $productId --portfolio-id $portfolioId
             	     done
             	 
             	     if [[ -n "$budgetName" ]]; then
             	       echo "Disassociating ${budgetName}"
             	       aws servicecatalog disassociate-budget-from-resource --budget-name "$budgetName" --resource-id $productId
             	     fi
             	 
             	     for tagOptionId in $tagOptions; do
             	       echo "Disassociating ${tagOptionId}"
             	       aws servicecatalog disassociate-tag-option-from-resource --tag-option-id $tagOptionId --resource-id $productId
             	     done
             	 
             	     for association in "${provisioningArtifactServiceActionAssociations[@]}"; do
             	       associationPair=(${association//:/ })
             	       provisioningArtifactId=${associationPair[0]}
             	       serviceActionsList=${associationPair[1]}
             	       serviceActionIds=${serviceActionsList//,/ }
             	       for serviceActionId in $serviceActionIds; do
             	         echo "Disassociating ${serviceActionId} from ${provisioningArtifactId}"
             	         aws servicecatalog disassociate-service-action-from-provisioning-artifact --product-id $productId --provisioning-artifact-id $provisioningArtifactId --service-action-id $serviceActionId
             	       done
             	     done
             	 
             	     echo "Deleting product ${productId}"
             	     aws servicecatalog delete-product --id $productId
             	 
             	   }; f
   ```

1. 保存该文件。

**使用终端窗口将 force-delete-product别名添加到您的`alias`文件中**

1. 打开终端窗口，并运行以下命令

   `$ cat >> ~/.aws/cli/alias`

1. 将别名脚本粘贴到终端窗口，然后按 *CTRL\$1D* 退出 `cat` 命令。

**给 force-delete-product别名打电话**

1. 在设备上的终端窗口中运行以下命令以调用删除产品别名

   `$ aws servicecatalog force-delete-product {product-id} `

   下面的示例展示了 `force-delete-product` 别名命令及其生成的响应 

   ```
                 $ aws servicecatalog force-delete-product prod-123
   ```

   ```
                 Before deleting a product, the following associated resources must be disassociated. These resources will not be deleted. This action may take some time, depending on the number of resources being disassociated.
                 Portfolios:
                   port-123
                 Budgets:
                     budgetName
                 Tag Options:
                     tag-123
                 Service Actions on Provisioning Artifact:
                     pa-123:act-123
                 Are you sure you want to delete prod-123? y,n
   ```

1. 输入 `y` 以确认您要删除产品。

成功删除产品后，终端窗口将显示如下结果

```
          Disassociating port-123
          Disassociating budgetName
          Disassociating tag-123
          Disassociating act-123 from pa-123
          Deleting product prod-123
```

## 其他资源
<a name="product-delete-cli-resources"></a>

有关 AWS CLI使用别名和删除 AWS Service Catalog 产品的更多信息，请查看以下资源：
+ 在 *AWS Command Line Interface (CLI)* 用户指南中@@ [创建和使用 AWS CLI 别名](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-alias.html)。
+ [AWS CLI 别名存储库](https://github.com/awslabs/awscli-aliases) git 存储库。
+ [删除 AWS Service Catalog 产品](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/productmgmt-delete.html)。
+ [AWS re: Invent 2016：《有效用户》开启 AWS CLI 。*YouTube*](https://youtu.be/Xc1dHtWa9-Q?t=1593)

# 解决删除产品时资源取消关联失败的问题
<a name="product-delete-exception"></a>

如果由于资源解除关联异常而导致您之前尝试[删除产品](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/productmgmt-delete.html)失败，请查看下面的异常列表及其解决方案。

**注意**  
如果您在收到资源解除关联失败消息之前关闭了**删除产品**窗口，则可以按照后续*删除产品*部分中的步骤一至三再次打开该窗口。

**要解决资源解除关联失败的问题**

在**删除产品**窗口中，查看关联表的**状态**列。确定失败的资源解除关联异常和建议解决方案：


****  

| 状态异常类型 | 原因 | 解决方案 | 
| --- | --- | --- | 
| Product prod-\$1\$1\$1\$1 | AWS Service Catalog 无法删除产品，因为产品仍有关联的预算 TagOptions，至少有一个ProvisioningArtifact与之关联的操作，产品仍分配给产品组合，产品有用户，或者产品有约束条件。 | 再次尝试删除产品。 | 
| 用户：username 未获得授权执行： | 尝试删除产品的用户没有取消关联产品资源的必要权限。 | AWS Service Catalog 建议联系您的账户管理员，了解有关取消关联您当前无权取消关联的产品资源的更多信息。 | 

# 管理版本
<a name="managing-versions"></a>

 您可以在创建产品时分配产品版本，并且您可以随时更新产品版本。

 版本包含 CloudFormation 模板、标题、描述、状态和指南。

## 版本状态
<a name="version-status"></a>

 一个版本可以有三种状态之一：
+  **活动** - 活动版本出现在版本列表中，并允许用户启动该版本。
+  **非活动** - 非活动版本从版本列表中隐藏。从此版本启动的现有预配置产品不会受到影响。
+  **已删除** - 被删除的某个版本将从版本列表中删除。删除版本的操作无法撤消。

## 版本指南
<a name="version-guidance"></a>

 您可以设置版本指南，以便向最终用户提供有关产品版本的信息。版本指南仅影响活动的产品版本。

 版本指南有两个选项：
+  **无** - 默认情况下，产品版本没有任何指导。最终用户可以使用该版本更新和启动预配置产品。
+  **已淘汰**-用户无法使用已淘汰的产品版本启动新的预配置产品。如果之前启动的预配置产品使用的是现已淘汰的版本，则用户只能使用现有版本或新版本更新该预配置产品。

## 更新版本
<a name="updating-versions"></a>

 您可以在创建产品时分配产品版本，也可以随时更新版本。有关创建产品的更多信息，请参阅[创建产品](productmgmt-cloudresource.md)。

**更新产品版本**

1.  在 AWS Service Catalog 控制台中，选择 “**产品**”。

1.  从产品列表中，选择要更新其版本的产品。

1.  在**产品详细信息**页面上，选择**版本**选项卡，然后选择要更新的版本。

1.  在**版本详细信息**页面上，编辑产品版本，然后选择**保存更改**。