Prometheus 监控 CloudWatch Exporter 全栈实战:从 EC2 到 Lambda 的 AWS 服务可观测性
Prometheus 监控 CloudWatch Exporter 全栈实战从 EC2 到 Lambda 的 AWS 服务可观测性在云原生时代AWS 基础设施的体量庞大且动态多变。直接登录每台 EC2 查看 CPU、登录每个 RDS 实例分析连接数在规模化运维中无异于盲人摸象。AWS CloudWatch 汇集了这些服务的核心指标但它自成一派无法与自建 Prometheus 无缝融合。CloudWatch Exporter正是打破这堵墙的桥梁——它由 Prometheus 社区官方维护能够将 CloudWatch 上的 EC2、RDS、S3、Lambda、ELB、DynamoDB 等数十种服务的监控数据拉取并转化为 Prometheus 标准格式让你在同一套 Grafana 和 Alertmanager 体系下洞察所有 AWS 资源的脉搏。本文将带你从零配置 IAM、部署 Exporter、编写采集规则到构建大屏与告警实现多云统一可观测性。1. 为什么需要 CloudWatch Exporter传统做法CloudWatch Exporter 的优势人工登录 AWS 控制台查看所有指标入 Prometheus可统一查询、聚合、长期存储CloudWatch 告警与 Prometheus 告警分裂使用 Alertmanager 统一告警路由避免多套通知无法跨服务关联如 ELB 延迟与后端 EC2 CPU通过 PromQL 将多服务指标关联快速定位瓶颈依赖 CloudWatch 仪表盘定制能力弱结合 Grafana 强大的面板创建跨区域、跨账户的动态看板官方prometheus/cloudwatch_exporter完美支持所有 CloudWatch 指标、数学表达式、复合告警并通过 YAML 配置灵活筛选和聚合。2. 配置 AWS IAM 权限CloudWatch Exporter 需要以只读方式拉取 CloudWatch 指标以及可选的资源标签用于将 AWS 标签映射到 Prometheus 标签。创建 IAM 用户或角色附加以下托管策略CloudWatchReadOnlyAccessAmazonEC2ReadOnlyAccess如需按标签过滤 EC2或自定义最小权限{Version:2012-10-17,Statement:[{Effect:Allow,Action:[cloudwatch:GetMetricStatistics,cloudwatch:ListMetrics,cloudwatch:GetMetricData],Resource:*},{Effect:Allow,Action:[ec2:DescribeInstances,ec2:DescribeRegions,tag:GetResources],Resource:*}]}生成访问密钥Access Key ID 和 Secret Access Key并记录下区域如us-east-1。3. 部署 CloudWatch Exporter3.1 使用 Docker 运行dockerrun-d\--namecloudwatch_exporter\-p9106:9106\-v/path/to/exporter.yml:/etc/cloudwatch_exporter/exporter.yml\-eAWS_ACCESS_KEY_IDxxx\-eAWS_SECRET_ACCESS_KEYyyy\-eAWS_REGIONus-east-1\prom/cloudwatch-exporter:v0.15.03.2 二进制部署从 GitHub Releases 下载对应架构的 JAR 包需要 Java 11java-jarcloudwatch_exporter-0.15.0-jar-with-dependencies.jar9106exporter.yml3.3 配置文件exporter.yml详解这是核心文件定义了要抓取哪些 CloudWatch 指标、按什么维度聚合、多久拉取一次。---region:us-east-1period_seconds:60# CloudWatch 粒度 60 秒Exporter 每分钟拉一次set_timestamp:falsemetrics:# EC2 实例的 CPU 使用率-aws_namespace:AWS/EC2aws_metric_name:CPUUtilizationaws_dimensions:-InstanceIdaws_statistics:-Averageperiod_seconds:60range_seconds:300# 每次查询最近 5 分钟窗口delay_seconds:120# 允许 CloudWatch 2 分钟延迟# RDS 数据库连接数-aws_namespace:AWS/RDSaws_metric_name:DatabaseConnectionsaws_dimensions:-DBInstanceIdentifieraws_statistics:-Sum# S3 存储桶对象数量-aws_namespace:AWS/S3aws_metric_name:NumberOfObjectsaws_dimensions:-BucketNameaws_statistics:-Average# Lambda 调用次数-aws_namespace:AWS/Lambdaaws_metric_name:Invocationsaws_dimensions:-FunctionNameaws_statistics:-Sum# ELB (ALB) 请求数-aws_namespace:AWS/ApplicationELBaws_metric_name:RequestCountaws_dimensions:-LoadBalanceraws_statistics:-Sum# DynamoDB 读取延迟-aws_namespace:AWS/DynamoDBaws_metric_name:SuccessfulRequestLatencyaws_dimensions:-TableNameaws_statistics:-Average配置关键点period_seconds建议与 CloudWatch 存储粒度匹配通常 60 或 300。range_seconds要大于period_seconds保证每次拉取都能获得数据。delay_seconds补偿 CloudWatch 的数据聚合延迟。aws_dimensions决定了生成的 Prometheus 标签如InstanceId、DBInstanceIdentifier。如果某些服务实例多、变更频繁可开启list_metrics动态发现避免手动枚举。4. 配置 Prometheus 抓取scrape_configs:-job_name:cloudwatchscrape_interval:60s# 与 period_seconds 匹配static_configs:-targets:[cloudwatch-exporter:9106]labels:cloud:awsaccount:123456789由于 CloudWatch Exporter 已经主动拉取了 CloudWatch 数据并缓存Prometheus 只需静态抓取即可。如果有多个 AWS 账户或区域可部署多个 Exporter 实例每个负责一个账户/区域并在 Prometheus 中用不同 job 或标签区分。5. 核心监控指标与 PromQLCloudWatch Exporter 暴露的指标名为cloudwatch_namespace_metric_name_statistic标签来自aws_dimensions和 Exporter 添加的job、instance等。AWS 服务指标示例Prometheus 名称含义EC2cloudwatch_AWS_EC2_CPUUtilization_Average{instance_idi-xxx}CPU 使用率%RDScloudwatch_AWS_RDS_DatabaseConnections_Sum{db_instance_identifiermydb}数据库连接数S3cloudwatch_AWS_S3_NumberOfObjects_Average{bucket_namemybucket}存储桶对象数Lambdacloudwatch_AWS_Lambda_Invocations_Sum{function_namemy-func}函数调用次数ApplicationELBcloudwatch_AWS_ApplicationELB_RequestCount_Sum{load_balancermy-alb}请求总数DynamoDBcloudwatch_AWS_DynamoDB_SuccessfulRequestLatency_Average{table_namemytable}读取延迟PromQL 示例EC2 CPU 超过 80%cloudwatch_AWS_EC2_CPUUtilization_Average 80Lambda 错误率需同时抓取Errors指标rate(cloudwatch_AWS_Lambda_Errors_Sum[5m]) / rate(cloudwatch_AWS_Lambda_Invocations_Sum[5m])S3 存储桶大小趋势cloudwatch_AWS_S3_BucketSizeBytes_AverageALB 5xx 计数sum(cloudwatch_AWS_ApplicationELB_HTTPCode_ELB_5XX_Count_Sum) by (load_balancer)注意指标名中的AWS/会被替换为AWS_。完整指标名可在/metrics端点查看。6. Grafana 仪表盘推荐CloudWatch Exporter DashboardDashboard ID139最经典通用 AWS 指标展示 EC2 CPU、网络、磁盘RDS 连接、延迟ELB 请求等。AWS EC2 MonitoringID677专注 EC2。AWS RDSID707。AWS LambdaID14592。自定义综合看板使用变量account、region切换将关键 AWS 服务指标整合进单一大屏。导入后选择数据源确保 Prometheus 实例包含 cloudwatch 指标。7. 告警规则实战groups:-name:aws_cloudwatch_alertsrules:-alert:EC2HighCPUexpr:cloudwatch_AWS_EC2_CPUUtilization_Average85for:10mlabels:severity:warningannotations:summary:EC2 实例 {{ $labels.instance_id }} CPU 使用率超过 85%-alert:RDSHighConnectionsexpr:cloudwatch_AWS_RDS_DatabaseConnections_Sum / on(db_instance_identifier) cloudwatch_AWS_RDS_DatabaseConnections_Max0.8for:10mlabels:severity:warningannotations:summary:RDS {{ $labels.db_instance_identifier }} 连接数使用率超过 80%-alert:LambdaErrorSpikeexpr:rate(cloudwatch_AWS_Lambda_Errors_Sum[5m]) / rate(cloudwatch_AWS_Lambda_Invocations_Sum[5m])0.05for:5mlabels:severity:criticalannotations:summary:Lambda 函数 {{ $labels.function_name }} 错误率超过 5%-alert:ALB5xxHighexpr:rate(cloudwatch_AWS_ApplicationELB_HTTPCode_ELB_5XX_Count_Sum[5m])0.5for:5mlabels:severity:criticalannotations:summary:ALB {{ $labels.load_balancer }} 5xx 速率过高-alert:DynamoDBReadLatencyHighexpr:cloudwatch_AWS_DynamoDB_SuccessfulRequestLatency_Average0.1for:10mlabels:severity:warningannotations:summary:DynamoDB 表 {{ $labels.table_name }} 平均读取延迟超过 100ms可根据 CloudWatch 支持的指标自由扩展例如 RDS 的FreeStorageSpace不足、EC2 的StatusCheckFailed等。8. 进阶多账户、成本优化与动态发现8.1 多账户/多区域监控为每个 AWS 账户、每个区域部署独立的 CloudWatch Exporter 实例容器并在 Prometheus 中通过account、region标签区分。可以使用 IAM 角色跨账户信任或 STS 临时凭证来实现安全访问。8.2 降低 CloudWatch API 成本CloudWatch 的GetMetricDataAPI 按请求次数和数据点数量收费。优化策略适当增加period_seconds如 300 秒降低抓取频率。使用list_metrics只请求确实存在的维度避免通配。合理设置range_seconds避免每次拉取时间窗口过大。对于不需要实时告警的指标如 S3 存储大小可拉取间隔设置为 1 小时。8.3 标签注入Exporter 支持通过aws_tag_select动态注入 AWS 资源标签到 Prometheus 标签中例如将 EC2 的Name标签注入使告警更易读metrics:-aws_namespace:AWS/EC2aws_metric_name:CPUUtilizationaws_dimensions:-InstanceIdaws_statistics:-Averageaws_tag_select:resource_type_selection:ec2:instanceresource_id_template:arn:aws:ec2:${aws:region}:${aws:account}:instance/${dimension[InstanceId]}tags:-Name这样指标会带有Name标签对应实例的 Name 标签值。8.4 与 Node Exporter / cAdvisor 结合CloudWatch 给出的是虚拟化层级的指标如 EC2 的 CPU而 Node Exporter 给出操作系统内部视角如node_cpu_seconds_total。二者可以互补验证发现“云平台声称 CPU 70%但操作系统看空闲 90%”等异常。9. 总结CloudWatch Exporter 打通了 AWS 封闭的监控数据与 Prometheus 开放生态的最后一公里。现在你可以用同样的 PromQL、同样的 Grafana 面板、同样的 Alertmanager 告警监控从 EC2、RDS、S3 到 Lambda 的所有 AWS 资源。结合之前落地的自建服务监控混合云、多云可观测性已然闭环。部署它让云上的每个资源都像机房里亲手搭建的服务器一样透明、可控。