本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 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
文件
-
在 AWS CLI 控制台中,导航到配置文件夹。默认情况下,配置文件夹路径为
~/.aws/
(Linux 或 macOS)或%USERPROFILE%\.aws\
(Windows)。 -
使用文件导航或在首选终端中输入以下命令来创建名为
cli
的子文件夹:$ mkdir -p ~/.aws/cli
生成的
cli
文件夹默认路径为~/.aws/cli/
(Linux 或 macOS)或%USERPROFILE%\.aws\cli
(Windows)。 -
在新建的
cli
文件夹中,创建不带扩展名的名为alias
的文本文件。您可以使用文件导航或在首选终端中输入以下命令来创建alias
文件:$ touch ~/.aws/cli/alias
-
在第一行输入
[toplevel]
。 -
保存该文件。
接下来,您可以通过手动将 force-delete-product 别名脚本粘贴到alias
文件中,或者在终端窗口中使用命令来将别名添加到文件中。
手动将 force-delete-product 别名添加到您的alias
文件中
-
在 AWS CLI 控制台中,导航到您的 AWS CLI 配置文件夹并打开
alias
文件。 -
在文件的
[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
-
保存该文件。
使用终端窗口将 force-delete-product 别名添加到alias
文件中
-
打开终端窗口,并运行以下命令
$ cat >> ~/.aws/cli/alias
-
将别名脚本粘贴到终端窗口,然后按 CTRL+D 退出
cat
命令。
给 force-delete-product 别名打电话
-
在设备上的终端窗口中运行以下命令以调用删除产品别名
$ 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
-
输入
y
以确认您要删除产品。
成功删除产品后,终端窗口将显示如下结果
Disassociating port-123 Disassociating budgetName Disassociating tag-123 Disassociating act-123 from pa-123 Deleting product prod-123
其他资源
有关 AWS CLI 和使用别名和删除 AWS Service Catalog 产品的更多信息,请查看以下资源:
-
AWS Command Line Interface (CLI) 用户指南中的创建和使用 AWS CLI 别名。
-
AWS CLI别名存储库
git 存储库。