华为云用户手册

  • Stream数据结构 Stream是Redis 5.0引入的一种新数据类型,它是一个全新的支持多播的可持久化消息队列。 Redis Stream的结构示意图如图1所示,它是一个可持久化的数据结构,用一个消息链表,将所有加入进来的消息都串起来。 Stream数据结构具有以下特性: Stream中可以有多个消费者组。 每个消费组都含有一个Last_delivered_id,指向消费组当前已消费的最后一个元素(消息)。 每个消费组可以含有多个消费者对象,消费者共享消费组中的Last_delivered_id,相同消费组内的消费者存在竞争关系,即一个元素只能被其中一个消费者进行消费。 消费者对象内还维持了一个Pending_ids,Pending_ids记录已发送给客户端,但是还没完成ACK(消费确认)的元素id。 Stream与Redis其他数据结构的比较,见表1。 图1 Stream数据结构示意图 表1 Stream与Redis现有数据结构比较 比较项 Stream List、Pub/Sub、Zset 复杂度 获取元素高效,复杂度为O(logN) List获取元素的复杂度为O(N) offset 支持offset,每个消息元素有唯一id。不会因为新元素加入或者其他元素淘汰而改变id。 List没有offset概念,如果有元素被逐出,无法确定最新的元素 持久化 支持消息元素持久化,可以保存到AOF和RDB中。 Pub/Sub不支持持久化消息。 消费分组 支持消费分组 Pub/Sub不支持消费分组 消息确认 支持ACK(消费确认) Pub/Sub不支持 性能 Stream性能与消费者数量无明显关系 Pub/Sub性能与客户端数量正相关 逐出 允许按时间线逐出历史数据,支持block,给予radix tree和listpack,内存开销少。 Zset不能重复添加相同元素,不支持逐出和block,内存开销大。 删除元素 不能从中间删除消息元素。 Zset支持删除任意元素 Stream相关命令介绍 接下来按照使用流程中出现的顺序介绍Stream相关命令。详细命令见表2 首先使用XADD添加流元素,即创建Stream,添加流元素时可指定消息数量最大保存范围。 然后通过XGROUP创建消费者组。 消费者使用XREADGROUP指令进行消费。 客户端消费完毕后使用XACK命令确认消息已消费成功。 图2 Stream相关命令介绍 表2 Stream的详细命令 命令 说明 语法 XACK 从流的消费者组的待处理条目列表(简称PEL)中删除一条或多条消息。 XACK key group ID [ID ...] XADD 将指定的流条目追加到指定key的流中。 如果key不存在,作为运行这个命令的副作用,将使用流的条目自动创建key。 XADD key ID field string [field string ...] XCLAIM 在流的消费者组上下文中,此命令改变待处理消息的所有权, 因此新的所有者是在命令参数中指定的消费者。 XCLAIM key group consumer min-idle-time ID [ID ...] [IDLE ms] [TIME ms-unix-time] [RETRYCOUNT count] [FORCE] [JUSTID] XDEL 从指定流中移除指定的条目,并返回成功删除的条目的数量,在传递的ID不存在的情况下, 返回的数量可能与传递的ID数量不同。 XDEL key ID [ID ...] XGROUP 该命令用于管理流数据结构关联的消费者组。使用XGROUP你可以: 创建与流关联的新消费者组。 销毁一个消费者组。 从消费者组中移除指定的消费者。 将消费者组的最后交付ID设置为其他内容。 XGROUP [CREATE key groupname id-or-$] [SETID key id-or-$] [DESTROY key groupname] [DELCONSUMER key groupname consumername] XINFO 检索关于流和关联的消费者组的不同的信息。 XINFO [CONSUMERS key groupname] key key [HELP] XLEN 返回流中的条目数。如果指定的key不存在,则此命令返回0,就好像该流为空。 XLEN key XPENDING 通过消费者组从流中获取数据。检查待处理消息列表的接口,用于观察和了解消费者组中哪些客户端是活跃的,哪些消息在等待消费,或者查看是否有空闲的消息。 XPENDING key group [start end count] [consumer] XRANGE 返回流中满足给定ID范围的条目。 XRANGE key start end [COUNT count] XREAD 从一个或者多个流中读取数据,仅返回ID大于调用者报告的最后接收ID的条目。 XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...] XREADGROUP XREAD命令的特殊版本,指定消费者组进行读取。 XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...] XREVRANGE 与XRANGE相同,但显著的区别是以相反的顺序返回条目,并以相反的顺序获取开始-结束参数 XREVRANGE key end start [COUNT count] XTRIM XTRIM将流裁剪为指定数量的项目,如有需要,将驱逐旧的项目(ID较小的项目)。 XTRIM key MAXLEN [~] count 消息(流元素)消费确认 Stream与相比Pub/Sub,不仅增加消费分组模式,还支持消息消费确认。 当一条消息被某个消费者调用XREADGROUP命令读取或调用XCLAIM命令接管的时候, 服务器尚不确定它是否至少被处理了一次。 因此,一旦消费者成功处理完一条消息,它应该调用XACK知会Stream,这样这个消息就不会被再次处理, 同时关于此消息的PEL(pending_ids)条目也会被清除,从Redis服务器释放内存。 某些情况下,因为网络问题等,客户端消费完毕后没有调用XACK,这时候PEL内会保留对应的元素ID。待客户端重新连上后,XREADGROUP的起始消息ID建议设置为0-0,表示读取所有的PEL消息及自last_id之后的消息。同时,消费者消费消息时需要能够支持消息重复传递。 图3 ACK机制解读
  • 触发限流(流控)的原因和处理建议 Redis产生流控,说明redis在周期内的使用流量超过该实例规格的最大带宽。流控会导致连接被丢弃,从业务角度可能会造成业务的延迟增大,客户端连接异常等问题。 实例规格对应的最大带宽,可以查看实例规格中对应实例类型的“基准/最大带宽”。 带宽使用率不高时,也有可能有限流,因为带宽使用率是上报周期实时值,一个上报周期检查一次。而流控检查是秒级的,有可能存在上报周期间隔期间,流量有秒级冲高,然后回落,待上报带宽使用率指标时已恢复正常。 对于主备实例: 如果实例一直有流控但是带宽使用率不高,这说明可能存在业务微突发问题,或者大Key热Key问题,建议对实例进行自动诊断分析,优先排除大Key热Key问题。 如果带宽使用率居高不下,说明带宽可能存在超限风险,需要扩容处理(容量越大,带宽越大)。 对于集群实例: 仅有单个或少量几个分片出现流控,则多数为该分片存在大Key热Key问题。 所有或大多数分片同时出现流控或者带宽使用率高的问题,这说明实例的带宽达到了瓶颈,建议扩容实例。 D CS 控制台提供了大Key和热Key的分析功能,请参考分析Redis实例大Key和热Key减少大key和热key。 如果用户执行了keys等消耗资源的命令,也可能会导致CPU和带宽使用率增加,从而出现流控。 父主题: 监控告警
  • Lazy free机制 解决的痛点/问题 Redis是单线程程序,当运行一个耗时较大的请求时,会导致所有请求排队等待,在请求处理完成前,Redis不能响应其他请求,因此容易引发性能问题。而Redis删除大的集合键时,就属于一种比较耗时的请求。 原理 Redis 4.0提供的一种惰性删除或者说延迟释放机制,主要用于解决删除大key对Redis进程的阻塞,从而避免带来性能与可用性问题。 删除key时,Redis异步延时释放key的内存,把key释放操作放在bio(Background I/O)单独的子线程处理中。 使用方法 主动删除 unlink unlink与del命令目的一样,删除某个key。unlink在删除集合类键时,如果集合键的元素个数大于64个,会把内存释放操作,给单独的bio(Background I/O)线程来执行。因此unlink删除操作能在非常短的时间内完成包含上百万个元素的大key删除。 flushall/flushdb 通过对flushall/flushdb添加ASYNC异步清理选项,Redis在清理整个实例或单个DB时,操作都是异步的。 过期key删除、大key驱逐删除 被动删除有四种场景,每种场景对应一个配置参数,默认都是关闭: lazyfree-lazy-eviction no //针对redis内存使用达到maxmeory,并设置有淘汰策略时,是否采用lazy free机制lazyfree-lazy-expire no //针对设置有TTL的键,过期后,被redis清理删除时是否采用lazy free机制lazyfree-lazy-server-del no //针对有些指令在处理已存在的键时,会带有一个隐式的DEL键的操作slave-lazy-flush no //针对slave进行全量数据同步,slave在加载master的RDB文件前,会运行flushall来清理自己的数据场景
  • WebCli的常见报错 ERR Wrong number of arguments for 'xxx' command 该报错代表执行的Redis命令存在参数错误(语法错误),可以参考开源Redis命令协议介绍进行命令构造。 ERR unknown command 'xxx' 该报错代表此命令为未知命令或者非redis协议定义的合法命令,可以参考开源Redis命令协议介绍进行命令构造。 ERR Unsupported command: 'xxx' 该报错代表命令在DCS的Redis实例场景下禁用,可以参考支持和禁用的Web CLI命令。 父主题: Redis命令
  • 应用场景 企业业务快速成长,面临的挑战越来越多,对业务稳定可靠运行的需求越来越高。但设备故障、电力故障、人为损坏、火灾、自然灾害等突发事故会对业务的稳定运行造成巨大威胁,影响企业的正常运营,制约企业的发展,甚至可能给企业利益造成无法预估的损失。为了满足企业高可用的业务运行需求,企业应用多活部署已成为行业趋势。 多活高可用服务(Multi-Site High Availability Service,简称MAS)源自华为消费者多活应用高可用方案,提供从流量入口、数据到应用层的端到端的业务故障切换及容灾演练能力,保障故障场景下的业务快速恢复,提升业务连续性。 本手册基于一个GitHub上的商城应用改造实践,介绍如何基于MAS将应用改造为同城多活架构的过程。
  • 前提条件 进行应用改造需要提前完成的事项: 已开通MAS“同城多活”版本功能模块,功能点包括“MySQL”。具体详情请参见开通功能模块。 创建好“同城多活”类型的命名空间,分区类型选择“华为云”。具体详情请参见创建命名空间。 在已创建的命名空间下购买MAS多活管理中心,即创建好多活实例。具体详情请参见购买多活管理中心。 已在华为云购买RDS for MySQL两个数据库实例,且与MAS多活实例配置为相同VPC、子网、安全组,与多活实例网络互通;数据库实例需配置为相同的用户名和密码。 商城应用部署在已创建的命名空间下的可用区,且业务部署架构需要和MAS多活分区保持一致;与多活实例配置为相同VPC、子网、安全组,与多活实例网络互通。
  • 部署架构 图1 部署架构图 分布式微服务框架 采用华为云CSE服务,使用跨AZ高可靠实例,提供单元化场景下的微服务注册能力,核心功能包括: 支持微服务注册发现单元内亲和路由; 支持微服务注册发现机房内亲和路由; 支持跨单元注册,支持跨机房注册; 微服务注册中心,支持跨机房高可靠。 分布式消息 分布式消息使用华为云DMS-Kafka或者DMS-RocketMQ服务,部署使用跨AZ高可靠实例,具备单元化场景的容灾应急与自动容灾切换能力 分布式缓存 分布式缓存使用华云云DCS服务,部署使用夸AZ高可用,提供同城容灾能力。 父主题: 产品架构
  • 逻辑架构 单元化架构通过统一的切分规则,将应用层和数据层进行立体拆分,可以根据数据中心容量自由划分逻辑切片的多少,从而达到故障隔离、流量自治的目标。MAS异地多活单元化能力包括:逻辑单元和拓扑管理、单元化路由管理、业务流量治理,单元部署运维能力。 图1 异地多活单元 逻辑单元和拓扑管理: MAS支持逻辑单元拓扑管理。 逻辑单元流量指标展示。 单元化路由管理: 支持分配规则计算和自定义规则。 支持跨APIC集群的路由策略管理和请求转发,实现单元内和跨单元路由转发。 支持单元化流量标签生成。 支持单元化流量标传递。 支持单元间流量切换,包括基于预案形式的一键单元切换。 支持单元化架构下的容灾应急与容灾切换能力。 业务流量治理: 消息生产消费单元化治理,支持消息生产消费单元化治理,支持故障单元消息禁止生产/消费能力,支持消息跨集群同步能力。 数据层流量控制,根据路由策略路由数据到正确的数据分片;支持非本单元的路由分片的数据库访问禁写;支持单元流量切换过程进行数据层禁写。 单元化微服务流量管理,支持单元内微服务访问流量亲和,支持根据路由策略进行跨单元服务访问,支持单元化服务访问中心化服务。 单元部署运维能力: 单元化部署:ServiceStage根据MAS规划的单元,进行应用单元化部署。 单元化运维: AOM 支持单元化运维能力, APM 支持根据单元查看调用链能力。 父主题: 产品架构
  • 资源和成本规划 购买MAS多活管理中心及RDS for MySQL涉及到的资源和成本规划,如下表所示。 表1 资源和成本规划 资源 资源说明 数量 费用(元) 虚拟私有云VPC 创建一个虚拟私有云VPC 1 00.00 虚拟私有云子网 创建一个虚拟私有云子网 1 00.00 安全组 创建一个安全组 1 00.00 多活管理中心 创建MAS铂金版实例 1 20.00/小时 模块数量 MAS功能模块版本开通“同城多活” 功能点开通“MySQL” 1 100.00/天 云数据库RDS for MySQL 2核 4GB 数据库版本5.7 选择按需计费 2 2.04/小时 本文提供的成本预估费用仅供参考,资源的实际费用以华为云管理控制台显示为准。 父主题: 同城多活改造实践
  • SDK切换数据源测试 验证SDK提供的切换数据源功能,可在yaml直接配置当前活跃的数据源,使用之前已注册的“SDK-test”用户名进行登录验证。 切换数据源为ds2,切换配置如下: 切换后连接数据库为ds2,管理员表其对应用户数据如下: 使用“SDK-test”用户名和密码通过mall前端页面进行登录操作。 登录时提示用户名错误,无法登录,因为数据库ds2对应表中无“SDK-test”用户信息。 使用数据库ds2中其他已有用户名和密码进行登录。 可以登录成功。 结论:SDK切换数据库成功。
  • 创建MySQL监控 登录MAS控制台,在“多活管理”页面单击前提条件中已创建的多活实例,进入实例控制台。 在页面顶端导航栏选择“监控列表”,单击页面左上角的“新增监控”。 在新增监控页面配置MySQL监控基础配置,完成后单击“下一步:数据中心配置”。 表1 基础配置信息 参数 配置说明 监控 此处配置为“MySQL监控”。 应用名称 选择创建应用中已创建的应用。 监控器名称 自定义监控器名称。本实践配置为“litemall-db”。 异常通知设置 默认为“关”。若设置为“开”,当监控器或被监控的数据库异常时会及时给用户发送异常通知或告警通知。支持华为 云消息 通知服务,请先配置密钥。 通知主题 若异常通知设置选择“开”,则需要在通知主题列表选择主题,如无主题列表,单击新增,新增通知主题之后进行后续操作。 是否监控 默认“是”,选“否”则不会探测数据库异常情况。 是否自动切换 默认“是”,选“否”则不会自动切换数据库。 监控用户名 被监控数据库的用户名。 监控用户密码 被监控数据库的用户密码。 确认密码 再次填写监控用户密码。 DRS联动 本实践配置为“开”,关联DRS。请先配置密钥,再开启DRS联动。 多活分区 选择多活分区。多活分区为多活实例所归属的命名空间所创建的分区名称。 DRS任务 选择创建同步链路中已创建的DRS任务。 填写数据中心配置,分别配置数据中心1和数据中心2的信息,完成后单击“下一步:数据库配置”。 表2 数据中心配置信息 参数 配置说明 云选择 被监控的数据库部署的环境,本实践配置为“华为云”。 局点 被监控数据库所在区域,选择本实践命名空间所选择的区域。 IPv4地址 配置为前提条件中的两个RDS的访问地址和端口,并将创建同步链路中选择的源数据源地址配置为数据中心1的地址。 填写数据库配置,完成后单击“下一步:高级配置”。 表3 数据库配置信息 参数 配置说明 监控数据库 填写监控数据库名称。 连接数据库 填写连接数据库名称。 说明: “连接数据库”需要和“监控数据库”的值保持一致,且是被监控数据源中存在的数据库名。 填写高级配置,本实践使用默认参数即可,完成后单击“下一步:确认配置”。 确认配置无误后单击“立即创建”,完成创建MySQL监控。 单击刚创建好的MySQL监控器所在行的“连接池配置”,“路由算法”配置为“单边读写”。 单击“确定”,完成MySQL监控器连接池配置。 父主题: 实施步骤
  • 产品优势 将故障封闭在单元内,减少故障的影响范围。 基于单元化灵活的流量调配策略,其还可应用于单元级的全链路灰度发布、访问冷热不均场景。 将逻辑调用和数据访问在“单元”内形成闭环,只有少数特定场景的调用会跨单元访问,几乎大部分的请求在地域内就可以返回,极大程度地减少了访问耗时,避免了跨异地访问链路拥堵造成的服务夯死,提高了链路稳定性。 任意多个机房线性扩展,不仅提高了可用性,还能应对更大规模的流量的压力,扩展性强。 父主题: 单元化最佳实践
  • 应用场景 整个web系统发展经历了单体应用、分布式/微服务化、跨AZ高可用等几个阶段,这些阶段都会不可避免地触及到单点瓶颈。这里所说的“单点”,在系统的不同发展阶段表现不同。 单体应用:运行在虚拟机、物理机或者大规格虚拟机上。系统可靠性,一般小于99%,容量和性能依赖于单个虚拟机/物理机性能。 分布式/微服务化:一个单体应用划分为多个微服务,运行在虚拟机or容器基础之上。系统的可靠性依赖于AZ可靠性,一般小于99.9%。系统容量:可线性扩展,但受限于中间件能力。 跨AZ高可用:系统的特点是应用部署在Region内多AZ分布,可靠性依赖单Region可靠性,一般小于99.95%。系统容量:可线性扩展。 为了解决以上这些单点问题,多地多机房部署,是互联网系统的必然发展方向,一个系统要走到这一步,也就必然要解决上面提到的问题:流量调配、数据拆分、延时等。业界有很多技术方案可以用来解决这些问题,而承载这些方案的,是一个部署架构。尽管可采用的部署架构不止一个,但不论是纯理论研究,还是一些先行系统的架构实践,都把“单元化部署”推崇为最佳方案。 单元化架构,是异地多活的一种最佳实践,是从并行计算领域发展而来。在分布式服务设计领域,一个单元就是满足某个分区所有业务操作的自包含的安装。而一个分区(Shard),则是整体数据集的一个子集,如果你用尾号来划分用户,那同样尾号的那部分用户就可以认为是一个分区。单元化就是将一个服务设计改造,让其符合单元特征的过程,从而,将可靠性规格分解分配到可替换单元,当单元故障时,采用替换的方式快速恢复服务,秒级检测自愈,分钟级恢复,抗百倍过载等可靠性目标。
  • 状态码 正常 返回值 说明 200 OK GET和PUT操作正常返回。 201 Created POST操作正常返回。 202 Accepted 请求已被接受。 204 No Content DELETE操作正常返回。 异常 返回值 说明 400 Bad Request 服务器未能处理请求。 401 Unauthorized 被请求的页面需要用户名和密码。 403 Forbidden 对被请求页面的访问被禁止。 404 Not Found 服务器无法找到被请求的页面。 405 Method Not Allowed 请求中指定的方法不被允许。 406 Not Acceptable 服务器生成的响应无法被客户端所接受。 407 Proxy Authentication Required 用户必须首先使用代理服务器进行验证,这样请求才会被处理。 408 Request Timeout 请求超出了服务器的等待时间。 409 Conflict 由于冲突,请求无法被完成。 500 Internal Server Error 请求未完成。服务异常。 501 Not Implemented 请求未完成。服务器不支持所请求的功能。 502 Bad Gateway 请求未完成。服务器从上游服务器收到一个无效的响应。 503 Service Unavailable 请求未完成。系统暂时异常。 504 Gateway Timeout 网关超时。 父主题: 公共参数
  • 修订记录 版本日期 变更说明 2023-06-07 第六次正式发布,本次变更如下: 服务名称变更:“资源管理服务 RMS ”更名为“配置审计 Config”。 2023-02-10 第五次更新发布,本次更新如下: 新增“查询帐号下的单个资源”接口。 新增“列举资源标签”接口。 新增“查询资源数量”接口。 新增“列举资源概要”接口。 新增“列举资源关系详情”接口。 新增“创建或更新组织合规规则”接口。 新增“查询组织合规规则列表”接口。 新增“查询指定组织合规规则”接口。 新增“删除组织合规规则”接口。 新增“查询组织合规规则部署状态”接口。 新增“查询组织内每个成员帐号合规规则部署的详细状态”接口。 新增“资源聚合器”相关接口。 新增“权限和授权项”下的“资源聚合器”章节。 2022-12-07 第四次更新发布,本次更新如下: 新增“更新合规评估结果”接口。 2021-04-06 第三次正式发布,本次更新如下: 新增“高级查询”相关接口; 新增“权限和授权项”下的“高级查询”章节。 2020-12-25 第二次正式发布,本次更新如下: 新增错误码:RMS.00010053; 新增“列举所有资源”接口; 新增“区域管理”下的“查询用户可见的区域”接口。 2020-11-30 第一次正式发布。
  • 高级查询 权限 对应API接口 授权项 IAM 项目 企业项目 运行高级查询 POST /v1/resource-manager/domains/{domain_id}/run-query rms:resources:runQuery √ 不涉及 创建查询语句 POST /v1/resource-manager/domains/{domain_id}/stored-queries rms:storedQueries:create √ 不涉及 查看查询语句 GET /v1/resource-manager/domains/{domain_id}/stored-queries/{query_id} rms:storedQueries:get √ 不涉及 列举查询语句 GET /v1/resource-manager/domains/{domain_id}/stored-queries rms:storedQueries:list √ 不涉及 更新查询语句 PUT /v1/resource-manager/domains/{domain_id}/stored-queries/{query_id} rms:storedQueries:update √ 不涉及 删除查询语句 DELETE /v1/resource-manager/domains/{domain_id}/stored-queries/{query_id} rms:storedQueries:delete √ 不涉及 列举高级查询Schemas GET /v1/resource-manager/domains/{domain_id}/schemas rms:schemas:list √ 不涉及 父主题: 权限和授权项
  • 资源聚合器 权限 对应API接口 授权项 IAM项目 企业项目 创建资源聚合器授权 PUT /v1/resource-manager/domains/{domain_id}/aggregators/aggregation-authorization rms: aggregationAuthorizations:create √ 不涉及 删除资源聚合器授权 DELETE /v1/resource-manager/domains/{domain_id}/aggregators/aggregation-authorization/{authorized_account_id} rms:aggregationAuthorizations:delete √ 不涉及 查询资源聚合器授权列表 GET /v1/resource-manager/domains/{domain_id}/aggregators/aggregation-authorization rms:aggregationAuthorizations:list √ 不涉及 创建资源聚合器 PUT /v1/resource-manager/domains/{domain_id}/aggregators rms: aggregators: create √ 不涉及 查询资源聚合器列表 GET /v1/resource-manager/domains/{domain_id}/aggregators rms:aggregators:list √ 不涉及 查询指定资源聚合器详情 GET /v1/resource-manager/domains/{domain_id}/aggregators/{aggregator_id} rms:aggregators:get √ 不涉及 查询指定资源聚合器聚合帐号的状态信息 GET /v1/resource-manager/domains/{domain_id}/aggregators/{aggregator_id}/aggregator-sources-status rms:aggregators:get √ 不涉及 删除资源聚合器 DELETE /v1/resource-manager/domains/{domain_id}/aggregators/{aggregator_id} rms:aggregators:delete √ 不涉及 更新资源聚合器 PUT /v1/resource-manager/domains/{domain_id}/aggregators/{aggregator_id} rms:aggregators:update √ 不涉及 删除聚合器帐号中挂起的授权请求 DELETE /v1/resource-manager/domains/{domain_id}/aggregators/pending-aggregation-request/{requester_account_id} rms:aggregationRequests:delete √ 不涉及 查询所有挂起的聚合请求列表 GET /v1/resource-manager/domains/{domain_id}/aggregators/pending-aggregation-request rms:aggregationRequests:list √ 不涉及 查询聚合器中资源的列表 POST /v1/resource-manager/domains/{domain_id}/aggregators/aggregate-data/aggregate-discovered-resources rms:aggregatorResources:list √ 不涉及 对指定聚合器执行高级查询 POST /v1/resource-manager/domains/{domain_id}/aggregators/{aggregator_id}/run-query rms:aggregatorResources:runQuery √ 不涉及 查询源帐号中资源的详情 POST /v1/resource-manager/domains/{domain_id}/aggregators/aggregate-resource-config rms:aggregatorResources:get √ 不涉及 查询聚合器中帐号资源的计数 POST /v1/resource-manager/domains/{domain_id}/aggregators/aggregate-data/aggregate-discovered-resource-counts rms:aggregatorResources:list √ 不涉及 查询聚合器中一个或多个帐号的合规概况 POST /v1/resource-manager/domains/{domain_id}/aggregators/aggregate-data/policy-states/compliance-summary rms:aggregatorResources:list √ 不涉及 查询聚合合规规则列表 POST /v1/resource-manager/domains/{domain_id}/aggregators/aggregate-data/policy-assignments/compliance rms:aggregatorResources:list √ 不涉及 查询指定聚合合规规则的资源评估结果详情 POST /v1/resource-manager/domains/{domain_id}/aggregators/aggregate-data/policy-states/compliance-details rms:aggregatorResources:list √ 不涉及 查询指定聚合合规规则详情 POST /v1/resource-manager/domains/{domain_id}/aggregators/aggregate-data/policy-assignment/detail rms:aggregatorResources:get √ 不涉及 父主题: 权限和授权项
  • 调用API获取项目ID 项目ID可以通过调用查询指定条件下的项目列表API获取。 获取项目ID的接口为“GET https://{Endpoint}/v3/projects”,其中{Endpoint}为IAM的终端节点,可以从地区和终端节点获取。接口的认证鉴权请参见认证鉴权。 响应示例如下,其中projects下的“id”即为项目ID。 { "projects": [ { "domain_id": "65382450e8f64ac0870cd180d14e684b", "is_domain": false, "parent_id": "65382450e8f64ac0870cd180d14e684b", "name": "project_name", "description": "", "links": { "next": null, "previous": null, "self": "https://www.example.com/v3/projects/a4a5d4098fb4474fa22cd05f897d6b99" }, "id": "a4a5d4098fb4474fa22cd05f897d6b99", "enabled": true } ], "links": { "next": null, "previous": null, "self": "https://www.example.com/v3/projects" }}
  • 响应示例 状态码: 200 操作成功。 { "policy_assignment_type" : "builtin", "id" : "64104fff86952b3af614cabb", "name" : "required-tag-check", "description" : "指定一个标签,不具有此标签的资源,视为“不合规”", "policy_filter" : { "region_id" : null, "resource_provider" : null, "resource_type" : null, "resource_id" : null, "tag_key" : null, "tag_value" : null }, "period" : null, "state" : "Enabled", "created" : "2023-04-03T06:40:12.846Z", "updated" : "2023-04-03T06:40:12.846Z", "policy_definition_id" : "5fa9f89b6eed194ccb2c04db", "created_by" : "customer"}
  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 X-Security-Token 否 String 如果正在使用临时安全凭据,则此header是必需的,该值是临时安全凭据的安全令牌(会话令牌)。 最小长度:0 最大长度:2048 表3 请求Body参数 参数 是否必选 参数类型 描述 aggregator_id 是 String 资源聚合器ID 最小长度:1 最大长度:256 account_id 是 String 源帐号ID 最小长度:1 最大长度:36 policy_assignment_id 是 String 合规规则ID 最大长度:36
  • 请求示例 查询指定聚合合规规则详情 PUT https://{endpoint}/v1/resource-manager/domains/{domain_id}/aggregators/aggregate-data/policy-assignment/detail{ "aggregator_id" : "7ca3447830bd49c9b630a99680eaf90f", "account_id" : "39f4a9434e0c4bf3806e5aff54adea39", "policy_assignment_id" : "64104fff86952b3af614cabb"}
  • 响应示例 状态码: 200 操作成功。 { "value" : [ { "id" : "5fa365476eed194ccb2c04d1", "name" : "volumes-encrypted-check", "policy_type" : "builtin", "description" : "已挂载的云硬盘未进行加密,视为“不合规”。", "policy_rule_type" : "dsl", "policy_rule" : { "allOf" : [ { "value" : "${resource().provider}", "comparator" : "equals", "pattern" : "evs" }, { "value" : "${resource().type}", "comparator" : "equals", "pattern" : "volumes" }, { "value" : "${resource().properties.status}", "comparator" : "equals", "pattern" : "in-use" }, { "anyOf" : [ { "value" : "${resource().properties.metadata}", "comparator" : "notContainsKey", "pattern" : "systemEncrypted" }, { "value" : "${resource().properties.metadata.systemEncrypted}", "comparator" : "equals", "pattern" : "0" } ] } ] }, "keywords" : [ "evs", "ecs" ], "parameters" : { } }, { "id" : "5fa9f89b6eed194ccb2c04db", "name" : "required-tag-check", "policy_type" : "builtin", "description" : "指定一个标签,不具有此标签的资源,视为“不合规”。", "policy_rule_type" : "dsl", "policy_rule" : { "anyOf" : [ { "value" : "${contains(resource().tags, parameters('specifiedTagKey'))}", "comparator" : "equals", "pattern" : false }, { "allOf" : [ { "value" : "${length(parameters('specifiedTagValue'))}", "comparator" : "greater", "pattern" : 0 }, { "value" : "${getValue(resource().tags, parameters('specifiedTagKey'))}", "comparator" : "notIn", "pattern" : "${parameters('specifiedTagValue')}" } ] } ] }, "keywords" : [ "tag" ], "parameters" : { "specifiedTagKey" : { "name" : null, "description" : "the specified tag key。", "allowed_values" : null, "default_value" : null, "type" : "String" }, "specifiedTagValue" : { "name" : null, "description" : "The list of allowed tag value, permit all if empty。", "allowed_values" : null, "default_value" : null, "type" : "Array" } } }, { "id" : "5fa265c0aa1e6afc05a0ff07", "name" : "allowed-images-by-id", "policy_type" : "builtin", "description" : "指定允许的镜像ID列表,ECS实例的镜像ID不在指定的范围内,视为“不合规”。", "policy_rule_type" : "dsl", "policy_rule" : { "allOf" : [ { "value" : "${resource().provider}", "comparator" : "equals", "pattern" : "ecs" }, { "value" : "${resource().type}", "comparator" : "equals", "pattern" : "cloudservers" }, { "value" : "${resource().properties.metadata.meteringImageId}", "comparator" : "notIn", "pattern" : "${parameters('listOfAllowedImages')}" } ] }, "keywords" : [ "ecs", "ims" ], "parameters" : { "listOfAllowedImages" : { "name" : null, "description" : "The list of allowed image IDs。", "allowed_values" : null, "default_value" : null, "type" : "Array" } } }, { "id" : "5fa36558aa1e6afc05a3d0a7", "name" : "volume-inuse-check", "policy_type" : "builtin", "description" : "云硬盘未挂载给任何云服务器,视为“不合规”。", "policy_rule_type" : "dsl", "policy_rule" : { "allOf" : [ { "value" : "${resource().provider}", "comparator" : "equals", "pattern" : "evs" }, { "value" : "${resource().type}", "comparator" : "equals", "pattern" : "volumes" }, { "value" : "${resource().properties.status}", "comparator" : "equals", "pattern" : "available" } ] }, "keywords" : [ "evs" ], "parameters" : { } }, { "id" : "5fa3a1196eed194ccb2c04d7", "name" : "allowed_volume_specs", "policy_type" : "builtin", "description" : "指定允许的云硬盘类型列表,云硬盘的类型不在指定的范围内,视为“不合规”。", "policy_rule_type" : "dsl", "policy_rule" : { "allOf" : [ { "value" : "${resource().provider}", "comparator" : "equals", "pattern" : "evs" }, { "value" : "${resource().type}", "comparator" : "equals", "pattern" : "volumes" }, { "value" : "${resource().properties.volumeType}", "comparator" : "notIn", "pattern" : "${parameters('listOfAllowedSpecs')}" } ] }, "keywords" : [ "evs" ], "parameters" : { "listOfAllowedSpecs" : { "name" : null, "description" : "The list of allowed disk specifications。", "allowed_values" : null, "default_value" : null, "type" : "Array" } } }, { "id" : "5f8d549bffeecc14f1fb522a", "name" : "allowed_ecs_flavors", "policy_type" : "builtin", "description" : "ECS资源的规格不在指定的范围内,视为“不合规”。", "policy_rule_type" : "dsl", "policy_rule" : { "allOf" : [ { "value" : "${resource().provider}", "comparator" : "equals", "pattern" : "ecs" }, { "value" : "${resource().type}", "comparator" : "equals", "pattern" : "cloudservers" }, { "value" : "${resource().properties.flavor.name}", "comparator" : "notIn", "pattern" : "${parameters('listOfAllowedFlavors')}" } ] }, "keywords" : [ "ecs" ], "parameters" : { "listOfAllowedFlavors" : { "name" : null, "description" : "The list of allowed flavor types。", "allowed_values" : null, "default_value" : null, "type" : "Array" } } }, { "id" : "5fa3a1196eed194ccb2c04d5", "name" : "eip-unbound-check", "policy_type" : "builtin", "description" : "弹性公网IP未进行任何绑定,视为“不合规”。", "policy_rule_type" : "dsl", "policy_rule" : { "allOf" : [ { "value" : "${resource().provider}", "comparator" : "equals", "pattern" : "vpc" }, { "value" : "${resource().type}", "comparator" : "equals", "pattern" : "publicips" }, { "value" : "${resource().properties.status}", "comparator" : "equals", "pattern" : "DOWN" } ] }, "keywords" : [ "vpc" ], "parameters" : { } }, { "id" : "5f8d5428ffeecc14f1fb5205", "name" : "ecs-instance-no-public-ip", "policy_type" : "builtin", "description" : "ECS资源具有公网IP,视为“不合规”。", "policy_rule_type" : "dsl", "policy_rule" : { "allOf" : [ { "value" : "${resource().provider}", "comparator" : "equals", "pattern" : "ecs" }, { "value" : "${resource().type}", "comparator" : "equals", "pattern" : "cloudservers" }, { "value" : "${length(filter(resource().properties.addresses, lambda x: equals(x.OsExtIpsType, 'floating')))}", "comparator" : "greater", "pattern" : 0 } ] }, "keywords" : [ "ecs" ], "parameters" : { } }, { "id" : "5fa265c0aa1e6afc05a0ff10", "name" : "ecs-instance-in-vpc", "policy_type" : "builtin", "description" : "指定虚拟私有云ID,不属于此VPC的ECS资源,视为“不合规”。", "policy_rule_type" : "dsl", "policy_rule" : { "allOf" : [ { "value" : "${resource().provider}", "comparator" : "equals", "pattern" : "ecs" }, { "value" : "${resource().type}", "comparator" : "equals", "pattern" : "cloudservers" }, { "value" : "${resource().properties.metadata.vpcId}", "comparator" : "notEquals", "pattern" : "${parameters('vpcId')}" } ] }, "keywords" : [ "ecs", "vpc" ], "parameters" : { "vpcId" : { "name" : null, "description" : "VPC ID that contains the ECS instance。", "allowed_values" : null, "default_value" : null, "type" : "String" } } } ], "page_info" : { "current_count" : 9, "next_marker" : null }}
  • 请求参数 表1 请求Header参数 参数 是否必选 参数类型 描述 X-Language 否 String 选择接口返回的信息的语言,默认为"zh-cn"中文。 缺省值:zh-cn X-Auth-Token 否 String 调用者token。 X-Security-Token 否 String 如果正在使用临时安全凭据,则此header是必需的,该值是临时安全凭据的安全令牌(会话令牌)。 最小长度:0 最大长度:2048
  • 支持的服务和资源类型 Config支持的云服务(provider)和资源类型(type)可通过如下两种方式获取: API方式 通过调用列举云服务接口查询Config支持的云服务、资源和区域列表。其中provider字段为云服务名称,resource_types中的name字段为资源类型名称。 管理控制台方式 Config支持的服务和区域详见支持的服务和区域,在列表中的“资源类型”列查看云服务名称和资源类型名称。 父主题: 附录
  • 响应参数 状态码: 200 表4 响应Body参数 参数 参数类型 描述 id String ResourceQL ID。 最大长度:256 name String ResourceQL名称。 最小长度:1 最大长度:64 description String ResourceQL描述。 最小长度:0 最大长度:512 expression String ResourceQL表达式。 最小长度:1 最大长度:4096 created String ResourceQL创建时间。 最小长度:1 最大长度:64 updated String ResourceQL更新时间。 最小长度:1 最大长度:64 状态码: 400 表5 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 错误消息内容。 状态码: 403 表6 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 错误消息内容。 状态码: 404 表7 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 错误消息内容。 状态码: 500 表8 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 错误消息内容。
  • 响应示例 状态码: 200 操作成功。 { "id" : "62b9126566d400721efceffa", "name" : "running-ecs", "description" : "查询开机状态的云服务器。", "expression" : "SELECT id, name FROM resources WHERE provider = 'ecs' AND type = 'cloudservers' AND properties.status = 'ACTIVE'", "created" : "2022-06-27T02:13:57.107Z", "updated" : "2022-07-09T09:12:00.007Z"}
  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 否 String 调用者token。 X-Security-Token 否 String 如果正在使用临时安全凭据,则此header是必需的,该值是临时安全凭据的安全令牌(会话令牌)。 最小长度:0 最大长度:2048 表3 请求Body参数 参数 是否必选 参数类型 描述 name 是 String ResourceQL名称。 最小长度:1 最大长度:64 description 否 String ResourceQL描述。 最小长度:0 最大长度:512 expression 是 String ResourceQL表达式。 最小长度:1 最大长度:4096
  • 请求示例 更新高级查询,用于查询开机状态的云服务器。 PUT https://{endpoint}/v1/resource-manager/domains/{domain_id}/stored-queries/{query_id}{ "name" : "running-ecs", "description" : "查询开机状态的云服务器。", "expression" : "SELECT id, name FROM resources WHERE provider = 'ecs' AND type = 'cloudservers' AND properties.status = 'ACTIVE'"}
  • 响应参数 状态码: 400 表3 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 错误消息内容。 状态码: 403 表4 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 错误消息内容。 状态码: 404 表5 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 错误消息内容。 状态码: 500 表6 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 错误消息内容。
  • 响应示例 状态码: 200 操作成功。 { "id" : "62b9126566d400721efceffa", "name" : "stopped-ecs", "description" : "查询关机状态的云服务器。", "expression" : "SELECT id, name FROM resources WHERE provider = 'ecs' AND type = 'cloudservers' AND properties.status = 'SHUTOFF'", "created" : "2022-06-27T02:13:57.107Z", "updated" : "2022-06-27T02:13:57.107Z"}
共100000条