事件中心+Config+函数计算过滤多账号资源配置变更

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
简介: 本文以多账号内RAM角色修改(新增RAM角色、修改RAM角色配置、删除RAM角色)为场景,提供一种基于事件总线 + Config + 函数计算实现特定资源配置过滤。


1. 背景介绍

某海外企业在阿里云上有多个云账号,客户安全团队比较关注各云账号内部分资源的变更情况。如RAM角色的变更需要统一投递到共享存储(如tableStore或RDS)便于快速查看多账号资源变更情况。

2. 方案架构

Config可以将几十款云产品的变更保存到外部存储(如SLS、OSS等),另外也会默认投递变更数据投递到事件总线,每个账号内都会默认投递到各自的事件总线中。由于客户是多个云账号需要统一处理,所以在各自云账号的事件总线中通过配置事件目标,投递到其他云账号的事件总线。

在成员账号配置EB的时候,通过配置事件模式可以过滤特定的资源。满足客户过滤指定资源变更的需求。

成员账号事件总线-事件目标配置

图片 1

在单个成员账号内需要在事件总线中配置事件规则,将事件目标投递到资源管理账号(MA)的事件总线。

事件模式配置:

{
  "source": [
    "acs.ram"
  ],
  "data": {
    "resourceName": [
      {
        "prefix": "sg-"
      }
    ]
  },
  "type": [
    "ram:Config:ConfigurationItemChangeNotification"
  ]
}

当成员账号里面有许多个RAM角色,以上规则只会过滤出前缀为sg- 打头的RAM角色资源。

资源管理账号(MA)事件总线-事件目标配置

演示环境

本次演示只演示各账号内RAM Role变更。

演示账号说明

账号名称

功能

yf_04

1、开通EB,用于接收另外2个云账号内EB事件

2、开通FC,用于处理EB事件入库及展示事件

3、开通RDS,用于保存EB事件

config_eb_1

1、开通EB,用于接收同账号内Config变更

2、修改RAM 角色信任策略管理(trust policy)触发变更

config_eb_2

1、开通EB,用于接收同账号内Config变更

2、修改RAM角色信任策略管理(trust policy)触发变更

测试变更

在config_eb_1里面创建2个RAM ROLE 。同样的操作在config_eb_2里面再同样进行一次。

1、先在config_eb_1中创建1个RAM role。

  • sg-001

2、再在config_eb_2中创建1个RAM role。

  • ug-001

3、在config_eb_1中修改sg-001的trust policy。

变更前:

{
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Effect": "Allow",
      "Principal": {
        "RAM": [
          "acs:ram::1546****2513:root"
        ]
      }
    }
  ],
  "Version": "1"
}

将Principal属性做变更,变更后:

{
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Effect": "Allow",
      "Principal": {
        "RAM": [
          "acs:ram::1062****9476:root"
        ]
      }
    }
  ],
  "Version": "1"
}

4、在config_eb_1 查看Config资源变更图片 2

操作日志

5、在yf_04 账号查看EB事件(统一事件中心)

