通过资源中心实现云上资源配置同步到企业CMDB

更新时间:

方案概述

当前企业云上资源规模不断扩大,运维面临资源分散、依赖关系复杂、变更影响难以评估等问题,传统手工管理方式效率低下且易出错。搭建CMDB可实现云资源的统一纳管与自动化更新,清晰梳理资源配置及依赖关系,助力高效故障排查与变更管理,同时满足合规审计需求,为企业云上运维提供可靠的数据支撑和决策依据,显著提升运维效率与业务稳定性。

本方案指导企业用户在云上IT架构下,一站式的采集全量资源配置数据,持续获取云上资源配置变更数据,将这些数据稳妥留存并快捷消费到自有的CMDB平台,加快企业自有CMDB的构建和及时更新。

方案优势

云上全局资源配置统一获取

资源中心对客提供跨账号、跨产品、跨地域的云上全局资源统一视图及资源搜索与资源投递能力,客户无需逐一对接各云产品的Open API接口,仅需通过资源中心单一产品即可实现云上全局资源配置统一获取。同时支持基于资源目录的多账号管理能力,通过资源目录管理账号或资源中心委派管理员账号,统一获取资源目录下全部成员账号的资源配置数据。而传统模式下,客户需针对不同云产品分别对接Open API获取各产品、各地域下的资源配置信息,开发及维护成本高。并且在企业多账号场景下,资源分散在多个独立账号中,更增加了获取资源配置信息的复杂度。本方案基于资源中心实现云上全局资源配置统一获取,省去客户对接多款云产品Open API的复杂度和开发工作量,更加高效便捷地同步云上资源至企业CMDB。

近实时资源同步,保障CMDB一致性

资源中心支持资源投递功能,每日定时投递全量资源快照到对象存储(OSS)、近实时投递资源配置变更事件到日志服务(SLS)中。客户通过在对象存储(OSS)或日志服务(SLS)中消费标准化的资源数据,进行云上资源备份,同时近实时感知云上资源配置变更并及时更新企业CMDB。传统轮询Open API的模式下,客户需部署监听程序或频繁调用Open API检查,成本较高且实时性差。本方案基于资源中心的资源投递能力可持续、近实时获取云上资源配置变更数据,保障CMDB与云上资源的数据一致性。

客户场景

场景描述

使用企业自建或第三方成品CMDB平台(资源管理/面向应用的运维管理)需要同步云上资源配置数据构建和更新企业CMDB。企业在内部日常运维中需依赖资源配置数据。如获取所有云上资源列表和资源配置进行资产盘查,如在进行资源变更前或发生故障后盘点资源关系以确定影响范围等。

适用客户

  • 研发能力较强的大型企业用户。基于OpenAPI搭建了企业内部的运维平台。

  • CMP云管服务提供商。为用户提供多云、混合云定制化的管理服务,隐藏各个云厂商的差异性,需统一管理调度各个云上的IT资源和应用。

方案架构

本方案使用资源中心统一收集跨账号、跨产品、跨地域的云上全局资源配置,并通过资源中心的相关产品能力,同步全量资源配置信息构建企业CMDB,持续获取资源配置变更事件确保CMDB内资源配置数据的实时性。

当用户使用资源目录管理云上多账号环境时,可以使用资源中心委派管理员对资源中心进行管理,资源中心收集资源目录下所有成员账号的云上资源配置数据。使用资源中心的资源搜索或资源投递中资源快照投递,可以方便快捷地构建云上全量资源数据;同时,设置资源配置变更事件投递后,可以实时监听并消费云上资源配置变更事件,实现对CMDB资源配置的持续更新。

获取到资源中心的元数据后,可以根据企业内部CMDB的资源定义进行元数据映射,按照资源的归属账号以及标签确定资源和应用的关系,按照企业自身情况实现资源分析以及可视化展示。

产品费用及名词

产品费用

产品名称

产品说明

产品费用

资源目录RD

