基于CloudWatch统一跨账户可观测性的Grafana多账户监控设计文档
1. 概述
1.1 背景
在AWS Landing Zone多账户环境中,为了实现统一、高效的监控,我们将采用CloudWatch的统一跨账户可观测性功能。此功能通过创建一个监控账户和多个源账户,实现将所有源账户的日志、指标和追踪数据自动聚合到监控账户,无需复杂的手动配置。Grafana部署在独立的账户中,仅需要访问监控账户即可获取全局视图。
1.2 目标
- 自动化聚合: 利用统一跨账户功能,自动将所有成员账户的监控数据汇聚到监控账户
- 集中化管理: 在监控账户统一配置告警、仪表盘等
- 权限最小化: 严格遵循最小权限原则,各账户权限边界清晰
- 无缝集成: Grafana通过访问监控账户,实现对所有账户数据的统一查询和展示
2. 架构设计
2.1 整体架构图
2.2 核心组件说明
- 源账户: 需要被监控的业务账户
- 监控账户: 监控中枢。通过统一跨账户可观测性功能,自动聚合所有源账户的数据
- Grafana账户: 独立的展示层
OAMRoleForSourceAccount: 在每个源账户中创建的角色,由AWS管理或根据官方模板创建,授权监控账户的CloudWatch服务访问其数据CloudWatchReadOnlyRole: 在监控账户中创建的角色,授权Grafana账户读取其CloudWatch数据GrafanaPodRole: 在Grafana账户中,通过IRSA与Grafana Pod关联的角色,唯一权限是扮演监控账户的CloudWatchReadOnlyRole
2.3 认证与数据流
-
数据聚合 (自动化):
- 在监控账户中启用统一跨账户可观测性
- 将源账户添加到监控配置中。监控账户的CloudWatch服务会自动扮演源账户的
OAMRoleForSourceAccount来拉取数据 - 所有源账户的日志、指标、追踪数据自动在监控账户中可用,如同它们是本地数据一样
-
数据访问:
- Grafana Pod通过IRSA获得
GrafanaPodRole的临时凭证 - Grafana Pod使用此凭证扮演监控账户的
CloudWatchReadOnlyRole - Grafana Pod使用
CloudWatchReadOnlyRole的凭证,直接查询监控账户中已经聚合好的CloudWatch数据
- Grafana Pod通过IRSA获得
-
数据展示:
- Grafana从监控账户获取数据后,通过Dashboard进行统一展示
- 在Grafana中查询时,可以通过
AccountId维度来筛选和区分不同源账户的数据
3. 实施方案
3.1 步骤一:配置源账户
在每个需要被监控的源账户中执行以下操作:
-
创建IAM角色 (
OAMRoleForSourceAccount):-
信任关系: 必须信任
monitoring.amazonaws.com服务{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "monitoring.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } -
权限策略: 附加
CloudWatchReadOnlyAccess和AWSOAMFullAccess(或根据官方文档细化权限) -
角色名: 强烈建议使用官方文档中的标准名称
OAMRoleForSourceAccount
-
3.2 步骤二:配置监控账户
-
启用统一跨账户可观测性:
- 登录监控账户,进入CloudWatch控制台
- 导航到 Settings -> Unified cross-account observability
- 点击 "Set up" 或 "Add source account"
- 填入源账户的ID和之前创建的角色名
OAMRoleForSourceAccount - 重复此步骤,将所有源账户都添加进来。配置完成后,数据会自动开始聚合
-
创建IAM角色 (
CloudWatchReadOnlyRole):- 信任实体: 选择"AWS账户",填入Grafana账户的ID
- 权限策略: 附加
CloudWatchReadOnlyAccess。因为Grafana只需读取监控账户中已聚合的数据 - 角色名: 例如
CloudWatchReadOnlyRole,并记录其ARN
3.3 步骤三:配置Grafana账户
-
为EKS集群创建OIDC身份提供商 (如果尚未创建)
-
创建IAM策略文件
grafana-assume-monitor-policy.json:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::<监控账户ID>:role/CloudWatchReadOnlyRole" } ] } -
基于策略文件创建IAM策略
-
使用
eksctl创建IAM Role和Service Account,并附加上一步的策略 -
部署Grafana并指定Service Account
3.4 步骤四:在Grafana UI中配置数据源
-
登录Grafana,添加
Amazon CloudWatch数据源 -
按如下方式配置:
- Authentication Provider:
AWS SDK Default - Assume Role: 勾选
- ARN:
arn:aws:iam::<监控账户ID>:role/CloudWatchReadOnlyRole - Region: 监控账户所在的区域
- Authentication Provider:
-
点击
Save & Test关键区别: 在Grafana中创建Dashboard时,你可以使用
AWSAccountId作为标签或维度来区分来自不同源账户的数据,例如在查询语句中加入filter(AWSAccountId='123456789012')
4. 优势与总结
采用统一跨账户可观测性后的优势更加突出:
- 真正的自动化: 无需在每个源账户手动配置CloudWatch目的地,监控账户"拉取"数据,配置工作量大幅降低
- 无缝的数据聚合: 在监控账户看到的不是数据链接,而是真实聚合的数据,查询体验如同本地数据一样流畅
- 更广泛的覆盖: 该功能不仅聚合指标,还包括日志和追踪,为构建全方位的可观测性平台打下基础
- 更优的架构: 监控账户成为唯一的可信数据源,Grafana和下游工具的配置变得极其简单和标准化
5. 企业级最佳实践
5.1 安全加固建议
- 启用CloudTrail审计所有跨账户访问活动
- 使用AWS Config监控IAM角色配置变更
5.2 性能优化建议
- 合理设置CloudWatch指标保留周期
- 对高频查询的指标建立索引
- 使用CloudWatch Logs Insights优化日志查询性能
5.3 运维管理建议
- 建立自动化脚本批量管理多个源账户配置
- 设置监控数据质量检查机制
- 定期审查和清理无用的监控数据

浙公网安备 33010602011771号