{
    "datacontenttype": "application/json;charset=utf-8",
    "aliyunaccountid": "1062****9476",
    "aliyunpublishtime": "2022-05-20T23:56:16.188Z",
    "data": {
        "resourceEventType": "MODIFY",
        "resourceCreateTime": "1652416551000",
        "resourceId": "343433500315236591",
        "captureTime": "1653090910000", # 事件接收时间
        "configuration": "{"UpdateDate":"2022-05-20T23:53:11Z","MaxSessionDuration":3600,"RoleName":"sg-001","Description":"sg-001","AssumeRolePolicyDocument":"{\\n    \\"Statement\\": [{\\n            \\"Action\\": \\"sts:AssumeRole\\",\\n            \\"Effect\\": \\"Allow\\",\\n            \\"Principal\\": {\\"RAM\\": [\\"acs:ram::1062516667359476:root\\"]}}],\\n    \\"Version\\": \\"1\\"}","Arn":"acs:ram::1177528403585585:role/sg-001","RoleId":"343433500315236591","CreateDate":"2022-05-13T04:35:51Z"}",
        "dataType": "ConfigurationItemChangeNotification",
        "resourceName": "sg-001",
        "availabilityZone": "",
        "tags": "",
        "accountId": "1177****5585",
        "relationshipDiff": "",
        "resourceStatus": "",
        "regionId": "cn-beijing",
        "requestId": "d63f5ae7-8c9a-4bcd-958b-bf86c94dd327",
        "configAggregators": "1062516667359476:ca-d1ef7086a0f4009fc283",
        "resourceGroupId": "",
        "arn": "acs:sls:global:1177528403585585:eventbridge",
        "relationship": "",
        "configurationDiff": "{"UpdateDate":["2022-05-20T13:33:38Z","2022-05-20T23:53:11Z"],"AssumeRolePolicyDocument":["{\\n    \\"Statement\\": [{\\n            \\"Action\\": \\"sts:AssumeRole\\",\\n            \\"Effect\\": \\"Allow\\",\\n            \\"Principal\\": {\\"RAM\\": [\\"acs:ram::1546227542332513:root\\"]}}],\\n    \\"Version\\": \\"1\\"}","{\\n    \\"Statement\\": [{\\n            \\"Action\\": \\"sts:AssumeRole\\",\\n            \\"Effect\\": \\"Allow\\",\\n            \\"Principal\\": {\\"RAM\\": [\\"acs:ram::1062516667359476:root\\"]}}],\\n    \\"Version\\": \\"1\\"}"]}",
        "resourceType": "ACS::RAM::Role"
    },
    "aliyunoriginalaccountid": "1177****5585",
    "specversion": "1.0",
    "aliyuneventbusname": "default",
    "id": "d63f5ae7-8c9a-4bcd-958b-bf86c94dd327",
    "source": "acs.ram",
    "time": "2022-05-20T23:55:10Z",
    "aliyunregionid": "cn-beijing",
    "type": "ram:Config:ConfigurationItemChangeNotification"
}

6、在config_eb_2 执行相同的配置变更操作

修改 Ram Role: ug-001 的 trust policy值

变更前:

{
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Effect": "Allow",
      "Principal": {
        "RAM": [
          "acs:ram::1177****5585:root"
        ]
      }
    }
  ],
  "Version": "1"
}

修改Principal属性,变更后:

{
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Effect": "Allow",
      "Principal": {
        "RAM": [
          "acs:ram::1062****9476:root"
        ]
      }
    }
  ],
  "Version": "1"
}

7、在yf_04 账号查看EB事件