资源目录RD(Resource Directory)是阿里云面向企业客户提供的一套多级账号和资源关系管理服务。

免费,详情参见产品定价

资源中心

资源中心提供跨账号、跨产品、跨地域的资源统一视图及资源搜索能力。您可以查看全局资源列表,对云上资源全貌了然于心。您可以基于地域、产品、资源类型、资源ID、资源名称或资源标签作为筛选条件进行资源搜索。

免费,详情参见产品定价

对象存储OSS

对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。

收费,详情参见产品计费

日志服务SLS

日志服务(SLS)是云原生观测与分析平台,为Log、Metric、Trace等数据提供大规模、低成本、实时的平台化服务。日志服务一站式提供数据采集、加工、查询与分析、可视化、告警、消费与投递等功能,全面提升您在研发、运维、运营、安全等场景的数字化能力。

收费,详情参见产品计费

名词解释

名称

说明

企业管理账号

在企业拥有多个阿里云账号时,特指拥有管理其他账号资源权限的管理员账号。用于管理多账号,统一配置多账号身份权限,统一查看各云账号账单,统一配置审计规则并下发到各成员账号。

委派管理员账号

资源目录的管理账号可以将资源目录中的成员设置为可信服务的委派管理员账号。设置成功后,委派管理员账号将获得管理账号的授权,可以在对应可信服务中访问资源目录组织和成员信息,并在该组织范围内进行业务管理。

高级搜索

资源中心的高级搜索基于SQL语句查询当前账号和资源目录成员中的资源。高级搜索提供了灵活、实用且免费的资源全局检索能力。您可以使用查询模板快速查询资源,无论是查找特定类型的资源还是进行更复杂的查询,高级搜索都能满足您的要求。

资源快照

资源定时快照是在某个指定时间点对指定范围内所有资源配置的完整副本。本方案将资源定时快照从资源中心投递到OSS的存储空间,实现资源配置的归档存储。

资源配置变更事件

资源配置变更事件是在资源被创建、删除或其属性发生修改时产生的变更事件。您可以将资源配置变更事件从资源中心投递到SLS日志库。

安全性

资源中心安全性

资源中心通过调用各个云产品的Open API「全量构建」资源配置信息,以及通过监听操作审计事件近实时触发增量构建,持续发现和构建客户账号下的资源配置信息。当开通资源中心时,需要授权同意系统创建一个名为 AliyunServiceRoleForResourceMetaCenter 服务关联角色,资源中心将使用该角色获取账号内的云资源信息并构建资源中心。更多信息,请参见资源中心服务关联角色

注意事项

  • 初次开通时,资源中心的构建和数据的更新通常需要几分钟的时间,在资源量大时可能需要更长的时间,请您耐心等待。

  • 支持资源中心的云服务以及资源类型请参考文档,后续会持续接入更多云服务及资源类型。若有新的需求,可以在资源中心控制台的右上角提交反馈。

  • 资源中心仅支持搜索和获取当前用户有权限访问的资源,请确认RAM用户是否具有所搜资源的访问权限。

  • 资源新创建之后,资源中心预计需要2分钟完成资源同步。如果未搜索到新创建的资源,请耐心等待并尝试重新获取。

实施步骤

实施准备

  • 本方案使用资源目录管理企业多账号环境,如需管理多账号资源结构,请确认资源目录已经完成开通,并已经完成账号结构的搭建。

  • 本方案将使用资源中心对云上资源进行统一收集,并使用资源中心内的跨账号资源搜索能力收集资源目录内的所有成员账号的资源配置数据。在实施前,请确保资源中心以及跨账号资源搜索已经完成开通。

  • 本方案使用对象存储OSS和日志服务SLS存储资源快照和资源配置变更消息,请确认账号中对象存储OSS和日志服务SLS已完成开通。

实施时长

在实施准备工作完成的情况下,本方案实施预计时长:1小时。

操作步骤

