使用 AWS CLI 的 cloudcontrol update-resource 更新云资源属性:JSON Patch 补丁文档实战指南
2026/9/15 16:23:36 网站建设 项目流程

使用 AWS CLI 的 cloudcontrol update-resource 更新云资源属性:JSON Patch 补丁文档实战指南

【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli

本文以 AWS CLI 官方示例 update-resource.rst 为核心,详细讲解如何通过aws cloudcontrol update-resource命令更新现有 AWS 资源的属性。你将掌握 Cloud Control API 的更新调用方式、RFC 6902 JSON Patch 补丁文档的编写规则、异步操作进度事件(ProgressEvent)的解读方法,以及如何结合get-resource-request-statuswait子命令与get-resource完成一次完整、可验证的资源更新流程。

一、update-resource 命令的定位与适用场景

AWS Cloud Control API 提供了一套统一、标准化的资源管理接口,允许开发者通过一致的方式对 100 多种 AWS 服务资源进行创建、读取、更新、删除和列表(CRUDL)操作。它对应的 CLI 子命令组就是aws cloudcontrol,本仓库中完整收录了该服务组的全部官方示例,位于 awscli/examples/cloudcontrol/,包括:

  • create-resource.rst:创建资源
  • get-resource.rst:读取资源当前状态
  • update-resource.rst:更新资源属性(本文主题)
  • delete-resource.rst:删除资源
  • list-resources.rst:列举某类型资源
  • get-resource-request-status.rst:查询资源操作请求状态
  • list-resource-requests.rst:列举资源操作请求

update-resource在其中的职责非常明确:对已经存在的资源,按需修改其一个或多个属性。与直接调用各服务专有命令(如aws logs put-retention-policy)不同,Cloud Control API 的更新路径是统一的——你不需要记住每个服务的更新命令,只需掌握「类型名 + 标识符 + JSON Patch 补丁文档」这一套通用范式即可。

二、官方示例:更新 LogGroup 的保留策略

以下是仓库中 update-resource.rst 的完整示例,它演示了如何把名为ExampleLogGroupAWS::Logs::LogGroup资源的保留天数更新为 90 天:

aws cloudcontrol update-resource \ --type-name AWS::Logs::LogGroup \ --identifier ExampleLogGroup \ --patch-document "[{\"op\":\"replace\",\"path\":\"/RetentionInDays\",\"value\":90}]"

命令返回的典型输出如下:

{ "ProgressEvent": { "EventTime": "2021-08-09T18:17:15.219Z", "TypeName": "AWS::Logs::LogGroup", "OperationStatus": "IN_PROGRESS", "Operation": "UPDATE", "Identifier": "ExampleLogGroup", "RequestToken": "5f40c577-3534-4b20-9599-0b0123456789" } }

从输出中可以看出几个关键事实:

  1. 更新操作是异步的:返回时OperationStatusIN_PROGRESS,而非SUCCESS,说明请求已被接收并进入执行阶段;
  2. 每个请求都有唯一的RequestToken:它是后续查询该操作进度的凭证;
  3. Operation固定为UPDATE:表明这是一次更新类资源操作。

三、请求参数详解

根据服务模型 service-2.json 中UpdateResourceInput的定义,该命令共有 6 个参数,其中 3 个为必填:

参数必填说明
--type-name资源类型名称,例如AWS::Logs::LogGroupAWS::Kinesis::Stream
--identifier资源的标识符,可以是主标识符,也可以是资源 schema 中定义的任意二级标识符(一次只能指定一个)
--patch-document描述待应用属性变更的 JSON Patch 文档(详见下一节)
--type-version-id对私有资源类型,指定本次操作使用的类型版本;不指定时使用默认版本
--role-arnCloud Control API 执行本次操作时所使用的 IAM 角色 ARN;不指定时使用基于你 AWS 用户凭证创建的临时会话
--client-token幂等令牌,用于区分请求重试与新请求;令牌自使用起 36 小时内有效,超过后相同令牌会被当作新请求

3.1 关于 --identifier 的两种形态

服务模型对Identifier给出了精确定义:主标识符可以以字符串或 JSON 形式指定;二级标识符必须以 JSON 形式指定。对于由多个属性拼接而成的复合主标识符,若要以字符串形式指定,需要按照主标识符定义中的属性顺序列出各属性值,并以|分隔。

在本文示例中,ExampleLogGroupAWS::Logs::LogGroup的简单主标识符,直接以字符串形式传入即可。