{
    "datacontenttype": "application/json;charset=utf-8",
    "aliyunaccountid": "1062****9476",
    "aliyunpublishtime": "2022-05-21T00:15:37.308Z",
    "data": {
        "resourceEventType": "MODIFY",
        "resourceCreateTime": "1652416692000",
        "resourceId": "388886671837864637",
        "captureTime": "1653092130000",
        "configuration": "{"UpdateDate":"2022-05-21T00:13:44Z","MaxSessionDuration":3600,"RoleName":"ug-001","Description":"ug-001","AssumeRolePolicyDocument":"{\\n    \\"Statement\\": [{\\n            \\"Action\\": \\"sts:AssumeRole\\",\\n            \\"Effect\\": \\"Allow\\",\\n            \\"Principal\\": {\\"RAM\\": [\\"acs:ram::1062516667359476:root\\"]}}],\\n    \\"Version\\": \\"1\\"}","Arn":"acs:ram::1526528402803627:role/ug-001","RoleId":"388886671837864637","CreateDate":"2022-05-13T04:38:12Z"}",
        "dataType": "ConfigurationItemChangeNotification",
        "resourceName": "ug-001",
        "availabilityZone": "",
        "tags": "",
        "accountId": "1526****3627",
        "relationshipDiff": "",
        "resourceStatus": "",
        "regionId": "cn-beijing",
        "requestId": "6ee47ee9-55d0-470e-b5e0-7c8859ee7fbc",
        "configAggregators": "1062516667359476:ca-d1ef7086a0f4009fc283",
        "resourceGroupId": "",
        "arn": "acs:sls:global:1526528402803627:eventbridge",
        "relationship": "",
        "configurationDiff": "{"UpdateDate":["2022-05-20T14:15:14Z","2022-05-21T00:13:44Z"],"AssumeRolePolicyDocument":["{\\n    \\"Statement\\": [{\\n            \\"Action\\": \\"sts:AssumeRole\\",\\n            \\"Effect\\": \\"Allow\\",\\n            \\"Principal\\": {\\"RAM\\": [\\"acs:ram::1177528403585585:root\\"]}}],\\n    \\"Version\\": \\"1\\"}","{\\n    \\"Statement\\": [{\\n            \\"Action\\": \\"sts:AssumeRole\\",\\n            \\"Effect\\": \\"Allow\\",\\n            \\"Principal\\": {\\"RAM\\": [\\"acs:ram::1062516667359476:root\\"]}}],\\n    \\"Version\\": \\"1\\"}"]}",
        "resourceType": "ACS::RAM::Role"
    },
    "aliyunoriginalaccountid": "1526****3627",
    "specversion": "1.0",
    "aliyuneventbusname": "default",
    "id": "6ee47ee9-55d0-470e-b5e0-7c8859ee7fbc",
    "source": "acs.ram",
    "time": "2022-05-21T00:15:30Z",
    "aliyunregionid": "cn-beijing",
    "type": "ram:Config:ConfigurationItemChangeNotification"
}

8、在yf_04账号中开启函数计算服务,将事件解析并保存到RDS

在FC中配置一个触发器函数,触发规则

注意:

1、这里配置的触发器是选择哪个?

在EB那边数据,需要选择访问控制。

事件触发流程(EB官方产品手册)

函数计算代码

import pymysql
import json,logging
import os
connection = None
logger = logging.getLogger()
def initialize(context):
    global connection
    try:
        connection = pymysql.connect(
            host=os.environ['MYSQL_ENDPOING'],  # 替换为您的HOST名称。
            port=int(os.environ['MYSQL_PORT']),  # 替换为您的端口号。
            user=os.environ['MYSQL_USER'],  # 替换为您的用户名。
            passwd=os.environ['MYSQL_PASSWORD'],  # 替换为您的用户名对应的密码。
            db=os.environ['MYSQL_DBNAME'],  # 替换为您的数据库名称。
            connect_timeout=5)
        logger.info('eb job connect mysql success!!!')
    except Exception as e:
        logger.error(e)
        logger.error(
            "ERROR: Unexpected error: Could not connect to MySql instance.")
        raise Exception(str(e))

def pre_stop(context):
    logger.info("pre_stop hook start.")
    if connection != None:
        connection.close()

# 保存变更表及任务表
def save_transactional(sql, params):
    try:
        cursor=connection.cursor()#初始化游标
        cursor.execute(sql , params)
        connection.commit()
    except Exception as e:
        logger.error(e)


def handler(event, context):
    eb = json.loads(event).get("data")
    eb_action,eb_time,resource_name,req_id = eb.get("resourceEventType"),eb.get("captureTime"),eb.get("resourceName"),eb.get("requestId")
    account_id, region, config_diff, resourse_type = eb.get("accountId"),eb.get("regionId"),eb.get("configurationDiff"),eb.get("resourceType")
    logger.info(eb_action+eb_time+resource_name+req_id+account_id+region+config_diff+resourse_type)
    change_sql = "insert into event_list(req_id,type,time,resource,account,region,configdiff,resourcetype) values(%s,%s,%s,%s,%s,%s,%s,%s)"
    params = (req_id,eb_action,eb_time,resource_name,account_id, region, config_diff, resourse_type)
    save_transactional(change_sql, params)

    return 'success'

RDS里面的数据记录

图片 3

重要

函数计算配置时,访问RDS需要配置函数计算的网络选项。否则会出现网络不通。

