基于CloudWatch统一跨账户可观测性的Grafana多账户监控设计文档

1. 概述

1.1 背景

在AWS Landing Zone多账户环境中,为了实现统一、高效的监控,我们将采用CloudWatch的统一跨账户可观测性功能。此功能通过创建一个监控账户和多个源账户,实现将所有源账户的日志、指标和追踪数据自动聚合到监控账户,无需复杂的手动配置。Grafana部署在独立的账户中,仅需要访问监控账户即可获取全局视图。

1.2 目标

  • 自动化聚合: 利用统一跨账户功能,自动将所有成员账户的监控数据汇聚到监控账户
  • 集中化管理: 在监控账户统一配置告警、仪表盘等
  • 权限最小化: 严格遵循最小权限原则,各账户权限边界清晰
  • 无缝集成: Grafana通过访问监控账户,实现对所有账户数据的统一查询和展示

2. 架构设计

2.1 整体架构图

graph TD subgraph "AWS Landing Zone Environment" direction LR subgraph Source_Accounts ["源账户 (Workload Accounts)"] direction TB SA1["源账户 1<br/>e.g., 开发环境"] SA2["源账户 2<br/>e.g., 生产环境"] SA3["源账户 N<br/>其他业务账户"] subgraph IAM_SA1 ["源账户 IAM 配置"] Role_Source["Role: OAMRoleForSourceAccount<br/>授予监控账户只读权限"] end SA1 -.->|"托管资源"| IAM_SA1 end subgraph Monitor_Account ["监控账户 (Monitor Account)"] direction TB CW_Service["CloudWatch 服务"] subgraph OAM_Component ["OAM 组件<br/>统一跨账户可观测性"] OAM_Sink["OAM Sink<br/>监控数据聚合点"] end subgraph IAM_Monitor ["监控账户 IAM 配置"] Role_Monitor["Role: CloudWatchReadOnlyRole<br/>只读访问 CloudWatch 数据"] end CW_Service --> OAM_Sink OAM_Sink --> Role_Monitor end subgraph Grafana_Account ["日志中心账户 (LogCenter Account)"] direction TB subgraph EKS_Environment ["EKS 环境"] Grafana_Pod["Grafana Pod<br/>监控数据展示"] end subgraph IAM_Grafana ["Grafana 账户 IAM 配置"] Role_IRSA["Role: GrafanaPodRole<br/>(通过 IRSA)"] Role_Assumed["Role: AssumedMonitorRole<br/>临时假设的角色"] end Grafana_Pod --> Role_IRSA Role_IRSA --> Role_Assumed end end %% 跨账户权限链接 Role_Source -- "1. 信任关系<br/>允许监控账户假设" --> Role_Monitor Role_Monitor -- "2. 自动聚合<br/>源账户监控数据" --> OAM_Sink Role_IRSA -- "3. Assume Role<br/>获取临时凭证" --> Role_Monitor Role_Assumed -- "4. 授权访问<br/>CloudWatch 数据" --> Grafana_Pod Grafana_Pod -- "5. 查询数据<br/>统一监控视图" --> OAM_Sink %% 样式定义 classDef sourceAccountStyle fill:#e1f5fe,stroke:#01579b,stroke-width:2px,color:#000 classDef monitorAccountStyle fill:#f3e5f5,stroke:#4a148c,stroke-width:2px,color:#000 classDef grafanaAccountStyle fill:#e8f5e8,stroke:#1b5e20,stroke-width:2px,color:#000 classDef iamStyle fill:#fff3e0,stroke:#e65100,stroke-width:2px,color:#000 classDef componentStyle fill:#fce4ec,stroke:#880e4f,stroke-width:2px,color:#000 class SA1,SA2,SA3 sourceAccountStyle class Monitor_Account monitorAccountStyle class Grafana_Account grafanaAccountStyle class IAM_SA1,IAM_Monitor,IAM_Grafana iamStyle class OAM_Component,Role_Source,Role_Monitor,Role_IRSA,Role_Assumed componentStyle