规划云上资源配置的同步范围

  1. 确定需要同步的账号范围:

    • 单账号:如果仅需要同步当前账号下的所有资源,可直接使用有权限的用户进行操作。

    • 多账号:如果需要同步企业内多个阿里云账号下的所有资源,建议使用资源目录构建组织关系,并设置资源中心的委派管理员,使用资源中心的委派管理员进行操作。

  2. 确定需要同步的云上资源范围:

    1. 根据支持资源中心的云服务及资源类型,按照实际业务圈定需要获取的云上资源范围。

    2. 前往资源中心获取资源类型以及对应的属性列表。

    3. 根据企业内部CMDB的资源定义,完成与云上资源定义之间的属性映射。

  3. 完成规划后,即可开始构建云上资源数据,包括云上资源数据配置的初始化和后续增量数据获取。

初始化资源配置数据

资源中心提供多种方式获取资源配置数据,请根据使用场景选择合适的资源获取方式,包括:

  • 资源搜索:当仅需要获取资源的基础属性(包括资源名称、资源ID、资源类型、地域等),可获取当前账号或多账号范围下的资源配置数据。

  • 高级搜索:当需要使用更加灵活的搜索条件,比如查找关联资源、多条件组合查询时,可以使用高级搜索的方式获取当前账号或多账号范围下的资源配置数据。

  • 资源投递:当需要一次性获取资源的完整快照或期望定期进行资源备份,可以使用资源投递中资源定时快照的方式将资源快照投递到OSS中,通过解析资源快照获取当前账号或多账号范围下的资源配置数据。

方案一:使用资源搜索获取资源配置数据
  1. 在项目中引入资源中心SDK

  2. 资源中心提供了当前账号资源搜索以及跨账号资源搜索的能力:

    1. 当前账号查询:

      1. SearchResources:查询当前账号下有权限访问的资源,可通过设置一个或多个过滤条件(比如资源类型)来精确资源的搜索范围。该API将返回资源搜索范围内的资源列表,列表中包含的资源仅包含基本属性,包括资源ID、资源名称、地域。

      2. GetResourceConfiguration:用于查询当前账号下指定资源的详细配置数据,在请求参数中需要指定参数的地域ID、资源类型以及资源ID。

    2. 跨账号查询(RD范围内):

      1. SearchMultiAccountResources:将按照过滤条件,搜索资源目录管理账号和多个成员账号中的资源。在调用API时,需要额外传入需要搜索的范围,例如资源目录ID、资源夹ID、或者成员账号ID。

      2. GetMultiAccountResourceConfiguration:用于查找资源目录管理账号或者成员账号的资源详细配置数据。在调用API时,需要额外传入资源所属的账号ID。

方案二:使用高级搜索获取资源配置数据
  1. 进入资源管理控制台,点击左侧导航栏中的 资源中心 > 高级搜索

  2. 在高级搜索中页面左侧将展示支持的所有产品、资源类型以及对应的属性,找到需要查询的资源以及对应的属性。我们以查询当前账号下的ECS实例和关联的磁盘为例,找到ECS实例和的资源类型后可查看对应的资源属性。高级查询基于SQL语句查询资源,我们将ECS实例和磁盘实例按照ECS实例ID来进行连表查询,并打印相关信息。

    SELECT
      ecs.region_id,
      ecs.resource_type as "ECS实例类型",
      ecs.resource_id as "ECS实例ID",
      ecs.resource_name as "ECS实例名称",
      ecs.tags as "ECS实例标签",
      ecs.resource_group_id as "ECS实例资源组ID",
      disk.resource_id as "磁盘ID",
      disk.properties ->> 'DiskId' as "磁盘标识",
      disk.properties ->> 'InstanceId' as "关联实例ID"
    FROM
      resources ecs
      LEFT JOIN resources disk ON ecs.resource_id = disk.properties ->> 'InstanceId'
    WHERE
      ecs.resource_type = 'ACS::ECS::Instance'
      AND ecs.region_id = 'cn-hangzhou'
    ORDER BY
      ecs.resource_id,
      disk.resource_id;
  3. 在确定好高级搜索使用的SQL语句后,我们可以在项目中引入资源中心SDK来进行查询

  4. 资源中心提供了当前账号高级搜索以及跨账号高级搜索的API,入参为我们在步骤2中确定的SQL语句。请注意:高级搜索API限流 3/5(s),在使用API时请注意处理流控问题。

    1. 查询当前账号:ExecuteSQLQuery

    2. 跨账号查询(RD范围内):ExecuteMultiAccountSQLQuery