3. 本文小结

通过以上方案,当企业有多个云账号,并且只想对特定某些资源的变更需要及时监测,那可以通过这套解决方案有效过滤。把变更的数据保存到数据库中。

相关实践学习
【玩转ComfyUI】基于函数计算一键部署AI生图平台ComfyUI
本次实验将带大家通过使用阿里云产品函数计算FC,快速使用ComfyUI实现更高质量的图像生成。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
相关文章
|
消息中间件 存储 弹性计算
云端问道13期方案教学-告别资源瓶颈,函数计算驱动多媒体文件处理
《云端问道13期方案教学》由阿里云技术团队周博宇主讲,聚焦如何使用函数计算突破资源瓶颈,高效处理多媒体文件。方案涵盖六大要点:寻找云需求解决方案、选择函数计算的原因、对比不同文件处理方式、实现多媒体文件处理、应用场景广泛性及优惠购买推荐。通过将文件处理从主应用拆分,利用函数计算的按需扩展和自动弹性特性,确保核心业务稳定,并大幅降低成本。适用于图片、视频处理等多种场景。
247 1
云端问道13期方案教学-告别资源瓶颈,函数计算驱动多媒体文件处理
|
算法 安全 Java
微服务(四)-config配置中心的配置加解密
微服务(四)-config配置中心的配置加解密
|
JavaScript Serverless 数据安全/隐私保护
函数计算产品使用问题之怎么动态设置.npmrc文件以配置私有仓库访问
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
运维 Serverless 网络安全
函数计算产品使用问题之通过仓库导入应用时无法配置域名外网访问,该如何排查
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
弹性计算 Serverless 调度
面向Workload级别的灵活可配置Serverless弹性解决方案
Serverless作为云计算的延伸,能提供按需弹性伸缩的能力,让开发者无需关心具体资源部署,优化资源使用,因而被众多云厂商采用本文将介绍四种资源可配置插件,探讨它们的核心能力、技术原理,以及在实际应用中的优劣势。
|
弹性计算 监控 关系型数据库
云端问道13期实操教学-告别资源瓶颈,函数计算驱动多媒体文件处理
《云端问道13期实操教学》介绍了使用函数计算实现多媒体文件处理的解决方案,分为五部分:方案概览、部署准备、一键部署、完成及清理和主流应用场景。通过创建VPC、ECS、RDS等资源,演示了如何利用函数计算处理PPT加水印并转PDF,解决了资源瓶颈问题。最后讲解了函数计算在部署外部应用、文件处理和音视频处理中的优势。
251 2
|
存储 弹性计算 关系型数据库
活动实践 | 告别资源瓶颈,函数计算驱动多媒体文件处理测评
本方案介绍了一种高效处理文件的方法,适用于企业办公和社交媒体应用。通过阿里云的函数计算、对象存储OSS和轻量消息队列,实现文件的异步处理,如格式转换和水印添加,有效减轻了核心应用的负担,提高了业务稳定性和资源利用率。方案包括云服务器ECS、云数据库RDS、OSS存储等组件,支持快速部署和资源清理。
|
关系型数据库 Serverless 分布式数据库
PolarDB Serverless 模式通过自动扩缩容技术,根据实际工作负载动态调整资源,提高系统灵活性与成本效益
PolarDB Serverless 模式通过自动扩缩容技术,根据实际工作负载动态调整资源,提高系统灵活性与成本效益。用户无需预配高固定资源,仅需为实际使用付费,有效应对流量突变,降低总体成本。示例代码展示了基本数据库操作,强调了合理规划、监控评估及结合其他云服务的重要性,助力企业数字化转型。
393 6
|
JavaScript
Vue3基础(19)___vite.config.js中配置路径别名
本文介绍了如何在Vue 3的Vite配置文件`vite.config.js`中设置路径别名,以及如何在页面中使用这些别名导入模块。
915 0
Vue3基础(19)___vite.config.js中配置路径别名
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
463 1

热门文章

最新文章