使用 AWS CLIcloudcontrol delete-resource删除云资源完整实战指南【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli导读本文围绕 AWS CLI 内置的cloudcontrol delete-resource命令展开以 delete-resource.rst 中的官方示例为骨架结合当前仓库中 Cloud Control API 的服务模型service-2.json、分页配置paginators-1.json与等待器配置waiters-2.json进行源码级解读。读完本文你将掌握如何通过一条命令删除任意受 Cloud Control API 支持的标准或私有资源类型、如何解读返回的ProgressEvent、如何跟踪删除进度直至成功以及删除操作涉及的参数约束、幂等机制与常见错误处理。一、cloudcontrol delete-resource是什么aws cloudcontrol delete-resource是 AWS CLI 中 Cloud Control API服务端模型位于 awscli/botocore/data/cloudcontrol/2021-09-30/提供的删除命令。与传统的按服务拆分的aws ec2 delete-*、aws s3api delete-*命令不同它提供的是统一资源操作入口只要某个资源类型注册到了 CloudFormation包括 AWS 公开资源类型和你在本地开发的私有类型就可以用同一套参数格式删除它而无需为每个服务记住各自的 CLI 语法。从服务模型看Cloud Control API 共有 8 个操作操作用途CreateResource创建资源DeleteResource删除资源本文主题UpdateResource更新资源GetResource读取资源当前状态GetResourceRequestStatus查询某次资源操作请求的进度ListResourceRequests列出历史资源操作请求ListResources列出某类型下的资源CancelResourceRequest取消进行中的请求删除操作在服务模型中的定义为POST /其方法文档明确说明发起删除请求后应使用返回的ProgressEvent.RequestToken调用GetResourceRequestStatus来监控请求进度见 service-2.json 中DeleteResource与DeleteResourceOutput的documentation字段。这说明删除是一个异步操作命令返回时资源往往尚未删除完成这只是“删除请求已受理”的确认。二、官方示例与输出解读仓库中的 delete-resource.rst 给出了唯一一个官方示例删除名为ResourceExample的AWS::Kinesis::Stream资源。aws cloudcontrol delete-resource \ --type-name AWS::Kinesis::Stream \ --identifier ResourceExample输出如下{ ProgressEvent: { TypeName: AWS::Kinesis::Stream, Identifier: ResourceExample, RequestToken: e48f26ff-d0f9-4ab8-a878-120db1edf111, Operation: DELETE, OperationStatus: IN_PROGRESS, EventTime: 1632950300.14 } }这个示例虽然只有两行参数却体现了删除命令的最小可用形态--type-name指定资源类型--identifier指定要删除的具体资源。返回的ProgressEvent说明删除请求已经受理OperationStatus: IN_PROGRESS需要凭RequestToken继续跟踪。参数--type-name与--identifier根据服务模型DeleteResourceInput的required字段这两个参数均为必填且各自有严格约束--type-name资源类型名称例如AWS::Kinesis::Stream。底层 shapeTypeName规定其长度 10196 字符且必须匹配正则[A-Za-z0-9]{2,64}::[A-Za-z0-9]{2,64}::[A-Za-z0-9]{2,64}即必须形如“命名空间::服务::类型”三段式。这也解释了为什么示例中写的是AWS::Kinesis::Stream而不是Kinesis::Stream。--identifier资源标识符。底层 shapeIdentifier允许 11024 个字符。它既可以是主标识符也可以是资源 schema 中定义的任意一个次标识符主标识符可以传字符串或 JSON而次标识符必须以 JSON 形式传入。对于由多个属性拼接而成的复合主标识符若以字符串传入需按主标识符定义中属性的顺序用|分隔各属性值。例如若某资源的主标识符由A、B两个属性复合而成那么字符串形式的标识符应形如A的值|B的值。输出ProgressEvent字段详解删除命令返回的ProgressEvent结构ProgressEventshape包含以下字段字段说明TypeName本次操作使用的资源类型名称Identifier资源的主标识符。注意在操作达到SUCCESS之前某些情况下资源标识符就已可用RequestToken本次资源操作请求的唯一令牌用于调用GetResourceRequestStatus查询进度HooksRequestToken与本次请求关联的 HooksCloudFormation Hook操作令牌Operation操作类型枚举值CREATE、DELETE、UPDATEOperationStatus操作状态见下文枚举说明EventTime请求发起时间Unix 时间戳ResourceModel以 JSON 字符串表示的资源模型各属性当前值StatusMessage对当前状态的补充说明ErrorCode当状态为FAILED时对应的错误码HandlerErrorCode枚举RetryAfter建议下次查询该请求状态的时间OperationStatus共有 6 种取值OperationStatusshape 枚举状态含义PENDING请求尚未开始执行IN_PROGRESS请求正在执行中SUCCESS请求已成功完成FAILED请求失败可参考ErrorCode与StatusMessageCANCEL_IN_PROGRESS请求正在被取消CANCEL_COMPLETE请求已取消官方示例返回IN_PROGRESS正是删除异步语义的直接体现。三、删除是异步的如何跟踪到最终成功既然删除请求是异步的那么示例返回IN_PROGRESS之后应该怎么做服务模型给出了标准答案用ProgressEvent.RequestToken调用GetResourceRequestStatus。aws cloudcontrol get-resource-request-status \ --request-token e48f26ff-d0f9-4ab8-a878-120db1edf111GetResourceRequestStatus同样返回一个ProgressEvent此外还可能包含HooksProgressEvent其OperationStatus最终会推进到SUCCESS删除完成或FAILED删除失败。当状态为FAILED时ErrorCode字段会给出底层资源处理器返回的错误码可能的取值HandlerErrorCode枚举包括NotUpdatable、InvalidRequest、AccessDenied、NotFound、ResourceConflict、Throttling、ServiceLimitExceeded、NotStabilized、GeneralServiceException、ServiceInternalError、NetworkFailure、InternalFailure等。如果你需要处理多个删除请求还可以用ListResourceRequests按操作类型与状态过滤并借助仓库中的分页配置paginators-1.json使用--max-results与--starting-token分页遍历ResourceRequestStatusSummariesaws cloudcontrol list-resource-requests \ --resource-request-status-filter {Operations:[DELETE],OperationStatuses:[IN_PROGRESS]}用aws cloudcontrol wait实现阻塞等待AWS CLI 为 Cloud Control API 内置了一个等待器resource-request-success其定义在 waiters-2.json 中底层调用GetResourceRequestStatus每 5 秒轮询一次delay: 5最多尝试 24 次maxAttempts: 24即最长约 2 分钟当ProgressEvent.OperationStatus为SUCCESS时判定成功为FAILED或CANCEL_COMPLETE时判定失败。因此最简单的“删完再走”写法是TOKEN$(aws cloudcontrol delete-resource \ --type-name AWS::Kinesis::Stream \ --identifier ResourceExample \ --query ProgressEvent.RequestToken \ --output text) aws cloudcontrol wait resource-request-success \ --request-token $TOKEN第一条命令取出RequestToken第二条命令阻塞至删除完成或失败适合在脚本和 CI 流程中串行化地执行“删除资源 → 依赖其已删除的后续步骤”。四、高级参数幂等令牌、私有类型版本与 IAM 角色官方示例只用了两个必填参数但DeleteResourceInput还定义了三个可选参数用于生产环境下的更精细控制--client-token保证请求幂等底层 shapeClientToken长度 1128 字符匹配[-A-Za-z0-9/]且标记为idempotencyToken。作用是让 Cloud Control API 能区分“请求重试”与“新的请求”当你因网络超时等原因重试同一个删除请求时带上相同的ClientToken服务端就能识别出这是同一次操作避免重复执行。有效期为 36 小时超过后相同令牌的请求会被当作新请求处理。若省略系统会自动生成一个令牌。aws cloudcontrol delete-resource \ --type-name AWS::Kinesis::Stream \ --identifier ResourceExample \ --client-token $(uuidgen)--type-version-id删除私有类型的特定版本仅对私有资源类型有效指定本次操作使用该类型的哪个版本不指定时使用默认版本。底层 shapeTypeVersionId长度 1128 字符匹配[A-Za-z0-9-]。aws cloudcontrol delete-resource \ --type-name MyCompany::Widget::Gadget \ --type-version-id v1 \ --identifier {GadgetId: g-123}--role-arn指定执行删除操作使用的 IAM 角色底层 shapeRoleArn长度 202048 字符必须匹配arn:.:iam::[0-9]{12}:role/.即 IAM 角色 ARN 格式。该角色必须具备该资源类型在 schemahandlers段中声明的delete处理器所需权限。不指定时Cloud Control API 使用你的 AWS 用户凭证创建的临时会话执行操作。aws cloudcontrol delete-resource \ --type-name AWS::Kinesis::Stream \ --identifier ResourceExample \ --role-arn arn:aws:iam::123456789012:role/CloudControlDeleteRole五、删除失败时可能遇到的错误DeleteResource在服务模型中声明了多达 19 种异常其中删除场景下最常见的有异常典型触发场景ResourceNotFoundException--identifier指向的资源不存在TypeNotFoundException--type-name指定的资源类型未注册InvalidRequestException参数不符合约束如TypeName格式错误、标识符不是合法 JSON 等ConcurrentOperationException同一资源已有一个进行中的操作ResourceConflictException资源当前状态不允许删除例如仍被其他资源引用ClientTokenConflictException重复使用了处于有效期内的ClientToken发起不同请求AlreadyExistsException/NotUpdatableException资源状态与删除操作语义冲突ThrottlingException/ServiceLimitExceededException触发服务端限流或配额上限NetworkFailureException/ServiceInternalErrorException网络或服务端瞬时故障可重试InvalidCredentialsException提供的凭证或--role-arn角色权限不足删除请求受理后如果最终状态为FAILED则错误详情会通过ProgressEvent.ErrorCodeHandlerErrorCode枚举与StatusMessage返回可用于在脚本中做分支处理。六、实战一段完整的删除流程脚本综合以上内容一个生产可用的删除脚本可以这样组织set -euo pipefail TYPE_NAMEAWS::Kinesis::Stream IDENTIFIERResourceExample # 1. 发起删除捕获请求令牌 TOKEN$(aws cloudcontrol delete-resource \ --type-name $TYPE_NAME \ --identifier $IDENTIFIER \ --client-token del-$(date %s) \ --query ProgressEvent.RequestToken \ --output text) # 2. 轮询等待删除完成内置等待器5s 间隔最多 24 次 if aws cloudcontrol wait resource-request-success --request-token $TOKEN; then echo 资源 $IDENTIFIER 删除成功 else # 3. 失败时打印诊断信息 aws cloudcontrol get-resource-request-status --request-token $TOKEN exit 1 fi要点回顾用--query抽取ProgressEvent.RequestToken为后续轮询做准备用wait resource-request-success阻塞等待其轮询参数来自 waiters-2.json5 秒间隔、24 次上限失败时用get-resource-request-status复查ErrorCode与StatusMessage需要批量删除时配合ListResources/ListResourceRequests的分页参数遍历资源清单分页定义见 paginators-1.json。结语aws cloudcontrol delete-resource的价值在于“统一”无论AWS::Kinesis::Stream还是自定义私有类型删除入口与参数模型完全一致。理解其异步语义IN_PROGRESS→SUCCESS/FAILED、幂等令牌--client-token以及跟踪机制get-resource-request-statuswait resource-request-success就能在任何脚本中安全、可控地删除云资源。官方示例见 delete-resource.rst全部参数与枚举的权威定义见 service-2.json。【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考