3.2 --patch-document 的底层约束

模型中的PatchDocumentshape(service-2.json)明确规定了该参数的边界:

  • 长度约束:最少 1 个字符,最多 262144 字符(256K)
  • 敏感字段:该参数被标记为sensitive,意味着在调试日志、历史记录中会被遮蔽处理。

四、JSON Patch 补丁文档:变更的表达语言

--patch-document是本次更新的核心参数。Cloud Control API 要求其内容遵循RFC 6902(JavaScript Object Notation (JSON) Patch)标准——这一点在服务模型UpdateResource的文档说明中有明确交代。简而言之,补丁文档是一个由若干「补丁操作」组成的 JSON 数组,每个操作对象通常包含三个字段:

  • op:操作类型,标准定义了六种:add(添加)、remove(移除)、replace(替换)、move(移动)、copy(复制)、test(测试);
  • path:指向资源属性 JSON 结构中目标位置的 JSON 指针表达式(以/开头,按层级逐级定位);
  • value:新值(replaceaddcopy等操作需要提供)。

本文示例使用的正是最常用的replace操作:

[{"op":"replace","path":"/RetentionInDays","value":90}]

其含义是:将资源属性中/RetentionInDays路径上的值替换为90。这里有一个容易被忽略的细节:value是数值90(不带引号),如果写成字符串"90",部分资源类型可能因类型不匹配而在 handler 阶段校验失败。

需要说明的是,并非所有资源属性都允许更新。服务模型中的HandlerErrorCode枚举(service-2.json)包含了NotUpdatable错误码,即「指定资源不支持该更新操作」——当补丁文档试图修改只读属性或资源类型本身不支持更新时,操作将以此错误码失败。

五、异步操作模型:理解 ProgressEvent

update-resource返回的是一个ProgressEvent结构(service-2.json),它代表资源操作请求的当前状态。其字段包括:

字段说明
TypeName本次操作涉及的资源类型
Identifier资源的主标识符(注意:某些场景下资源操作尚未达到SUCCESS时标识符就可能已可用)
RequestToken唯一标识本次资源操作请求的令牌,是查询进度的关键
HooksRequestToken与本次请求关联的 Hooks 操作的令牌
Operation资源操作类型
OperationStatus操作当前状态(详见下文)
EventTime资源操作请求发起的时间
ResourceModel包含资源各属性当前值的 JSON 字符串
StatusMessage解释当前状态的任意消息
ErrorCode状态为FAILED时对应的错误码(即HandlerErrorCode
RetryAfter建议的下一次状态查询时间

5.1 Operation 与 OperationStatus 的合法取值

服务模型中Operation枚举只有三个取值:CREATEDELETEUPDATE。而OperationStatus则有六个状态,构成了完整的异步生命周期:

状态含义
PENDING资源操作尚未开始
IN_PROGRESS资源操作正在执行
SUCCESS资源操作已成功完成
FAILED资源操作失败,需查看ErrorCodeStatusMessage
CANCEL_IN_PROGRESS资源操作正在被取消
CANCEL_COMPLETE资源操作已被取消

RequestToken的格式约束为[-A-Za-z0-9+/=]+,长度 1 到 128 个字符(service-2.json)。

六、跟踪更新进度:从轮询到自动等待

由于update-resource是异步的,你需要主动确认更新最终是否成功。

6.1 使用 get-resource-request-status 轮询

将返回的RequestToken传入 get-resource-request-status.rst 所示的命令,即可查询该请求的最新状态:

aws cloudcontrol get-resource-request-status \ --request-token "5f40c577-3534-4b20-9599-0b0123456789"

当更新失败时,返回内容会包含详细的错误信息。仓库示例给出了一个失败场景的典型返回,其中OperationStatusFAILEDStatusMessage明确说明失败原因,ErrorCodeAlreadyExists

{ "ProgressEvent": { "TypeName": "AWS::Kinesis::Stream", "Identifier": "Demo", "RequestToken": "e1a6b86e-46bd-41ac-bfba-001234567890", "Operation": "CREATE", "OperationStatus": "FAILED", "EventTime": 1632950268.481, "StatusMessage": "Resource of type 'AWS::Kinesis::Stream' with identifier 'Demo' already exists.", "ErrorCode": "AlreadyExists" } }

6.2 使用 list-resource-requests 批量筛选

如果你需要排查一段时间内失败的更新请求,可以参考 list-resource-requests.rst 的用法,通过--resource-request-status-filter按操作类型与状态筛选,例如筛选所有CREATEUPDATE中失败的请求:

aws cloudcontrol list-resource-requests \ --resource-request-status-filter Operations=CREATE,OperationStatuses=FAILED

6.3 使用 wait 子命令自动等待

本仓库的 waiters-2.json 为 cloudcontrol 服务组定义了名为ResourceRequestSuccess的等待器,其底层实现细节如下:

  • 轮询操作:GetResourceRequestStatus
  • 轮询间隔(delay):5 秒;
  • 最大尝试次数(maxAttempts):24 次(即最长约 2 分钟);
  • 成功条件:ProgressEvent.OperationStatus等于SUCCESS
  • 失败条件:状态等于FAILEDCANCEL_COMPLETE

因此,你可以在发起更新后直接使用等待器阻塞等待结果:

aws cloudcontrol wait resource-request-success \ --request-token "5f40c577-3534-4b20-9599-0b0123456789"

该命令会在操作达到SUCCESS时正常退出(返回码 0),在FAILEDCANCEL_COMPLETE时以非零退出码结束。

七、更新后验证:读取资源当前状态

更新完成后,最直接的验证方式是用 get-resource.rst 读取资源的当前属性。仓库示例展示了AWS::Kinesis::Stream的读取结果,其中Properties是以 JSON 字符串形式返回的资源模型:

aws cloudcontrol get-resource \ --type-name AWS::Kinesis::Stream \ --identifier ResourceExample
{ "TypeName": "AWS::Kinesis::Stream", "ResourceDescription": { "Identifier": "ResourceExample", "Properties": "{\"Arn\":\"arn:aws:kinesis:us-west-2:099908667365:stream/ResourceExample\",\"RetentionPeriodHours\":168,\"Name\":\"ResourceExample\",\"ShardCount\":3}" } }

对应到 LogGroup 场景,更新完成后你可以通过aws cloudcontrol get-resource --type-name AWS::Logs::LogGroup --identifier ExampleLogGroup确认RetentionInDays是否已变为 90。同理,list-resources.rst 可用于列举某一类型下的全部资源:

aws cloudcontrol list-resources \ --type-name AWS::Kinesis::Stream

八、完整实践流程与注意事项

综合以上内容,一次规范的资源更新操作应遵循如下流程:

  1. 构造补丁文档:确认目标属性的 JSON 路径与合法操作类型(建议replace),注意数值属性不要加引号;
  2. 发起更新:调用update-resource,记录返回的RequestToken
  3. 等待完成:调用cloudcontrol wait resource-request-success(自动轮询,间隔 5 秒、最多 24 次)或手动循环调用get-resource-request-status
  4. 验证结果:用get-resource读取资源属性,确认变更生效;若失败,结合StatusMessageErrorCode定位原因。

实践中有几个容易踩坑的点:

  • 补丁文档大小上限 256KPatchDocumentProperties均被服务模型约束为最长 262144 字符,超大属性集合需拆分处理;
  • 更新后的EventTimeRetryAfter:若返回RetryAfter,应据此安排下一次轮询时间,避免频繁请求触发限流(HandlerErrorCode中的Throttling即与此相关);
  • 幂等与重试:网络异常导致的请求重试建议携带相同的--client-token(36 小时内有效),以便服务端去重;
  • NotUpdatable错误:部分属性(如只读属性)无法通过补丁更新,遇到该错误码应检查资源类型 schema 中handlersupdate的支持范围;
  • 敏感字段遮蔽PatchDocument被标记为sensitive,在 CLI 的调试输出与历史记录中不会明文显示,排查问题时可借助--debug之外的服务端返回信息。

九、小结

aws cloudcontrol update-resource的价值在于用「类型名 + 标识符 + JSON Patch」的统一范式替代各服务千差万别的专有更新命令。本文结合仓库中的官方示例 update-resource.rst 与服务模型 service-2.json,完整覆盖了参数语义、RFC 6902 补丁文档编写、异步ProgressEvent解读、状态跟踪与等待策略,以及更新后的验证方法。掌握这套流程后,你可以将同一种更新模式平滑应用到 Cloud Control API 所支持的任何资源类型上。如需深入理解各操作的错误码语义,可进一步查阅服务模型中的HandlerErrorCode枚举定义。

【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询