方案三:使用资源投递获取资源配置数据
  1. 进入资源管理控制台,点击左侧导航栏中的 资源中心 > 资源投递

  2. 点击创建投递,选择投递场景为标准资源投递,在基础信息中填写资源投递的名称并指定需要投递的资源范围。如果选择创建跨账号资源投递,在填写基本信息时还需要选择投递的账号范围。

  3. 在配置投递渠道时,我们分别配置资源快照和资源配置变更的投递渠道。资源中心目前支持将资源快照投递到对象存储OSS中,以及将资源配置变更投递(将在后续获取增量变更数据中使用)到日志服务SLS中。

  4. 创建完成后可以在资源投递页面查看刚刚创建好的资源投递,进入投递详情页后可以点击存储空间跳转到对应的OSS中查看快照文件。

  5. OSS存储空间的左侧导航栏,选择文件管理 -> 文件列表,查看并下载资源定时快照数据。参照资源定时快照的数据结构,解析资源定时快照并获取资源配置数据,并完成与企业CMDB资源模型的映射更新。

获取增量变更数据

在完成资源配置数据的初始化操作后,可以通过设置资源配置变更数据投递,实时获取增量变更数据,确保企业CMDB资源数据的实时性。

将资源配置变更数据投递到日志服务(SLS)
  1. 进入资源管理控制台,点击左侧导航栏中的 资源中心 > 资源投递

  2. 如果已有资源快照投递可编辑已有投递,如果需要新建投递并选择投递场景为标准资源投递。

  3. 在基础信息中填写资源投递的名称并指定需要投递的资源范围。如果选择创建跨账号资源投递,在填写基本信息时还需要选择投递的账号范围。

  4. 在配置投递渠道页面,开启资源配置变更投递。目前资源中心支持将资源配置变更数据投递到SLS中,需要指定投递的日志项目和日志库,配置完成后点击确认即可。请注意:在未开启大文件投递的情况下当资源配置变更事件超过1 MB时,资源中心会直接丢弃不进行投递。此时,您可以选择启用大文件投递功能,将变更事件的基本信息投递到SLS日志库,详细变更内容投递到OSS存储空间。

  5. 创建完成后可以在资源投递页面查看刚刚配置的资源投递,进入投递详情页后可以点击日志库即可查看。

  6. 进入日志库后,当触发资源变更事件后可以在日志库内查看到对应的时间、地点、账号等信息,事件变更事件的具体格式可参考资源配置变更事件的数据结构注意:若需要在SLS中实时查看和分析资源变更事件,需要在日志库中开启索引,开启索引将带来额外费用,详细请参考计费说明

监听并消费SLS日志

