使用 AWS CLI 删除产品 - AWS Service Catalog

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

使用 AWS CLI 删除产品

AWS Service Catalog 允许您使用 AWS Command Line Interface(AWS CLI) 从您的产品组合中删除产品。AWS CLI 是一种开源工具,让您能够在命令行 Shell 中使用命令与 AWS 服务进行交互。AWS Service Catalog 的强制删除功能需要 AWS CLI 别名,这是您可以在 AWS CLI 中创建的、用于缩短您常用的命令和脚本的快捷方式。

先决条件

  • 安装和配置 AWS CLI。有关更多信息,请参阅安装或更新最新版本的 AWS CLI配置基础知识 。使用最低 AWS CLI 版本 1.11.24 或 2.0.0。

  • 删除产品 CLI 别名需要与 bash 兼容的终端和 JQ 命令行 JSON 处理器。有关安装命令行 JSON 处理器的更多信息,请参阅下载 jq

  • 借助创建 AWS CLI 别名以批处理 Disassociation API 调用,您能够使用单个命令删除产品。

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

注意

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

创建 AWS CLI 别名以删除 AWS Service Catalog 产品

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

在 AWS CLI 配置文件夹中创建 alias 文件
  1. 在 AWS CLI 控制台中,导航到配置文件夹。默认情况下,配置文件夹路径为 ~/.aws/(Linux 或 macOS)或 %USERPROFILE%\.aws\ (Windows)。

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

    $ mkdir -p ~/.aws/cli

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

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

    $ touch ~/.aws/cli/alias
  4. 在第一行输入 [toplevel]

  5. 保存该文件。

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

手动将 force-delete-product 别名添加到您的alias文件中
  1. 在 AWS CLI 控制台中,导航到您的 AWS CLI 配置文件夹并打开 alias 文件。

  2. 在文件的 [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
  3. 保存该文件。

使用终端窗口将 force-delete-product 别名添加到alias文件中
  1. 打开终端窗口,并运行以下命令

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

  2. 将别名脚本粘贴到终端窗口,然后按 CTRL+D 退出 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 
                
  2. 输入 y 以确认您要删除产品。

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

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

其他资源

有关 AWS CLI 和使用别名和删除 AWS Service Catalog 产品的更多信息,请查看以下资源: