

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

# 使用删除商品 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)