将资源配置变更数据投递到SLS后,我们可以通过消费日志实时感知到资源配置的变化,并调用资源中心资源搜索的API,实时更新CMDB中资源的最终状态。

  1. 前往数据变更事件投递的日志库中,点击【消费预览】,即可查看消费时,获取到的SLS Log的数据结构。

  2. 日志服务提供多种消费的方式,可参考数据消费与订阅查看全部消费方式,当前我们以通过API消费为例,通过Java SDK完成日志消费:

    <dependency>
      <groupId>com.google.protobuf</groupId>
      <artifactId>protobuf-java</artifactId>
      <version>2.5.0</version>
    </dependency>
    <dependency>
    <groupId>com.aliyun.openservices</groupId>
      <artifactId>aliyun-log</artifactId>
      <version>0.6.99</version>
    </dependency>
    import com.aliyun.openservices.log.Client;
    import com.aliyun.openservices.log.common.Consts;
    import com.aliyun.openservices.log.common.LogGroupData;
    import com.aliyun.openservices.log.common.Shard;
    import com.aliyun.openservices.log.exception.LogException;
    import com.aliyun.openservices.log.request.PullLogsRequest;
    import com.aliyun.openservices.log.response.ListShardResponse;
    import com.aliyun.openservices.log.response.PullLogsResponse;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class PullLogsDemo {
        // 日志服务的服务接入点。此处以杭州为例,其它地域请根据实际情况填写
        private static final String endpoint = "cn-hangzhou.log.aliyuncs.com";
        // 本示例从环境变量中获取 AccessKey ID 和 AccessKey Secret。
        private static final String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
        private static final String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
        // Project 名称
        private static final String project = "your_project";
        // LogStore 名称
        private static final String logStore = "your_logstore";
    
        public static void main(String[] args) throws Exception {
            // 创建日志服务 Client
            Client client = new Client(endpoint, accessKeyId, accessKeySecret);
            // 查询 LogStore 的 Shard
            ListShardResponse resp = client.ListShard(project, logStore);
            System.out.printf("%s has %d shards\n", logStore, resp.GetShards().size());
            Map<Integer, String> cursorMap = new HashMap<Integer, String>();
            for (Shard shard : resp.GetShards()) {
                int shardId = shard.getShardId();
                // 从头开始消费,获取游标。(如果是从尾部开始消费,使用 Consts.CursorMode.END)
                cursorMap.put(shardId, client.GetCursor(project, logStore, shardId, Consts.CursorMode.BEGIN).GetCursor());
            }
            try {
                while (true) {
                    // 从每个Shard中获取日志
                    for (Shard shard : resp.GetShards()) {
                        int shardId = shard.getShardId();
                        PullLogsRequest request = new PullLogsRequest(project, logStore, shardId, 1000, cursorMap.get(shardId));
                        PullLogsResponse response = client.pullLogs(request);
                        // TODO: 日志都在日志组(LogGroup)中,需按照逻辑进行解析。
                        List<LogGroupData> logGroups = response.getLogGroups();
                        System.out.printf("Get %d logGroup from logStore:%s:\tShard:%d\n", logGroups.size(), logStore, shardId);
                        // 完成处理拉取的日志后,移动游标。
                        cursorMap.put(shardId, response.getNextCursor());
                    }
                }
            } catch (LogException e) {
                System.out.println("error code :" + e.GetErrorCode());
                System.out.println("error message :" + e.GetErrorMessage());
                throw e;
            }
        }
    }
  3. 资源变更的日志数据均存储在 LogGroupData 中,参考步骤1消费预览中SLS Log的结构解析LogGroupData,即可获取到数据变更的相关数据。

  4. 由于变更事件投递顺序的不确定性,我们建议在获取到数据变更日志中的 AccountId, ResourceId, RegionId以及ResourceType后,调用资源中心的SearchResourcesSearchMultiAccountResources API查询资源的最终状态,并更新到企业CMDB中。

故障排除

为什么资源中心搜索不到指定资源?

资源中心搜索不到资源的可能有如下原因:

  • RAM用户未被授权所搜索资源的访问权限:资源中心仅支持搜索当前用户有权访问的资源,请确认RAM用户是否具有所搜索资源的访问权限。

  • 搜索的资源不支持资源中心:只有支持资源中心的云服务及资源类型,才能在资源中心查看和搜索。具体信息请参见支持资源中心的云服务及资源类型

  • 资源同步未完成:新资源创建后,资源中心预计需要2分钟完成资源同步,若未搜索到新创建的资源,请耐心等待并重试。