2.2 核心组件说明

  • 源账户: 需要被监控的业务账户
  • 监控账户: 监控中枢。通过统一跨账户可观测性功能,自动聚合所有源账户的数据
  • Grafana账户: 独立的展示层
  • OAMRoleForSourceAccount: 在每个源账户中创建的角色,由AWS管理或根据官方模板创建,授权监控账户的CloudWatch服务访问其数据
  • CloudWatchReadOnlyRole: 在监控账户中创建的角色,授权Grafana账户读取其CloudWatch数据
  • GrafanaPodRole: 在Grafana账户中,通过IRSA与Grafana Pod关联的角色,唯一权限是扮演监控账户的CloudWatchReadOnlyRole

2.3 认证与数据流

  1. 数据聚合 (自动化):

    • 在监控账户中启用统一跨账户可观测性
    • 将源账户添加到监控配置中。监控账户的CloudWatch服务会自动扮演源账户的OAMRoleForSourceAccount来拉取数据
    • 所有源账户的日志、指标、追踪数据自动在监控账户中可用,如同它们是本地数据一样
  2. 数据访问:

    • Grafana Pod通过IRSA获得GrafanaPodRole的临时凭证
    • Grafana Pod使用此凭证扮演监控账户的CloudWatchReadOnlyRole
    • Grafana Pod使用CloudWatchReadOnlyRole的凭证,直接查询监控账户中已经聚合好的CloudWatch数据
  3. 数据展示:

    • Grafana从监控账户获取数据后,通过Dashboard进行统一展示
    • 在Grafana中查询时,可以通过AccountId维度来筛选和区分不同源账户的数据

3. 实施方案

3.1 步骤一:配置源账户

在每个需要被监控的源账户中执行以下操作:

  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 步骤二:配置监控账户

  1. 启用统一跨账户可观测性:

    • 登录监控账户,进入CloudWatch控制台
    • 导航到 Settings -> Unified cross-account observability
    • 点击 "Set up" 或 "Add source account"
    • 填入源账户的ID和之前创建的角色名 OAMRoleForSourceAccount
    • 重复此步骤,将所有源账户都添加进来。配置完成后,数据会自动开始聚合
  2. 创建IAM角色 (CloudWatchReadOnlyRole):

    • 信任实体: 选择"AWS账户",填入Grafana账户的ID
    • 权限策略: 附加CloudWatchReadOnlyAccess。因为Grafana只需读取监控账户中已聚合的数据
    • 角色名: 例如 CloudWatchReadOnlyRole,并记录其ARN

3.3 步骤三:配置Grafana账户

  1. 为EKS集群创建OIDC身份提供商 (如果尚未创建)

  2. 创建IAM策略文件 grafana-assume-monitor-policy.json:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "sts:AssumeRole",
                "Resource": "arn:aws:iam::<监控账户ID>:role/CloudWatchReadOnlyRole"
            }
        ]
    }
    
  3. 基于策略文件创建IAM策略

  4. 使用eksctl创建IAM Role和Service Account,并附加上一步的策略

  5. 部署Grafana并指定Service Account

3.4 步骤四:在Grafana UI中配置数据源

  1. 登录Grafana,添加 Amazon CloudWatch 数据源

  2. 按如下方式配置:

    • Authentication Provider: AWS SDK Default
    • Assume Role: 勾选
    • ARN: arn:aws:iam::<监控账户ID>:role/CloudWatchReadOnlyRole
    • Region: 监控账户所在的区域
  3. 点击 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 运维管理建议

  • 建立自动化脚本批量管理多个源账户配置
  • 设置监控数据质量检查机制
  • 定期审查和清理无用的监控数据
posted @ 2026-05-28 11:43  Donaver  阅读(7)  评论(0)    收藏  举报