更新时间:2024-08-23 GMT+08:00

新建自定义查询

操作场景

您可以使用Config预设的查询语句,或根据资源配置属性自定义查询语句,查询具体的云资源配置。

本章节包含如下内容:

新建自定义查询

  1. 登录管理控制台。
  2. 单击页面左上角的图标,在弹出的服务列表中,选择“管理与监管”下的“配置审计 Config”,进入“资源清单”页面。
  3. 单击页面左侧的“高级查询”,进入“高级查询”页面。
  4. 选择“自定义查询”页签,单击页面右上角的“新建查询”。

    图1 新建查询

  5. 在“查询编辑器”的输入框中输入查询语句。

    页面左侧为高级查询使用的Schema信息,也就是查询语句中properties参数需要填写的内容,为各个云服务资源类型的详细属性。查询语句的配置样例请参见高级查询配置样例

  6. 单击“保存查询”,输入查询名称和描述。

    查询名称仅支持输入数字、英文字母、下划线和中划线,最大长度64个字符。

  7. 单击“确定”,保存成功。

    图2 保存查询

    如果自定义查询达到限额时,您将无法单击“保存查询”,同时页面右上方提示“您创建的查询已达到上限,请删除暂不需要使用的查询”。但此时您依然可以单击“运行”,直接运行查询并查看和导出查询结果。

  8. 单击“运行”,查看查询结果。目前只支持展示和导出前4000条查询结果。
  9. 单击“导出”,选择要导出的文件格式(CSV格式或JSON格式),导出查询结果。

基于预设查询创建自定义查询

您可以修改预设查询或已有自定义查询的名称、描述和查询语句,“另存为”后产生新的查询,此处以另存预设查询为例进行说明。

  1. 进入“高级查询”页面,选择“预设查询”页签。

    “高级查询”页面默认展示预设查询列表。

  2. 单击目标查询操作列的“使用查询”,进入“使用查询”页面。

    也可以单击查询名称,进入查询概览页,再单击查询概览页右下方的“使用查询”,进入“使用查询”页面。

    图3 使用预设查询

  3. 在“查询编辑器”的输入框中修改查询语句。

    详细请参见高级查询配置样例

  4. 单击“另存为”,配置查询名称和描述。
  5. 在弹框中,单击“确定”。

    通过另存预设查询操作产生的新查询,将更新在自定义查询列表中。

    图4 另存预设查询

高级查询配置样例

ResourceQL使用结构化查询语言(SQL) SELECT语法的子集来对当前云资源配置数据进行查询和关联查询。用户无需调用特定API来实现,也无需通过多个API下载全量数据并手动分析。ResourceQL仅支持从表resources中查询数据。

表1 resources参数含义

资源参数

参数类型

含义

id

String

资源ID

name

String

资源名称

provider

String

云服务名称

type

String

资源类型

region_id

String

区域ID

project_id

String

项目ID

ep_id

String

企业项目ID

checksum

String

资源详情校验码

created

Date

资源创建时间

updated

Date

资源更新时间

provisioning_state

String

资源操作状态

tag

Array(Map<String,String>)

资源Tag

properties

Map<String,Object>

资源详细属性

用例参考如下:

  • 示例1:查询关机状态的弹性云服务器名称
    SELECT name
    FROM resources
    WHERE provider = 'ecs'
     AND type = 'cloudservers'
     AND properties.status = 'SHUTOFF'
  • 示例2:查询特定规格的云硬盘
    SELECT *
    FROM resources
    WHERE provider = 'evs'
     AND type = 'volumes'
     AND properties.size = 100
  • 示例3:对象存储桶模糊查询
    SELECT *
    FROM resources
    WHERE provider = 'obs'
     AND type = 'buckets'
     AND name LIKE '%figure%'
  • 示例4:查询ECS资源及其关联的EVS资源
    SELECT ECS_EVS.id AS ecs_id, EVS.id AS evs_id
    FROM (
        SELECT id, evs_id
        FROM (
     SELECT id, transform(properties.ExtVolumesAttached, x -> x.id) AS evs_list
    	FROM resources
    	WHERE provider = 'ecs'
    		AND type = 'cloudservers'
    	) ECS
    	   CROSS JOIN UNNEST(evs_list) AS t (evs_id)
    ) ECS_EVS, (
    	SELECT id
    	FROM resources
    	WHERE provider = 'evs'
    		AND type = 'volumes'
    	) EVS
    WHERE ECS_EVS.evs_id = EVS.id
  • 示例5:查询ECS资源名称及其关联的弹性公网IP地址
    SELECT ECS.id AS ECS_id, publicIpAddress AS ip_address
    FROM (
        SELECT id, transform(properties.addresses, x -> x.addr) AS ip_list
        FROM resources
        WHERE provider = 'ecs'
            AND type = 'cloudservers'
    ) ECS, (
            SELECT name, properties.publicIpAddress
            FROM resources
            WHERE provider = 'vpc'
                AND type = 'publicips'
                AND properties.type = 'EIP'
                AND properties.status = 'ACTIVE'
        ) EIP
    WHERE CONTAINS (ECS.ip_list, EIP.name)
  • 示例6:查询每个区域内数量大于100的资源类型
    WITH counts AS (
        SELECT region_id, provider, type, count(*) AS number
        FROM resources
        GROUP BY region_id, provider, type
    )
    SELECT *
    FROM counts
    WHERE number > 100

    查询语句的详细介绍,请参见ResourceQL语法